compose.yaml în Docker

Docker Compose Compose Spec

Fișierul declarativ în care descrii serviciile, rețelele și volumele unei aplicații multi-container.

Sintaxă comandă
services:
  nume_serviciu:
    image: ... | build: ...
volumes:
networks:

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 un healthcheck, Compose așteaptă doar ca procesul containerului să pornească.
  • Includerea liniei version: "3.8" la începutul fișierului, care generează avertismentul the 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.