Бортовой журнал
Бортовой журнал

Гайд по Docker Compose: с нуля до запуска

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

Обычно, когда мы работаем с Docker, мы поднимаем контейнеры по одному: базу данных в одном контейнере, сервер в другом, фронтенд в третьем. Проблема в том, что все эти части должны взаимодействовать между собой. Настраивать их вручную каждый раз — долго и неудобно.

Вот тут и выручает Docker Compose. Вместо того чтобы запускать контейнеры по отдельности, мы описываем всю инфраструктуру в одном файле docker-compose.yml: какие сервисы нужны, какие порты открыть, какие тома подключить и как связать контейнеры друг с другом.

Таким образом, Docker Compose нужен, чтобы:

  • упростить запуск проекта — не нужно держать в голове десяток команд, все хранится в одном файле; 
  • окружение было одинаковым у всей команды — разработчик на Windows и админ на Linux запускают проект одинаково;
  • легко поднимать проект на тестовом или продакшн-сервере;
  • быстро останавливать и удалять контейнеры.

Как установить Docker Compose

Docker Compose можно поставить на любую популярную операционную систему:

Установка Docker Compose на Windows

Самый удобный способ поставить Docker Compose на Windows — установить Docker Desktop. В нем Compose уже встроен, поэтому никаких дополнительных действий не потребуется.

  1. Зайдите на официальный сайт Docker и скачайте Docker Desktop для Windows.
  2. Запустите установщик и следуйте инструкциям. Во время установки убедитесь, что включены необходимые компоненты WSL 2 (Windows Subsystem for Linux).
  3. После завершения установки перезапустите компьютер (иногда это требуется).
  4. Откройте Docker Desktop и дождитесь, пока он запустится.
  5. Откройте командную строку и выполните команду:

docker compose version

Если установка прошла успешно, вы увидите что-то вроде:

Docker Compose version v2.39.2

Установка Docker Compose на macOS 

На macOS есть два простых способа получить Docker Compose: через Docker Desktop или с помощью Homebrew. Расскажу о каждом.

Вариант 1. Через Docker Desktop

  1. Перейдите на сайт Docker и скачайте инсталлятор для macOS.
  2. Откройте скачанный файл и перетащите значок Docker в папку Applications.
  3. Запустите Docker Desktop из Applications — он автоматически установит и включит плагин Compose.
  4. Проверьте версию в терминале:

docker compose version

Вы увидите что-то вроде:

Docker Compose version v2.39.2

Вариант 2. Через Homebrew

Если вы предпочитаете пакеты CLI и не хотите ставить приложение с графической оболочкой, можно установить только плагин Compose:

Откройте Terminal и убедитесь, что Homebrew установлен:

brew --version

Установите плагин Docker Compose:

brew install docker-compose

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

docker-compose --version

А в выводе — знакомая строка с версией, например:

Docker Compose version v2.39.2

Установка Docker Compose на Linux

В качестве примера возьмем Ubuntu, но шаги будут похожими и для других дистрибутивов Linux.

Самый удобный способ поставить Docker Compose — скачать его прямо с официального GitHub-репозитория. Так вы точно получите актуальную версию. На момент написания этой статьи это v2.39.2.

Скачайте файл:

sudo curl -L "https://github.com/docker/compose/releases/download/v2.39.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Сделайте файл исполняемым:

sudo chmod +x /usr/local/bin/docker-compose

Теперь его можно запускать как программу.

Проверьте установку:

docker-compose --version

В выводе должно быть:

Docker Compose version v2.39.2

На этом все — Docker Compose установлен и готов к работе. Если хочется упростить процесс, можно поставить Docker Desktop: в нем Compose уже встроен.

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

Все настройки для Docker Compose хранятся в файле docker-compose.yml. В нем описываются сервисы, сети, тома и другие параметры окружения. Файл пишется в формате YAML, поэтому важно соблюдать отступы и правильное форматирование.

Основные блоки docker-compose.yml:

version. Раньше в начале указывалась версия формата, например version: "3". В актуальных версиях Docker Compose это уже не обязательно — можно просто описывать сервисы.

services. Главный раздел — здесь перечисляются все контейнеры проекта. Каждый сервис имеет свое имя и набор настроек. Например:

  • какой образ использовать (image);
  • как его собрать (build);
  • какие порты пробросить (ports);
  • какие тома подключить (volumes);
  • какие переменные окружения задать (environment).

volumes. Если сервисам нужно хранить данные между перезапусками (например, база данных), тома описываются здесь.

networks. Позволяет управлять сетями. Обычно Compose автоматически создает сеть и подключает к ней все сервисы, так что отдельный блок нужен только для сложных сценариев.

Как создать файл Docker Compose

Создать свой первый docker-compose.yml очень просто — достаточно любого текстового редактора и базовых знаний по YAML:

 В корне вашего проекта (или в отдельной папке) создайте файл с именем docker-compose.yml. Например:

cd ~/my-project

touch docker-compose.yml

Откройте редактор.Можно использовать любой:

  • VS CodeJetBrains IDE (с плагинами для YAML);
  • NanoVim или Emacs прямо в терминале;
  • Notepad++ или Sublime Text на Windows/macOS.
  • Начните с простого примера: два сервиса — веб-сервер и база данных. Вставьте в файл следующий шаблон:

version: "3.9"  

services:

  app:

    image: nginx:latest

    ports:

      - "8080:80"

  db:

    image: postgres:15

    environment:

      POSTGRES_USER: user

      POSTGRES_PASSWORD: password

После сохранения файла можно убедиться, что в нем нет ошибок:

docker-compose config

Если есть проблемы с отступами или ключами, инструмент выдаст подробное сообщение.

Для запуска достаточно одной команды в той же папке:

docker compose up

Compose автоматически создаст и запустит все описанные сервисы.

Команды Docker Compose

Чтобы работать с Docker Compose, нужно освоить несколько базовых команд:

Как управлять контейнерами

Запуск контейнеров 

В папке с docker-compose.yml выполните:

docker-compose up

Эта команда поднимет все контейнеры из файла docker-compose.yml и выведет их логи прямо в терминал. Если хотите, чтобы контейнеры работали в фоне (и терминал остался свободным), используйте флаг -d.

Однако не всегда нужно поднимать все окружение. Порой достаточно одного сервиса:

docker-compose up -d app

Эта команда поднимет только контейнер с сервисом app.

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

Проект можно остановить с помощью:

docker-compose down

Контейнеры будут остановлены и удалены.

Если же нужно только остановить, но оставить контейнеры на месте (чтобы потом запустить снова), выполните:

docker-compose stop

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

Если сервисы уже были остановлены, их можно снова включить без пересоздания:

docker-compose start

А если вы меняли настройки и хотите пересобрать окружение с нуля — используйте:

docker-compose up --force-recreate

Как управлять сервисами

В некоторых случаях нужно работать не со всем проектом сразу, а с отдельными его частями — например, перезапустить только базу данных или посмотреть, что происходит в конкретном сервисе. Вам пригодятся следующие команды:

Список работающих сервисов

Чтобы увидеть, какие контейнеры сейчас запущены и в каком они состоянии:

docker-compose ps

Вы получите таблицу с именами сервисов, их статусом и проброшенными портами.

Запуск отдельного сервиса

Не всегда нужен весь проект. Допустим, надо поднять только бэкенд:

docker-compose up -d backend

Так поднимется только сервис backend, а не все окружение.

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

Нужно зайти внутрь контейнера и выполнить там команду — например, посмотреть файлы или мигрировать базу? Для этого есть exec:

docker-compose exec db psql -U user

Перезапуск отдельного сервиса

Если хотите перезапустить только один сервис (не весь проект):

docker-compose restart app

Где app — ваш сервис.

Как управлять образами

Образы — это основа контейнеров. В Docker Compose вы можете как скачивать готовые образы с Docker Hub, так и собирать свои из Dockerfile. 

Сборка образов

Если у вас в docker-compose.yml вместо image указан build, то образ собирается из Dockerfile. Сделать это можно так:

docker-compose build

Команда соберет все образы, описанные в проекте.

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

docker-compose build app

Если нужно заставить Compose пересобрать образы, не используя кэш, выполните:

docker-compose build --no-cache

Загрузка образов из Docker Hub

Если в проекте используются готовые образы (например, nginx:latest или postgres:15), их можно заранее скачать:

docker-compose pull

Команда подтянет все образы, указанные в docker-compose.yml.

А чтобы скачать только один сервис, добавьте его название в конце.

Как работать с логами

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

Посмотреть все сразу можно так:

docker-compose logs

Вывод будет длинным — в нем соберутся сообщения от всех контейнеров проекта.

Если интересует только один контейнер, укажите его имя:

docker-compose logs app

Чтобы следить за логами в режиме реального времени, используйте флаг -f:

docker-compose logs -f app

Теперь новые сообщения будут выводиться в реальном времени, пока вы не остановите команду Ctrl + C.

Иногда нужно только посмотреть последние сообщения:

docker-compose logs --tail=50 app

В выводе вы увидите только последние 50 строк логов для сервиса app.

Как управлять сетями

В Docker Compose контейнеры общаются между собой через виртуальные сети. По умолчанию при запуске проекта создается одна сеть, и все сервисы подключаются к ней. Но вы можете управлять сетями вручную — создавать новые, разделять сервисы по разным сетям или удалять ненужные.

Список сетей

Чтобы посмотреть, какие сети связаны с вашим проектом:

docker-compose network ls

Создание новой сети

Если хотите, чтобы часть сервисов общалась отдельно от других (например, база данных и бэкенд в приватной сети), можно создать сеть вручную:

docker-compose network create имя

Удаление сети

Если сеть больше не нужна, ее можно удалить:

docker-compose network rm backend

Использование сетей в docker-compose.yml

Вы можете явно описывать сети в файле:

version: "3.9"

services:

  app:

    image: nginx

    networks:

      - frontend

  db:

    image: postgres

    networks:

      - backend

networks:

  frontend:

  backend:

Здесь сервис app работает только в сети frontend, а база данных — только в backend.

Как управлять томами

Тома в Docker нужны для того, чтобы данные не пропадали при удалении или пересоздании контейнера. Например, база данных или загруженные пользователями файлы должны храниться не внутри контейнера, а в отдельном хранилище. 

Docker Compose позволяет легко управлять томами.

Список томов

Посмотреть все тома, созданные в проекте:

docker-compose volume ls

Создание нового тома

Можно также создать том, выполнив:

docker-compose volume create db_data

После этого том db_data можно подключить к контейнеру.

Удаление тома

Если том больше не нужен, его можно удалить:

docker-compose volume rm db_data

Но будьте осторожны — вместе с томом удаляются и все данные в нем.

Как проверить конфигурацию

Перед тем как запускать проект, полезно убедиться, что в файле docker-compose.yml нет ошибок. Иногда достаточно одного лишнего пробела или неправильного ключа, чтобы все перестало работать. Для этого у Docker Compose есть удобная команда:

docker-compose config

Что она делает:

  • проверяет корректность структуры docker-compose.yml;
  • подставляет значения из файла .env, если он используется;
  • выводит итоговую конфигурацию, которую Compose будет применять при запуске.

Если где-то ошибка в синтаксисе или неправильное значение, команда сообщит об этом.

Заключение

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

Мы разобрали основные возможности Compose: как поднимать и останавливать контейнеры, управлять отдельными сервисами, собирать и скачивать образы, просматривать логи, работать с сетями и томами, а также проверять корректность конфигурации. Этого достаточно, чтобы начать использовать инструмент в реальных проектах.

Чтобы было проще ориентироваться, мы подготовили краткую шпаргалку по основным командам:

Задача

Команда

Запустить все сервисы

docker-compose up

Запустить в фоне

docker-compose up -d

Запустить один сервис

docker-compose up -d имя_сервиса

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

docker-compose down

Только остановить

docker-compose stop

Снова запустить остановленные

docker-compose start

Пересоздать контейнеры

docker-compose up --force-recreate

Посмотреть список сервисов

docker-compose ps

Перезапустить сервис

docker-compose restart имя_сервиса

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

docker-compose exec имя_сервиса psql -U user

Собрать образы

docker-compose build

Скачать образы

docker-compose pull

Логи всех сервисов

docker-compose logs

Логи одного сервиса

docker-compose logs имя_сервиса

Логи в реальном времени

docker-compose logs -f имя_сервиса

Список сетей

docker-compose network ls

Создать сеть

docker-compose network create имя_сети

Удалить сеть

docker-compose network rm имя_сети

Список томов

docker-compose volume ls

Создать том

docker-compose volume create имя_тома

Удалить том

docker-compose volume rm имя_тома

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

docker-compose config

Дальше — дело за практикой: попробуйте собрать свой первый docker-compose.yml и развернуть проект.