Что такое Docker Compose и docker-compose.yml?
Для начинающих понимание и использование docker-compose.yml — один из ключевых навыков, который значительно облегчает работу с Docker. В этой статье мы подробно разберем, как создать базовый файл docker-compose.yml, что необходимо для его работы и как его применять в различных проектах.
1. Что такое Docker Compose и docker-compose.yml?
Docker Compose — это инструмент, который позволяет одновременно управлять несколькими контейнерами Docker. Например, в большинстве веб-приложений, вам нужно несколько сервисов: один для базы данных, другой для веб-сервера, еще один для кеширования и т.д. docker-compose.yml — это файл конфигурации, который описывает, как Docker Compose должен собирать и запускать ваши контейнеры.
С помощью Docker Compose можно:
- Запустить несколько контейнеров одной командой.
- Настроить сеть между контейнерами.
- Описать переменные окружения.
- Установить зависимости между контейнерами.
2. Создание и базовая структура docker-compose.yml
Чтобы создать файл docker-compose.yml, сначала откройте текстовый редактор и создайте новый файл с названием docker-compose.yml. Этот файл обычно хранится в корне проекта и использует YAML-формат (отступы должны быть точно соблюдены, иначе файл не сработает).
version: '3'
services:
app:
image: python:3.8
volumes:
- .:/app
working_dir: /app
command: python app.py
Здесь мы используем version, которая указывает версию Docker Compose. В данном случае мы выбрали '3', так как это одна из самых стабильных версий.
Параметры в файле docker-compose.yml:
- version: указывает версию Docker Compose.
- services: определяет контейнеры, которые необходимо запустить.
- app: название сервиса (в данном случае app), под которым будет запущен контейнер.
- image: Docker-образ, который будет использован для этого сервиса (например, python:3.8).
- volumes: настройка томов для хранения данных. Том позволяет сохранять данные вне контейнера, например, при перезапуске контейнера данные останутся.
- working_dir: рабочая директория контейнера.
- command: команда, которая будет выполняться при запуске контейнера.
3. Подключение нескольких сервисов
Docker Compose позволяет запускать сразу несколько контейнеров, которые могут взаимодействовать друг с другом. Например, для веб-приложения нам нужен не только контейнер для приложения, но и контейнер для базы данных.
version: '3'
services:
web:
image: nginx:latest
ports:
- "8080:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
В этом примере:
- Сервис web использует образ nginx, а порт 8080 на локальной машине будет направлен на порт 80 внутри контейнера, где работает Nginx.
- Сервис db запускает образ MySQL версии 5.7, задав переменную окружения MYSQL_ROOT_PASSWORD.
4. Привязка портов
Привязка портов позволяет направлять трафик с порта на хосте в контейнер. В примере выше ports указывает, что трафик на порту 8080 хоста будет направлен на порт 80 контейнера.
ports:
- "8080:80"
Если у вас будет больше сервисов с привязкой портов, убедитесь, что порты на хосте не совпадают.
5. Настройка томов
Томы позволяют сохранять данные контейнеров. Например, если контейнер MySQL будет перезапущен, без тома все данные будут потеряны. Добавим том в docker-compose.yml:
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
В этом примере том db_data привязан к директории MySQL /var/lib/mysql в контейнере. Теперь данные сохранятся даже после остановки контейнера.
6. Переменные окружения
Переменные окружения позволяют задавать конфигурационные параметры, например, учетные данные для базы данных. Их можно задать прямо в docker-compose.yml или через файл .env.
Пример использования переменных окружения в docker-compose.yml:
services:
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: root_password
Использование файла .env для переменных окружения:
Создайте файл .env в корне проекта и добавьте туда переменные:
MYSQL_DATABASE=mydb
MYSQL_USER=user
MYSQL_PASSWORD=password
MYSQL_ROOT_PASSWORD=root_password
В docker-compose.yml укажите:
services:
db:
image: mysql:5.7
env_file:
- .env
7. Подключение сетей между контейнерами
По умолчанию все контейнеры в Docker Compose находятся в одной сети и могут обращаться друг к другу по названию сервиса. Например, если у вас есть сервисы web и db, то web может подключиться к db по имени сервиса.
services:
web:
image: nginx:latest
ports:
- "8080:80"
db:
image: mysql:5.7
Если требуется настроить более сложную конфигурацию сети, вы можете добавить несколько сетей:
services:
web:
image: nginx:latest
ports:
- "8080:80"
networks:
- frontend
db:
image: mysql:5.7
networks:
- backend
networks:
frontend:
backend:
8. Запуск и управление с помощью Docker Compose
Чтобы запустить все контейнеры, используйте команду:
docker-compose up
Для запуска в фоновом режиме добавьте флаг -d:
docker-compose up -d
Чтобы остановить контейнеры, выполните:
docker-compose down
Эта команда остановит и удалит все контейнеры, созданные этим файлом.
9. Полезные команды Docker Compose
- docker-compose ps — показывает запущенные контейнеры.
- docker-compose logs — просматривает логи контейнеров.
- docker-compose restart — перезапускает контейнеры.
- docker-compose exec <service_name> <command> — выполняет команду внутри работающего контейнера.
10. Пример полного файла docker-compose.yml для веб-приложения с базой данных
Вот пример полного файла docker-compose.yml, который описывает работу веб-сервера и базы данных PostgreSQL:
version: '3'
services:
web:
image: nginx:latest
ports:
- "8080:80"
depends_on:
- app
app:
image: python:3.8
volumes:
- .:/app
working_dir: /app
command: python app.py
db:
image: postgres:13
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- pg_data:/var/lib/postgresql/data
volumes:
pg_data:
Здесь web зависит от app, а db использует том для сохранения данных.
11. Практика и отладка
Создание и настройка docker-compose.yml — это процесс проб и ошибок. Вот несколько советов по отладке и улучшению:
- Используйте docker-compose logs для диагностики ошибок. Эта команда покажет логи, которые помогут найти ошибки в контейнерах.
- Работайте с флагом --build, если вносятся изменения в Dockerfile или зависимости. Команда docker-compose up --build пересоберет образы.
- Изучайте логи каждого сервиса отдельно: docker-compose logs <имя сервиса> даст возможность быстро найти проблему в конкретном сервисе.
Заключение
Файл docker-compose.yml значительно упрощает процесс управления многоконтейнерными приложениями и делает их переносимыми и масштабируемыми. Если вы освоите основы его создания, сможете легко развертывать даже сложные приложения, состоящие из множества сервисов.
Комментарии