Что такое Docker Compose и как им пользоваться

Что такое Docker Compose и как им пользоваться
0
18

Docker Compose помогает запускать приложение из нескольких контейнеров одной командой. Сайт, база данных и другие части проекта описываются в одном YAML-файле, поэтому их не приходится поднимать и связывать вручную. На примере WordPress и MySQL покажем первый запуск, основные команды и ошибки, которые чаще всего мешают начать работу.

Что такое Docker Compose

Docker Compose — это инструмент для запуска и управления приложениями из нескольких Docker-контейнеров. Настройки хранятся в файле compose.yaml: в нём указывают нужные сервисы, образы, порты, переменные, сети и хранилища данных.

Один контейнер обычно решает одну задачу. Например, в одном работает WordPress, в другом — MySQL. Compose читает их настройки, создаёт общую сеть, подключает хранилище и запускает весь проект командой docker compose up.

Такой подход удобен для локальной копии сайта, тестового лендинга, небольшого веб-приложения или набора внутренних инструментов. Коллега получает compose.yaml, запускает его на своём компьютере и работает с тем же составом сервисов.

Команды Docker Compose для проверки конфигурации, запуска контейнеров, просмотра логов и остановки проекта

Как устроен файл compose.yaml

В реальном веб-проекте части зависят друг от друга: браузер обращается к сайту, сайт читает данные из базы, а отдельный сервис может хранить кэш или выполнять фоновые задачи. Compose поднимает этот набор на компьютере одной командой. Чтобы понимать, что происходит внутри каждого сервиса, нужны основы фронтенда, бэкенда, API и баз данных.

★ Где этому научиться

Курс «Полный путь web-разработчика» в Академии IT DMS

✓HTML, CSS, Flexbox, Grid и Tailwind CSS
✓JavaScript от основ до async/await, Git и GitHub
✓Backend на Node.js, базы данных и проекты на React и Next.js

Сертификат, диплом о переподготовке или удостоверение о повышении квалификации.

Перейти к курсу →Промокод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 update
sudo 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.

Как открыть встроенный терминал в VS Code

Поместите файл 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_password
DB_ROOT_PASSWORD=change_this_root_password

Compose подставит значения из .env в compose.yaml. Для локального примера этого достаточно. Рабочие пароли и ключи нельзя хранить в Git-репозитории; на сервере для них используют секреты или отдельное защищённое хранилище.

В примере работают два сервиса. db запускает MySQL и сохраняет файлы базы в томе db_data. wordpress открывает сайт на порту 8080 компьютера и подключается к базе по адресу db:3306. Имя db работает как сетевой адрес внутри проекта. Тег latest удобен для локального стенда; в рабочем окружении версию образа закрепляют, чтобы обновление не произошло неожиданно.

Проверка healthcheck ждёт готовности MySQL. Обычный depends_on задаёт порядок запуска контейнеров, но база может ещё несколько секунд готовиться к подключениям. Условие service_healthy позволяет запустить WordPress после успешной проверки базы.

Команды вводятся в терминал:

Встроенный терминал VS Code для запуска Docker Compose

Перед запуском проверьте итоговую конфигурацию: 

docker compose config

Если YAML разобран без ошибок, поднимите сервисы в фоновом режиме: 

docker compose up -d

Первый запуск занимает больше времени, потому что Docker скачивает образы. Статус контейнеров покажет команда: 

docker compose ps

В Docker Desktop нужно открыть раздел Containers. Проект Compose отображается одной группой, внутри которой находятся его контейнеры.

Контейнеры проекта Docker Compose в Docker Desktop
В примере Docker показан другой проект. После запуска нашего файла в разделе Containers появится группа с WordPress и MySQL.

Когда оба сервиса работают, откройте http://localhost:8080. Появится стартовая страница установки WordPress. Если сайт пока недоступен, посмотрите сообщения контейнеров: 

docker compose logs -f

Остановить просмотр логов можно сочетанием Ctrl+C: контейнеры продолжат работать, поскольку они запущены с флагом -d. 

Команды Docker Compose, которые пригодятся в работе

Для большинства повседневных задач хватает небольшого набора команд. Их запускают из папки с compose.yaml; для файла в другом месте используют параметр -f.

КомандаЧто произойдёт
docker compose configCompose проверит файл и покажет итоговую конфигурацию
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

✓Linux, Bash и виртуализация с нуля
✓CI/CD на Jenkins, Ansible, Docker и Kubernetes
✓Инфраструктура как код на Terraform и облако AWS

Сертификат, диплом о переподготовке или удостоверение о повышении квалификации.

Перейти к курсу →ПромокодAFFTIMES

−5 % на первую покупку. Скидка суммируется с любыми акциями школы. Если оплачиваете через менеджера в чате, назовите ему промокод.

Compose применяют и на сервере. Пример с WordPress выше предназначен для локального стенда. Публичному сайту потребуются HTTPS, резервное копирование, обновление образов, ограничение доступа к базе и безопасная работа с паролями.

Что делать дальше

Для первого знакомства достаточно сохранить два файла из примера, выполнить docker compose config, затем docker compose up -d и открыть localhost:8080. По командам ps и logs можно проверить состояние проекта, а down остановит и удалит его контейнеры без потери базы.

Следующий полезный шаг — заменить WordPress своим приложением и описать его сборку через Dockerfile. Так вы увидите весь путь: сборка образа, запуск вместе с базой, проверка логов и повторное развёртывание после изменений.

FAQ

Чем Docker Compose отличается от Docker?

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

Что делает команда docker compose up?

docker compose up создаёт или пересоздаёт нужные контейнеры, запускает их и подключает вывод логов. Флаг -d оставляет сервисы работать в фоне.

Где должен лежать compose.yaml?

Обычно compose.yaml лежит в корневой папке проекта. Команды запускают из этой папки; другой путь можно указать через docker compose -f /путь/к/файлу up.

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

По умолчанию docker compose down удаляет контейнеры и сеть проекта, но сохраняет именованные тома. Команда с флагом -v удаляет тома и хранящиеся в них данные.

Какая команда актуальна: docker compose или docker-compose?

Актуальный CLI использует docker compose с пробелом. Вариант docker-compose относится к отдельной устаревшей установке и сохраняется для обратной совместимости.

Валерия Шлегель
Валерия Шлегель
Автор
(Проголосовать за статью)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

X