Базовая работа с 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-развёртывание следует рассматривать в отдельных статьях.