Sari la conținutul principal

Docker Compose și networking

Până acum am rulat API-ul singur, cu stocare în memorie. În continuare folosim Docker Compose pentru a porni aplicația împreună cu PostgreSQL.

Configurația existentă​

Fișierul docker-compose.yml din repository este:

services:
api:
build: .
ports:
- "${PORT:-8080}:8080"
environment:
USE_POSTGRES: ${USE_POSTGRES:-true}
DATABASE_URL: postgres://${POSTGRES_USER:-tickets}:${POSTGRES_PASSWORD:-tickets}@db:5432/${POSTGRES_DB:-tickets}?sslmode=disable
depends_on:
db:
condition: service_healthy
restart: unless-stopped

db:
image: postgres:16-alpine
environment:
POSTGRES_USER: ${POSTGRES_USER:-tickets}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-tickets}
POSTGRES_DB: ${POSTGRES_DB:-tickets}
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 3s
retries: 10
restart: unless-stopped

volumes:
pgdata:

Ce descrie fișierul?​

  • api este construit din Dockerfile și publică portul 8080 pe gazdă
  • db folosește imaginea PostgreSQL și nu își publică portul pe gazdă
  • API-ul se conectează la host-ul db, adică numele serviciului din Compose
  • healthcheck verifică disponibilitatea bazei de date
  • depends_on amână pornirea API-ului până când baza de date este sănătoasă
  • volumul pgdata păstrează datele PostgreSQL în afara containerului

Valorile din ${NUME:-implicit} pot fi suprascrise prin variabile de mediu sau printr-un fișier local .env. Fișierul .env este ignorat de Git și nu trebuie adăugat în imagine.

warning

Valorile implicite sunt potrivite doar pentru laborator. Parolele reale nu se includ în repository și nu se tratează ca simple variabile publice de configurare.

Validarea configurației​

docker compose config

Comanda rezolvă variabilele și afișează configurația efectivă. Citiți output-ul înainte de pornire; acesta poate conține valori sensibile provenite din mediul local.

Pornirea serviciilor​

docker compose up --build --detach
docker compose ps
docker compose logs api
docker compose logs db

Verificați aplicația:

curl -sS http://localhost:8080/health
curl -sS http://localhost:8080/tickets

Rețeaua implicită​

Compose creează în mod implicit o rețea pentru proiect și conectează ambele servicii la ea. Containerele se descoperă prin numele serviciului, astfel încât db din DATABASE_URL este rezolvat prin DNS-ul rețelei Docker.

Listați și inspectați rețeaua:

docker network ls
docker network inspect lab1_default

Dacă directorul repository-ului sau numele proiectului a fost schimbat, rețeaua va avea alt prefix. Identificați rețeaua creată de Compose în output-ul primei comenzi.

Puteți demonstra rezolvarea numelui api folosind un container temporar conectat la aceeași rețea:

docker run --rm --network lab1_default alpine:3.24 \
wget -qO- http://api:8080/health

Portul bazei de date nu trebuie publicat pe gazdă pentru ca API-ul să îl acceseze: traficul are loc în rețeaua internă a proiectului.

Diferența față de rularea in-memory​

Setarea USE_POSTGRES=false nu oprește automat serviciul db din fișierul Compose. Pentru demonstrația cu un singur container am folosit intenționat docker run. Pentru configurația multi-container folosim docker compose cu PostgreSQL.

Checkpoint​

  • Compose descrie și pornește mai multe servicii împreună
  • fiecare serviciu este accesibil prin numele său în rețeaua proiectului
  • doar API-ul are nevoie de port publicat pe gazdă
  • healthcheck-ul bazei de date controlează ordinea de pornire