Гайд по Docker Compose: с нуля до запуска
Гайд по 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 уже встроен, поэтому никаких дополнительных действий не потребуется.
- Зайдите на официальный сайт Docker и скачайте Docker Desktop для Windows.
- Запустите установщик и следуйте инструкциям. Во время установки убедитесь, что включены необходимые компоненты WSL 2 (Windows Subsystem for Linux).
- После завершения установки перезапустите компьютер (иногда это требуется).
- Откройте Docker Desktop и дождитесь, пока он запустится.
- Откройте командную строку и выполните команду:
docker compose version
Если установка прошла успешно, вы увидите что-то вроде:
Docker Compose version v2.39.2
Установка Docker Compose на macOS
На macOS есть два простых способа получить Docker Compose: через Docker Desktop или с помощью Homebrew. Расскажу о каждом.
Вариант 1. Через Docker Desktop
- Перейдите на сайт Docker и скачайте инсталлятор для macOS.
- Откройте скачанный файл и перетащите значок Docker в папку Applications.
- Запустите Docker Desktop из Applications — он автоматически установит и включит плагин Compose.
- Проверьте версию в терминале:
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 Code, JetBrains IDE (с плагинами для YAML);
- Nano, Vim или 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 и развернуть проект.
Перейти на оригинал