Базовая работа с Docker Compose

Практическое введение в Docker Compose: структура compose.yaml, запуск, остановка, просмотр состояния, логов и обновление контейнеров.

Docker Compose позволяет описывать контейнеры, сети, тома и параметры запуска в одном файле compose.yaml. Это удобнее, чем запускать каждый контейнер отдельной длинной командой docker run.

В этой инструкции рассматриваются только базовые операции Docker Compose: создание проекта, запуск, проверка, просмотр логов, остановка и обновление.

Проверено на: Docker Engine 29.x, Docker Compose Plugin 5.x
Уровень сложности: начальный
Время выполнения: около 15 минут
Требуемый доступ: пользователь с доступом к Docker

Что будет настроено

В результате будет создан простой Compose-проект с веб-сервером Nginx.

Будут рассмотрены:

  • структура файла compose.yaml;
  • запуск контейнера;
  • просмотр состояния;
  • просмотр логов;
  • остановка и удаление контейнера;
  • обновление образа;
  • проверка итоговой конфигурации.

Проверка Docker Compose

Проверьте установленную версию:

docker compose version

Если команда работает, Compose Plugin уже установлен.

Проверьте Docker Engine:

docker version

Создание каталога проекта

Создайте отдельный каталог:

mkdir -p ~/compose-example
cd ~/compose-example

Каждый Compose-проект рекомендуется хранить в отдельном каталоге.

Создание compose.yaml

Создайте файл:

cat >compose.yaml <<'EOF'
services:
  web:
    image: nginx:alpine
    container_name: compose-example-web
    restart: unless-stopped
    ports:
      - "8080:80"
EOF

Проверьте содержимое:

cat compose.yaml

Структура файла

Основной блок:

services:

содержит список сервисов проекта.

В примере определён сервис:

web:

Используемый образ:

image: nginx:alpine

Имя контейнера:

container_name: compose-example-web

Политика перезапуска:

restart: unless-stopped

Публикация порта:

ports:
  - "8080:80"

Это означает:

порт 8080 на сервере → порт 80 внутри контейнера

Проверка конфигурации

Перед запуском проверьте файл:

docker compose config

Для проверки без вывода полной конфигурации:

docker compose config --quiet

Если ошибок нет, команда завершится без вывода.

Загрузка образа

Загрузите образ:

docker compose pull

Проверьте локальные образы:

docker images

Запуск проекта

Запустите контейнер в фоновом режиме:

docker compose up -d

Параметр -d означает запуск в фоне.

Проверьте состояние:

docker compose ps

Ожидается состояние:

Up

Проверка веб-сервера

Проверьте ответ локально:

curl -I http://127.0.0.1:8080

Ожидаемый код:

HTTP/1.1 200 OK

Если порт доступен извне и разрешён firewall, страницу можно открыть:

http://SERVER_IP:8080

Просмотр логов

Последние сообщения:

docker compose logs

Последние 50 строк:

docker compose logs --tail=50

Логи конкретного сервиса:

docker compose logs web

Наблюдение в реальном времени:

docker compose logs -f web

Остановить просмотр:

Ctrl+C

Это не останавливает контейнер.

Просмотр контейнеров проекта

docker compose ps

Все контейнеры Docker:

docker ps -a

Информация о конкретном контейнере:

docker inspect compose-example-web

Выполнение команды внутри контейнера

Проверьте версию Nginx:

docker compose exec web nginx -v

Откройте shell:

docker compose exec web sh

Для выхода:

exit

Перезапуск сервиса

docker compose restart web

Проверка:

docker compose ps

Остановка проекта

Остановить контейнеры без удаления:

docker compose stop

Запустить снова:

docker compose start

Остановка и удаление контейнеров

docker compose down

Команда удаляет:

  • контейнеры проекта;
  • созданную Compose-сеть.

Образы при этом остаются на сервере.

Обновление контейнера

Загрузите новую версию образа:

docker compose pull

Пересоздайте сервис:

docker compose up -d

Проверьте:

docker compose ps

Если необходимо гарантированно пересоздать контейнер:

docker compose up -d --force-recreate

Изменение порта

Измените в compose.yaml:

ports:
  - "8081:80"

Примените:

docker compose up -d

Проверьте:

curl -I http://127.0.0.1:8081

Старый порт перестанет использоваться после пересоздания контейнера.

Переменные окружения

Создайте файл .env:

cat >.env <<'EOF'
WEB_PORT=8080
EOF

Измените compose.yaml:

services:
  web:
    image: nginx:alpine
    container_name: compose-example-web
    restart: unless-stopped
    ports:
      - "${WEB_PORT}:80"

Проверьте итоговую конфигурацию:

docker compose config

Переменные из .env будут подставлены автоматически.

Важно: не храните пароли и токены в публичных репозиториях.

Добавление healthcheck

Пример:

services:
  web:
    image: nginx:alpine
    container_name: compose-example-web
    restart: unless-stopped
    ports:
      - "8080:80"
    healthcheck:
      test:
        - CMD
        - wget
        - --spider
        - -q
        - http://127.0.0.1/
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s

Примените:

docker compose up -d

Проверьте:

docker compose ps

После успешной проверки появится статус:

healthy

Полезные команды

Запуск:

docker compose up -d

Проверка:

docker compose ps

Логи:

docker compose logs -f

Перезапуск:

docker compose restart

Обновление:

docker compose pull
docker compose up -d

Остановка и удаление:

docker compose down

Типичные проблемы

Ошибка bind: address already in use

Порт уже занят.

Проверьте:

sudo ss -lntup | grep ':8080'

Измените внешний порт в compose.yaml.

Контейнер постоянно перезапускается

Проверьте:

docker compose ps
docker compose logs --tail=100

Изменения в compose.yaml не применились

Пересоздайте сервис:

docker compose up -d --force-recreate

Переменная не подставляется

Проверьте:

docker compose config

Убедитесь, что .env находится рядом с compose.yaml.

Контейнер не отвечает

Проверьте состояние:

docker compose ps

Проверьте логи:

docker compose logs web

Проверьте локальный порт:

curl -I http://127.0.0.1:8080

Удаление тестового проекта

cd ~/compose-example
docker compose down
cd ~
rm -rf ~/compose-example

При необходимости удалите образ:

docker image rm nginx:alpine

Итог

После выполнения инструкции:

  • создан Compose-проект;
  • описан сервис в compose.yaml;
  • контейнер запущен и проверен;
  • рассмотрены логи и команды exec;
  • показаны остановка и удаление;
  • выполнено обновление образа;
  • добавлены переменные окружения и healthcheck.

Тома, сети, секреты, reverse proxy и production-развёртывание следует рассматривать в отдельных статьях.

← Предыдущая статья Ограничение размера логов Docker Следующая статья → Тома Docker: постоянное хранение данных контейнеров