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?
apieste construit dinDockerfileși publică portul 8080 pe gazdădbfolosește imaginea PostgreSQL și nu își publică portul pe gazdă- API-ul se conectează la host-ul
db, adică numele serviciului din Compose healthcheckverifică disponibilitatea bazei de datedepends_onamână pornirea API-ului până când baza de date este sănătoasă- volumul
pgdatapă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.
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