Docker Compose — запуск многоконтейнерных приложений

Docker Compose — инструмент для запуска многоконтейнерных приложений. Один файл docker-compose.yml заменяет несколько длинных docker run команд. Всё приложение поднимается одной командой.

Вся рубрика Docker: уроки, команды и практические сценарии

Зачем нужен Docker Compose

Без Compose — запуск приложения (app + db + nginx) выглядит так:

docker network create mynet
docker volume create pgdata

docker run -d \
  --name db \
  --network mynet \
  -v pgdata:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=secret \
  postgres:16

docker run -d \
  --name app \
  --network mynet \
  -p 5000:5000 \
  myapp:latest

docker run -d \
  --name nginx \
  --network mynet \
  -p 80:80 \
  nginx

С Compose — одна команда:

docker compose up -d

Установка Docker Compose

# Docker Desktop (Windows/Mac) — Compose уже включён
docker compose version

# Linux — установить как плагин
sudo apt install docker-compose-plugin

# Проверить
docker compose version
# Docker Compose version v2.27.0

# Старый docker-compose (v1) — устаревший, не рекомендуется
# Новый: docker compose (через пробел, встроен в Docker CLI)

Основные команды

# Запустить все сервисы
docker compose up

# В фоне (detached)
docker compose up -d

# Пересобрать образы и запустить
docker compose up -d --build

# Остановить контейнеры (не удалять)
docker compose stop

# Остановить и удалить контейнеры + сети
docker compose down

# Остановить, удалить контейнеры, сети И volumes
docker compose down -v

# Статус сервисов
docker compose ps

# Логи всех сервисов
docker compose logs
docker compose logs -f           # следить

# Логи конкретного сервиса
docker compose logs -f app

# Выполнить команду в сервисе
docker compose exec app bash
docker compose exec db psql -U postgres

# Перезапустить один сервис
docker compose restart app

# Собрать образы без запуска
docker compose build
docker compose build app         # только один сервис

Полный цикл работы

# 1. Запустить
docker compose up -d

# 2. Проверить статус
docker compose ps
# NAME      IMAGE     COMMAND   SERVICE   STATUS    PORTS
# app       myapp     ...       app       running   0.0.0.0:5000->5000/tcp
# db        postgres  ...       db        running   5432/tcp
# nginx     nginx     ...       nginx     running   0.0.0.0:80->80/tcp

# 3. Логи
docker compose logs -f

# 4. Войти в контейнер
docker compose exec app bash

# 5. Обновить код и пересобрать
docker compose up -d --build app

# 6. Остановить (данные в volumes сохраняются)
docker compose down

# 7. Остановить и удалить всё включая данные
docker compose down -v

Переменные окружения через .env

# .env файл (автоматически подхватывается docker compose)
POSTGRES_PASSWORD=mysecretpassword
APP_PORT=5000
DB_NAME=myapp
# docker-compose.yml
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${DB_NAME}

  app:
    image: myapp
    ports:
      - "${APP_PORT}:5000"

Масштабирование сервисов

# Запустить 3 экземпляра сервиса app
docker compose up -d --scale app=3

# Проверить
docker compose ps
# app-1, app-2, app-3 — все запущены

# Уменьшить до 1
docker compose up -d --scale app=1

docker run vs docker compose

docker rundocker compose
Один контейнер✅ УдобноИзбыточно
Несколько контейнеровМного команд✅ Один файл
ВерсионированиеКоманды в скрипте✅ YAML файл в git
Переменные окружения-e флаги✅ .env файл
ВоспроизводимостьСложнее✅ Легко
Для разработкиОк для одного✅ Идеально

Часто задаваемые вопросы

docker compose up vs docker compose start — в чём разница?

docker compose up — создаёт контейнеры (если их нет) и запускает их. Если образ изменился — пересоздаёт. docker compose start — запускает уже существующие остановленные контейнеры. Аналогично разнице между docker run и docker start. Для первого запуска — всегда up. Для возобновления после docker compose stop — можно start.

Как обновить образы в docker compose?

Три шага: 1) docker compose pull — скачать новые версии образов. 2) docker compose up -d — пересоздать контейнеры с новыми образами. Compose автоматически пересоздаст только те контейнеры, образ которых изменился. Для собственных образов: docker compose up -d --build — пересобрать и перезапустить.

docker compose down удаляет данные?

docker compose down — удаляет контейнеры и сети, но не удаляет volumes. Данные в named volumes (базы данных) сохраняются. docker compose down -v — удаляет всё включая volumes. Будь осторожен с флагом -v в продакшне — это удалит данные баз данных.

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x