Docker Compose помогает запускать приложение из нескольких контейнеров одной командой. Сайт, база данных и другие части проекта описываются в одном YAML-файле, поэтому их не приходится поднимать и связывать вручную. На примере WordPress и MySQL покажем первый запуск, основные команды и ошибки, которые чаще всего мешают начать работу.
Что такое Docker Compose
Docker Compose — это инструмент для запуска и управления приложениями из нескольких Docker-контейнеров. Настройки хранятся в файле compose.yaml: в нём указывают нужные сервисы, образы, порты, переменные, сети и хранилища данных.
Один контейнер обычно решает одну задачу. Например, в одном работает WordPress, в другом — MySQL. Compose читает их настройки, создаёт общую сеть, подключает хранилище и запускает весь проект командой docker compose up.
Такой подход удобен для локальной копии сайта, тестового лендинга, небольшого веб-приложения или набора внутренних инструментов. Коллега получает compose.yaml, запускает его на своём компьютере и работает с тем же составом сервисов.

Как устроен файл compose.yaml
В реальном веб-проекте части зависят друг от друга: браузер обращается к сайту, сайт читает данные из базы, а отдельный сервис может хранить кэш или выполнять фоновые задачи. Compose поднимает этот набор на компьютере одной командой. Чтобы понимать, что происходит внутри каждого сервиса, нужны основы фронтенда, бэкенда, API и баз данных.
Курс «Полный путь web-разработчика» в Академии IT DMS
Сертификат, диплом о переподготовке или удостоверение о повышении квалификации.
AFFTIMES−5 % на первую покупку. Скидка суммируется с любыми акциями школы. Если оплачиваете через менеджера в чате, назовите ему промокод.
Файл Compose пишут в формате YAML. В нём важны отступы: вложенные параметры сдвигают пробелами, а табуляцию лучше не использовать. Предпочтительное имя файла — compose.yaml; Compose также распознаёт compose.yml. Названия docker-compose.yaml и docker-compose.yml сохранены для обратной совместимости.
Основные элементы файла проще увидеть по их работе:
| Элемент | Что задаёт |
| services | Контейнеры приложения: сайт, база, кэш и другие компоненты |
| image | Готовый образ из реестра, например WordPress или MySQL |
| build | Сборку собственного образа по Dockerfile |
| ports | Связь порта компьютера с портом внутри контейнера |
| environment | Переменные, которые получает сервис |
| volumes | Хранение данных и подключение файлов |
| depends_on | Порядок запуска зависимых сервисов |
В новых файлах строка version: не нужна. Compose использует актуальную спецификацию и предупреждает, что верхнее поле version устарело.
Установка Docker Compose
На Windows и macOS проще установить Docker Desktop: Compose входит в комплект. Docker Desktop доступен и для Linux. Если Docker Engine уже установлен на Linux-сервере, Compose можно добавить как CLI-плагин из репозитория Docker.
На Ubuntu и Debian после подключения официального репозитория Docker плагин устанавливают так:
sudo apt-get updatesudo apt-get install docker-compose-pluginПроверьте установку командой:
docker compose versionВ актуальной команде между docker и compose стоит пробел. Написание docker-compose с дефисом относится к отдельной устаревшей версии, которую Docker сохраняет для обратной совместимости.
Запуск WordPress и MySQL через Docker Compose
Для примера поднимем локальный WordPress с отдельной базой MySQL. Такой стенд пригодится, чтобы безопасно проверить тему, плагин или изменение сайта перед публикацией. Для размещения проекта в интернете понадобятся дополнительные настройки: HTTPS, резервные копии и защищённое хранение секретов.
Откройте папку проекта в VS Code, нажмите по ней правой кнопкой мыши и выберите Open in Integrated Terminal.

Поместите файл compose.yaml:
services:
db:
image: mysql:8.4
restart: unless-stopped
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
volumes:
- db_data:/var/lib/mysql
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost -uroot -p$${MYSQL_ROOT_PASSWORD} --silent"]
interval: 10s
timeout: 5s
retries: 10
wordpress:
image: wordpress:latest
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_NAME: wordpress
volumes:
db_data:Рядом создайте файл .env и задайте два разных пароля:
DB_PASSWORD=change_this_wordpress_passwordDB_ROOT_PASSWORD=change_this_root_passwordCompose подставит значения из .env в compose.yaml. Для локального примера этого достаточно. Рабочие пароли и ключи нельзя хранить в Git-репозитории; на сервере для них используют секреты или отдельное защищённое хранилище.
В примере работают два сервиса. db запускает MySQL и сохраняет файлы базы в томе db_data. wordpress открывает сайт на порту 8080 компьютера и подключается к базе по адресу db:3306. Имя db работает как сетевой адрес внутри проекта. Тег latest удобен для локального стенда; в рабочем окружении версию образа закрепляют, чтобы обновление не произошло неожиданно.
Проверка healthcheck ждёт готовности MySQL. Обычный depends_on задаёт порядок запуска контейнеров, но база может ещё несколько секунд готовиться к подключениям. Условие service_healthy позволяет запустить WordPress после успешной проверки базы.
Команды вводятся в терминал:

Перед запуском проверьте итоговую конфигурацию:
docker compose configЕсли YAML разобран без ошибок, поднимите сервисы в фоновом режиме:
docker compose up -dПервый запуск занимает больше времени, потому что Docker скачивает образы. Статус контейнеров покажет команда:
docker compose psВ Docker Desktop нужно открыть раздел Containers. Проект Compose отображается одной группой, внутри которой находятся его контейнеры.

Когда оба сервиса работают, откройте http://localhost:8080. Появится стартовая страница установки WordPress. Если сайт пока недоступен, посмотрите сообщения контейнеров:
docker compose logs -fОстановить просмотр логов можно сочетанием Ctrl+C: контейнеры продолжат работать, поскольку они запущены с флагом -d.
Команды Docker Compose, которые пригодятся в работе
Для большинства повседневных задач хватает небольшого набора команд. Их запускают из папки с compose.yaml; для файла в другом месте используют параметр -f.
| Команда | Что произойдёт |
| docker compose config | Compose проверит файл и покажет итоговую конфигурацию |
| docker compose up -d | Создаст и запустит сервисы в фоне |
| docker compose up -d —build | Сначала пересоберёт собственные образы |
| docker compose ps | Покажет контейнеры, состояние и опубликованные порты |
| docker compose logs -f | Откроет общий поток логов |
| docker compose logs -f wordpress | Покажет логи одного сервиса |
| docker compose exec wordpress sh | Откроет командную оболочку внутри запущенного контейнера |
| docker compose stop | Остановит контейнеры без удаления |
| docker compose start | Снова запустит остановленные контейнеры |
| docker compose restart wordpress | Перезапустит выбранный сервис |
| docker compose pull | Скачает свежие версии указанных образов |
| docker compose down | Удалит контейнеры и созданную сеть проекта |
Команда docker compose down оставляет именованный том db_data, поэтому база сохранится для следующего запуска. Вариант docker compose down -v удалит и том. Для нашего примера это означает потерю содержимого MySQL.
После docker compose pull снова выполните docker compose up -d: Compose пересоздаст сервисы на основе скачанных образов и сохранит подключённые тома.
Как работают сеть, порты и тома
Compose создаёт для проекта отдельную сеть. Сервисы находят друг друга по именам из compose.yaml, поэтому WordPress обращается к db. IP-адрес контейнера может измениться после пересоздания; имя сервиса остаётся тем же.
Запись 8080:80 связывает два порта. Слева указан порт компьютера, справа — порт внутри контейнера. Браузер открывает localhost:8080, а WordPress внутри контейнера слушает порт 80. Если порт 8080 уже занят, замените левую часть, например на 8081:80.
Для MySQL мы не добавляли ports: WordPress видит базу через внутреннюю сеть Compose. Публиковать порт базы на компьютере нужно только тогда, когда к ней подключается программа за пределами проекта.
Том db_data хранится отдельно от контейнера. Compose может пересоздать MySQL после изменения конфигурации, а записи сайта останутся в томе. Перед удалением тома сделайте резервную копию нужных данных.
За что отвечают Dockerfile и Docker Compose
Dockerfile описывает сборку одного образа: какие файлы скопировать, какие зависимости установить и какую команду выполнить при запуске. Compose описывает совместную работу сервисов: какие образы запустить, как соединить их сетью, куда направить порты и где хранить данные.
Если у вас своё приложение, вместо готового образа можно указать сборку:
services:
app:
build: .
ports:
- "3000:3000"Compose найдёт Dockerfile в текущей папке, соберёт образ и запустит сервис app. После изменения зависимостей или Dockerfile используйте docker compose up -d —build.
Частые ошибки при запуске
Команда docker compose не найдена
Проверьте docker compose version. На компьютере с Docker Desktop само приложение должно быть запущено. На Linux с Docker Engine установите Compose-плагин. Отдельный docker-compose с дефисом оставляют для старых проектов, которым нужна обратная совместимость.
Порт уже занят
Сообщение port is already allocated означает, что левый порт из записи 8080:80 использует другая программа или контейнер. Выберите свободный порт, например 8081:80, затем снова выполните docker compose up -d.
Приложение не подключается к базе
Внутри контейнера localhost указывает на этот же контейнер. Для подключения к соседнему сервису используйте его имя: в нашем примере db:3306. Если адрес правильный, проверьте логин, пароль и готовность базы через docker compose ps и docker compose logs db.
Compose не видит переменную
Предупреждение о пустом значении появляется, когда переменной нет в окружении или .env. Убедитесь, что .env лежит рядом с compose.yaml, а названия совпадают. Команда docker compose config —environment показывает значения, которые Compose использует для подстановки.
Изменения в приложении не появились
Если сервис собирается через build, пересоберите образ командой docker compose up -d —build. Флаг —force-recreate принудительно пересоздаёт контейнеры и нужен реже; обычный up сам замечает изменения конфигурации или образа.
Сервис запустился раньше базы
Статус running сообщает, что процесс внутри контейнера стартовал. База может ещё готовить файлы и не принимать подключения. Добавьте healthcheck к базе и условие service_healthy в depends_on, как в примере выше.
Где используют Docker Compose
Compose хорошо подходит для локальной разработки, автоматических тестов, демонстрационных стендов и небольших проектов на одном сервере. Один файл помогает разработчику, тестировщику и администратору запускать одинаковый набор сервисов.
Для локального теста хватает Docker Desktop. Для публикации проекта понадобится сервер или VPS. Если пока выбираете площадку, полезно заранее разобраться, как выбрать хостинг для сайта и какие ресурсы потребует ваш набор контейнеров.
Когда проект нужно регулярно собирать, проверять и выкладывать на сервер, к Compose добавляются Dockerfile, реестр образов, CI/CD, облачная инфраструктура, мониторинг и иногда Kubernetes. Для этой работы нужно понимать весь путь приложения от кода до работающего сервиса.
Курс «DevOps Deep Dive» в Академии IT DMS
Сертификат, диплом о переподготовке или удостоверение о повышении квалификации.
AFFTIMES−5 % на первую покупку. Скидка суммируется с любыми акциями школы. Если оплачиваете через менеджера в чате, назовите ему промокод.
Compose применяют и на сервере. Пример с WordPress выше предназначен для локального стенда. Публичному сайту потребуются HTTPS, резервное копирование, обновление образов, ограничение доступа к базе и безопасная работа с паролями.
Что делать дальше
Для первого знакомства достаточно сохранить два файла из примера, выполнить docker compose config, затем docker compose up -d и открыть localhost:8080. По командам ps и logs можно проверить состояние проекта, а down остановит и удалит его контейнеры без потери базы.
Следующий полезный шаг — заменить WordPress своим приложением и описать его сборку через Dockerfile. Так вы увидите весь путь: сборка образа, запуск вместе с базой, проверка логов и повторное развёртывание после изменений.
FAQ
Docker запускает и управляет отдельными контейнерами. Docker Compose читает compose.yaml и управляет сразу всем набором сервисов, сетей и томов одного проекта.
docker compose up создаёт или пересоздаёт нужные контейнеры, запускает их и подключает вывод логов. Флаг -d оставляет сервисы работать в фоне.
Обычно compose.yaml лежит в корневой папке проекта. Команды запускают из этой папки; другой путь можно указать через docker compose -f /путь/к/файлу up.
По умолчанию docker compose down удаляет контейнеры и сеть проекта, но сохраняет именованные тома. Команда с флагом -v удаляет тома и хранящиеся в них данные.
Актуальный CLI использует docker compose с пробелом. Вариант docker-compose относится к отдельной устаревшей установке и сохраняется для обратной совместимости.




