Skip to content
VDS · Docker і контейнери

Docker Compose: кілька сервісів однією командою

Як описати зв'язку застосунку, бази даних і вебсервера в одному файлі, підняти її однією командою та оновлювати без ручного перезбирання.

Оновлено 23 серпня 2026 р.

Можна запустити один сервіс довгою командою docker run. Два сервіси, які мають бачити одне одного, — так уже не працює: завтра ви забудете параметри. Compose переносить весь опис у файл, який можна читати, редагувати й тримати в репозиторії.

Мінімальний приклад

Каталог /opt/myapp, у ньому compose.yaml:

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:

Поруч — файл .env:

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

Що тут важливо

  • Імена замість адрес. Застосунок звертається до бази за іменем db — Compose створює спільну мережу, де імена сервісів розпізнаються автоматично. Публікувати порт бази назовні не потрібно, і не варто.
  • restart: unless-stopped. Без цього після перезавантаження машини нічого не підніметься.
  • depends_on з перевіркою стану. Звичайний depends_on чекає лише на запуск контейнера, а не на готовність бази приймати з'єднання. Застосунок стартує раніше й падає.
  • Точні версії образів. postgres:17, а не postgres:latest. З latest наступний pull колись принесе мажорну версію, яка не відкриє старі дані.
  • Публікація на 127.0.0.1. Відкривайте порт назовні лише через вебсервер із сертифікатом.

Щоденні команди

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 — найкращий спосіб перевірити файл перед запуском: він покаже, у що розгорнулися змінні й чи не загубився десь відступ.

docker compose down -v видаляє томи разом із базою. Це незворотно. Перед будь-якою операцією з -v переконайтеся, що маєте копію — див. резервні копії.

Файли середовища

Зручно розділяти той самий стек для тестування й продакшену за допомогою overlay-файлів:

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

Другий файл перевизначає лише відмінності: ліміти пам'яті, опубліковані порти та рівень логування.

Типові помилки

  • Секрети в compose.yaml, який зберігається в репозиторії. Тримайте їх у .env з правами 600 і не комітьте його.
  • Змішування docker-compose і docker compose. Стара версія v1 не розуміє частини синтаксису й зберігає проєкти під іншими іменами. Встановіть плагін — див. встановлення Docker.
  • Дані в контейнері замість тому. Після docker compose down вони зникнуть. Див. томи.
  • Відсутність лімітів пам'яті. Один сервіс з'їдає всю пам'ять машини, і ядро вбиває його сусідів. Див. ліміти ресурсів.