Skip to content
VDS · Docker i kontejneri

Docker Compose: više servisa jednom komandom

Kako da opišeš paket aplikacije, baze podataka i veb servera u jednoj datoteci, pokreneš ga jednom komandom i ažuriraš bez ručnog ponovnog buildovanja.

Ažurirano 23. avgust 2026.

Jedan servis možeš da pokreneš jednom dugom docker run komandom. Dva servisa koja treba da vide jedan drugog — to više ne funkcioniše: sutradan ćeš zaboraviti parametre. Compose prebacuje ceo opis u fajl koji možeš da čitaš, menjaš i držiš u repozitorijumu.

Minimalni primer

Direktorijum /opt/myapp, sa compose.yaml u njemu:

services:
  db:
    image: postgres:17
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: app
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      retries: 5

  app:
    image: ghcr.io/example/app:1.4.2
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment:
      DATABASE_URL: postgres://postgres:${DB_PASSWORD}@db:5432/app
    ports:
      - "127.0.0.1:8080:8080"

volumes:
  db-data:

Pored njega, fajl .env:

DB_PASSWORD=long-random-password
chmod 600 .env
docker compose up -d
docker compose ps
docker compose logs -f app

Šta je ovde važno

  • Imena umesto adresa. Aplikacija pristupa bazi po imenu db — Compose pravi zajedničku mrežu u kojoj se imena servisa automatski razrešavaju. Port baze ne moraš da objavljuješ spolja, i ne treba.
  • restart: unless-stopped. Bez toga se ništa neće vratiti nakon restarta mašine.
  • depends_on sa health check-om. Običan depends_on čeka samo da se kontejner pokrene, ne i da baza bude spremna da prihvati konekcije. Aplikacija se pokrene prerano i padne.
  • Tačne verzije slika. postgres:17, ne postgres:latest. Sa latest će sledeći pull jednog dana doneti glavnu verziju koja neće otvoriti stare podatke.
  • Objavljivanje na 127.0.0.1. Port izlažeš spolja samo kroz web server sa sertifikatom.

Svakodnevne komande

docker compose up -d          # bring up or apply changes
docker compose down           # stop and remove containers (volumes intact)
docker compose down -v        # ...and remove volumes too
docker compose restart app    # restart one service
docker compose exec app sh    # go inside
docker compose pull && docker compose up -d   # update images
docker compose config         # show final file with substitutions

docker compose config je najbolji način da proveriš fajl pre pokretanja: pokazaće na šta su se promenljive razvile i da li je neko uvlačenje izgubljeno.

docker compose down -v briše volumene zajedno sa bazom. To je nepovratno. Pre svake operacije sa -v proveri da imaš kopiju — vidi bekape.

Fajlovi okruženja

Zgodno je da isti stack za testiranje i produkciju razdvojiš overlay fajlovima:

docker compose -f compose.yaml -f compose.prod.yaml up -d

Drugi fajl menja samo razlike: ograničenja memorije, objavljene portove i nivo logovanja.

Česte greške

  • Tajne u compose.yaml koji se čuva u repozitorijumu. Drži ih u .env sa dozvolama 600 i ne komituj ga.
  • Mešanje docker-compose i docker compose. Stara v1 verzija ne razume neku sintaksu i čuva projekte pod drugim imenima. Instaliraj plugin — vidi instalaciju Docker-a.
  • Podaci u kontejneru umesto u volumenu. Nakon docker compose down nestaju. Vidi volumene.
  • Bez ograničenja memorije. Jedan servis pojede svu memoriju mašine, a kernel ubije njegove susede. Vidi ograničenja resursa.