Ce face compose.yaml
În loc să pornești manual fiecare container cu comenzi docker run lungi de trei rânduri, descrii întreaga arhitectură a aplicației (server web, API, bază de date, Redis, worker) într-un singur fișier YAML versionat în Git. Conform specificației actuale Compose Specification, numele recomandat al fișierului este compose.yaml (dar docker-compose.yml rămâne pe deplin suportat).
În Compose v2 câmpul version: '3.8' de la începutul fișierului este învechit (obsolete) și nu mai trebuie scris — dacă îl lași, Docker afișează un avertisment.
Fiecare cheie din services: devine atât numele serviciului în comenzile docker compose, cât și numele DNS prin care celelalte servicii se pot conecta la el (de exemplu, aplicația se conectează la baza de date la gazda db și portul intern 5432).
Opțiuni și argumente
| Opțiune / Parametru | Descriere |
|---|---|
image / build |
Imaginea din registry (image: postgres:16) sau calea către Dockerfile (build: . ori build: { context: ., dockerfile: Dockerfile }). |
ports |
Lista de porturi publicate pe gazdă, de ex. "8080:80" sau "127.0.0.1:5432:5432" (pune-le mereu între ghilimele în YAML!). |
environment / env_file |
Variabile de mediu date direct în fișier sau încărcate dintr-un fișier .env. |
volumes |
Montări de tip bind mount (./src:/app/src) sau volume cu nume declarate și în secțiunea globală volumes: de la baza fișierului. |
depends_on |
Ordinea de pornire; cu condition: service_healthy așteaptă ca baza de date să fie cu adevărat gata de conexiuni. |
restart / healthcheck |
Politica de repornire (unless-stopped) și comanda care verifică periodic sănătatea serviciului. |
Exemple
Exemplul 1: Fișier compose.yaml complet: API Node.js + PostgreSQL cu healthcheck
Serviciul api pornește abia după ce PostgreSQL răspunde la pg_isready și i se conectează prin numele de gazdă db.
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: ${DB_PASSWORD:-secretlocal}
POSTGRES_DB: magazin
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d magazin"]
interval: 5s
timeout: 3s
retries: 5
api:
build: .
restart: unless-stopped
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://app:${DB_PASSWORD:-secretlocal}@db:5432/magazin
depends_on:
db:
condition: service_healthy
volumes:
pgdata:
Greșeli frecvente
- Scrierea porturilor fără ghilimele în YAML (de ex.
- 60:60): parserul YAML poate interpreta perechile cu numere sub 60 ca minute:secunde (baza 60). Pune mereu ghilimele:"8080:80". - Folosirea simplă a lui
depends_on: [db]crezând că așteaptă ca baza de date să accepte conexiuni: fărăcondition: service_healthyși unhealthcheck, Compose așteaptă doar ca procesul containerului să pornească. - Includerea liniei
version: "3.8"la începutul fișierului, care generează avertismentulthe attribute `version` is obsolete.
Comenzi înrudite
docker compose up: Construiește imaginile, creează rețeaua și volumele și pornește toate serviciile din compose.yaml.docker compose down: Oprește și șterge containerele și rețeaua create de docker compose up.docker compose logs / ps / exec: Inspectează starea serviciilor, urmărește jurnalele și execută comenzi folosind numele serviciului din compose.yaml.docker network: Gestionează rețelele virtuale prin care containerele comunică între ele și cu exteriorul.