Docker Compose — Управление сервисами
Эта страница объясняет базовые команды docker compose, которые используются для запуска, остановки, пересборки и перезапуска сервисов в проекте. Материал рассчитан на начинающих: здесь разобрано, что делает каждая команда, в каких случаях её использовать и на что обратить внимание, чтобы случайно не сломать рабочее окружение.
Что такое Docker Compose
Docker Compose — это инструмент для управления несколькими контейнерами как единым приложением.
Обычно в проекте есть файл docker-compose.yml, где описано:
- какие сервисы нужно запускать
- какие образы использовать
- какие порты пробрасывать
- какие папки подключать как volumes
- какие переменные окружения передавать контейнерам
Например, один проект может состоять из:
nginxphpmysqlredis
Вместо того чтобы запускать каждый контейнер отдельно длинными командами docker run, Compose позволяет поднять всё одной командой.
Перед началом работы
Обычно работа с Compose ведётся из директории проекта, где лежит docker-compose.yml.
Пример:
cd /opt/flamy_projects/project_name
Проверить, что файл действительно есть в текущей папке:
ls -la
Если нужно найти compose-файлы во всей папке проектов:
find /opt/flamy_projects -type f -name "docker-compose*.yml"
Примечание: Большинство команд
docker composeнужно выполнять именно в той директории, где находитсяdocker-compose.yml. Иначе Docker не поймёт, с каким проектом работать.
Базовый принцип работы
Чаще всего цикл работы выглядит так:
- перейти в папку проекта
- запустить сервисы
- проверить, что контейнеры работают
- посмотреть логи при ошибках
- при необходимости пересобрать или перезапустить сервисы
Запуск сервисов
Запуск всех сервисов в фоне
docker compose up -d
Эта команда:
- читает
docker-compose.yml - создаёт нужные контейнеры
- запускает их
- оставляет терминал свободным для дальнейшей работы
Флаг -d означает detached mode, то есть запуск в фоне.
Когда использовать
Подходит почти для любого обычного старта проекта:
- после перезагрузки сервера
- после первого клонирования проекта
- после остановки контейнеров
- после мелких изменений конфигурации
Пример
cd /opt/flamy_projects/site1
docker compose up -d
Что важно помнить
Если образа ещё нет локально, Docker попытается:
- скачать его из реестра
- либо собрать локально, если это описано в конфигурации
Для новичков:
upне всегда означает просто «включить». Эта команда может не только запускать, но и создавать контейнеры заново, если это требуется по конфигурации.
Остановка и удаление контейнеров проекта
Остановка проекта
docker compose down
Команда останавливает и удаляет:
- контейнеры проекта
- созданные Compose-сети
Когда использовать
Подходит, если нужно:
- полностью выключить проект
- освободить ресурсы
- заново поднять окружение
- сбросить сетевые проблемы внутри проекта
Что команда не удаляет
По умолчанию docker compose down не удаляет volumes.
Это важно, потому что именно в volumes часто лежат данные:
- база данных
- загруженные файлы
- кэш приложения
- постоянные данные сервисов
Важно: Для новичков это одна из самых полезных вещей: обычный
downне стирает данные сам по себе. Но всё равно всегда нужно понимать, где именно проект хранит данные — в volumes, bind mounts или внутри контейнера.
Пример
docker compose down
После этого проект можно снова поднять:
docker compose up -d
Принудительное пересоздание контейнеров
Пересоздать контейнеры даже без изменений
docker compose up -d --force-recreate
Эта команда заставляет Docker пересоздать контейнеры, даже если он считает, что ничего не поменялось.
Когда использовать
Полезно, если:
- контейнер ведёт себя странно
- изменились переменные окружения
- конфигурация применена не так, как ожидалось
- нужен «чистый» перезапуск контейнера без удаления volumes
Что важно помнить
- контейнеры будут пересозданы
- volumes останутся на месте
- данные в volumes не пропадут
Пояснение: Контейнер и volume — это не одно и то же. Контейнер — это «запущенная оболочка приложения». Volume — это место, где могут лежать постоянные данные. Поэтому пересоздание контейнера не обязательно означает потерю данных.
Пересборка образов
Пересборка нужна тогда, когда меняется не только запуск контейнера, а именно его образ. Обычно это происходит, если вы изменили:
Dockerfile- системные пакеты
- зависимости приложения
- шаги сборки
Пересборка без использования кэша
docker compose build --no-cache
Docker при сборке старается использовать кэш, чтобы не выполнять одинаковые шаги повторно. Это ускоряет работу, но иногда мешает, если нужен действительно «чистый» rebuild.
Флаг --no-cache говорит:
не использовать ранее сохранённые слои, а собрать всё заново.
Когда использовать
Подходит, если:
- изменения в Dockerfile «не подхватываются»
- обновились зависимости
- есть подозрение на устаревший build cache
- нужно убедиться, что образ собран полностью с нуля
Пример
docker compose build --no-cache
docker compose up -d
Примечание: Эта операция может занять заметно больше времени, чем обычная сборка.
Пересобрать и сразу запустить
docker compose up -d --build
Команда делает два действия сразу:
- при необходимости пересобирает образ
- запускает контейнеры
Когда использовать
Это один из самых частых сценариев после изменения:
Dockerfile- зависимостей
- конфигурации сборки
Пример
docker compose up -d --build
Чем отличается от build --no-cache
build --no-cachedocker compose up -d --buildможет использовать кэшdocker compose build --no-cacheсобирает всё полностью заново
Если нужно просто обновить контейнер после обычных изменений — чаще хватает:
docker compose up -d --build
Если есть сомнения в корректности кэша — используйте:
docker compose build --no-cache
docker compose up -d
Обновление образов из реестра
Скачать свежие версии образов
docker compose pull
Команда скачивает новые версии образов, которые указаны в docker-compose.yml.
Когда использовать
Подходит, если проект использует готовые образы из registry, например:
nginx:latestredis:7mysql:8
Важный момент
docker compose pull только скачивает образы, но не перезапускает контейнеры автоматически.
Чтобы применить обновление, обычно выполняют:
docker compose pull && docker compose up -d
Пример
cd /opt/flamy_projects/site1
docker compose pull
docker compose up -d
Важно: На production-серверах обновление образов нужно делать осторожно. Новая версия образа может изменить поведение приложения или сломать совместимость.
Перезапуск сервисов
Иногда контейнер не нужно пересобирать или пересоздавать — достаточно просто перезапустить процесс.
Перезапуск одного сервиса
docker compose restart <service>
Пример:
docker compose restart nginx
Когда использовать
Подходит, если:
- сервис завис
- нужно перечитать конфигурацию
- произошёл временный сбой
- после некоторых изменений достаточно обычного рестарта
Перезапуск всех сервисов
docker compose restart
Перезапускает все сервисы, описанные в compose-файле.
Когда использовать
Подходит, если:
- нужно быстро перезапустить весь проект
- нет уверенности, какой именно сервис работает некорректно
- нужно «освежить» всё окружение без удаления контейнеров
Остановка и запуск отдельного сервиса вручную
docker compose stop <service> && docker compose start <service>
Пример:
docker compose stop php && docker compose start php
Зачем это нужно, если есть restart
restartИногда удобнее разделить действия на две части:
- сначала корректно остановить контейнер
- затем отдельно запустить снова
Это бывает полезно при диагностике или когда нужно убедиться, что сервис полностью остановился.
Запуск только одного сервиса
docker compose up -d <service>
Пример:
docker compose up -d nginx
Когда использовать
Полезно, если:
- нужно поднять только один сервис
- вы тестируете конкретный контейнер
- не хотите трогать всё окружение
Примечание: Если сервис зависит от других, Compose может поднять и их тоже.
Проверка итоговой конфигурации
Посмотреть итоговый compose-конфиг
docker compose config
Эта команда показывает итоговую конфигурацию после обработки:
docker-compose.yml- override-файлов
- переменных окружения
- подстановок из
.env
Когда использовать
Очень полезно перед запуском, если:
- не подставляются env-переменные
- есть сомнения в корректности конфигурации
- нужно понять, что Docker реально «видит»
Почему это важно для новичков
Иногда в YAML всё выглядит правильно, но итоговая конфигурация получается другой.
docker compose config помогает увидеть конечный результат до запуска.
Наиболее частые сценарии в работе
Обычный запуск проекта
docker compose up -d
Обновить образы и применить изменения
docker compose pull && docker compose up -d
После изменения Dockerfile или зависимостей
docker compose up -d --build
Полная пересборка без кэша
docker compose build --no-cache
docker compose up -d
Быстро перезапустить один сервис
docker compose restart nginx
Полностью выключить проект
docker compose down
Что выбрать в типовых ситуациях
Ситуация: нужно просто запустить проект
Используйте:
docker compose up -d
Ситуация: поменялся Dockerfile
Используйте:
docker compose up -d --build
Ситуация: образ ведёт себя странно, нужен чистый rebuild
Используйте:
docker compose build --no-cache
docker compose up -d
Ситуация: нужно скачать свежие образы из registry
Используйте:
docker compose pull && docker compose up -d
Ситуация: сервис просто нужно перезапустить
Используйте:
docker compose restart <service>
Частые ошибки новичков
Запуск команды не из той директории
Если выполнить docker compose up -d не там, где лежит docker-compose.yml, можно получить ошибку о том, что конфигурационный файл не найден.
Путаница между restart, up, build и down
restart, up, build и downКратко:
restart— просто перезапуск уже существующих контейнеровup— поднять проектup --build— поднять проект с пересборкойdown— остановить и удалить контейнеры проекта
Ожидание, что pull сам обновит работающие контейнеры
pull сам обновит работающие контейнерыdocker compose pull только скачивает новый образ.
Чтобы контейнеры начали работать на новой версии, нужен ещё запуск:
docker compose up -d
Краткая памятка
docker compose up -d # Запуск проекта в фоне
docker compose down # Остановка и удаление контейнеров проекта
docker compose up -d --force-recreate # Пересоздать контейнеры принудительно
docker compose build --no-cache # Полная пересборка без кэша
docker compose up -d --build # Пересборка и запуск
docker compose pull # Скачать свежие образы
docker compose restart <service> # Перезапуск одного сервиса
docker compose restart # Перезапуск всех сервисов
docker compose stop <service> && docker compose start <service> # Остановить и запустить сервис отдельно
docker compose up -d <service> # Запуск одного сервиса
docker compose config # Проверка итоговой конфигурации