Полный гид по синтаксису файла `docker-compose.yaml`
Файл docker-compose.yaml — это основа работы с Docker Compose. С его помощью вы можете описывать, как ваши контейнеры должны взаимодействовать друг с другом, какие порты использовать, как обрабатывать данные, и многое другое. В этой статье мы подробно разберем синтаксис файла docker-compose.yaml, его структуру и ключевые параметры, которые помогут вам эффективно управлять многоконтейнерными приложениями.
Основы структуры файла docker-compose.yaml
Файл docker-compose.yaml использует формат YAML (YAML Ain't Markup Language), который легок для чтения и написания. Основные элементы файла:
- version: Определяет версию Docker Compose файла.
- services: Основной блок, в котором описываются все контейнеры (сервисы), которые будут запущены.
- volumes: Определяет тома, которые могут использовать контейнеры для хранения данных.
- networks: Описывает сети, используемые для взаимодействия между контейнерами.
- configs и secrets: Используются для управления конфиденциальной информацией, такой как файлы конфигурации и секретные данные.
Версия файла
Первая строка в docker-compose.yaml указывает версию формата, например:
version: '3.8'
Это важно, так как синтаксис и функции, доступные в docker-compose.yaml, могут зависеть от версии. На данный момент рекомендуется использовать версии 3.x, так как они поддерживаются большинством инструментов.
Определение сервисов
Раздел services — это ядро вашего docker-compose.yaml. Здесь вы описываете контейнеры, которые необходимо запустить. Каждый сервис включает контейнер и его настройки, такие как образ, порты, переменные среды, тома и многое другое.
Пример простого определения двух сервисов — веб-сервера NGINX и базы данных MySQL:
version: '3.8'
services:
web:
image: nginx
ports:
- "8080:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
- image: Указывает образ, который будет использоваться для запуска контейнера. В примере NGINX и MySQL.
- ports: Пробрасывает порты. В данном случае порт 80 контейнера NGINX будет доступен через порт 8080 хоста.
- environment: Переменные окружения, необходимые для работы контейнера. Например, для MySQL устанавливается пароль пользователя root.
Расширенные параметры для сервисов
Кроме базовых параметров, есть множество других опций, которые можно использовать для настройки сервисов.
Переменные окружения (environment)
Вы можете задавать переменные окружения, которые будут доступны внутри контейнера:
environment:
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_DATABASE: mydatabase
Эти переменные могут быть необходимы для настройки приложения или базы данных.
Монтирование томов (volumes)
Для сохранения данных между перезапусками контейнеров, можно использовать тома. Вот как указать том для хранения данных базы данных:
volumes:
- db_data:/var/lib/mysql
Здесь db_data — это имя тома, а /var/lib/mysql — путь в контейнере, куда будет монтироваться том.
Перезапуск контейнеров (restart)
Для автоматического перезапуска контейнеров в случае сбоя можно использовать параметр restart:
restart: always
Возможные значения:
- no — контейнеры не будут перезапускаться.
- always — контейнер будет перезапущен в любом случае.
- on-failure — контейнер будет перезапущен только в случае ошибки.
- unless-stopped — контейнер будет перезапускаться, если его не остановить вручную.
Зависимости между сервисами (depends_on)
Если один контейнер должен быть запущен до другого (например, база данных перед веб-сервером), можно использовать параметр depends_on:
depends_on:
- db
Это указывает, что сервис web зависит от сервиса db, и база данных будет запущена раньше.
Команды для запуска (command)
Иногда может понадобиться переопределить команду, которая запускается внутри контейнера. Для этого можно использовать параметр command:
command: ["nginx", "-g", "daemon off;"]
Этот пример указывает контейнеру NGINX запуститься в режиме foreground (по умолчанию NGINX работает в режиме демона).
Определение томов
Тома позволяют сохранять данные контейнера на хосте. Это полезно для баз данных и других сервисов, которым необходимо сохранять данные после перезапуска контейнера.
Пример создания и использования томов:
version: '3.8'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
Здесь том db_data создается и подключается к базе данных MySQL.
Определение сетей
С помощью раздела networks можно создавать изолированные сети для контейнеров. Это позволяет контролировать, какие контейнеры могут взаимодействовать друг с другом.
Пример настройки сети:
version: '3.8'
services:
web:
image: nginx
networks:
- frontend
db:
image: mysql:5.7
networks:
- backend
networks:
frontend:
backend:
В этом примере веб-сервер и база данных работают в разных сетях. Таким образом, они не могут напрямую общаться друг с другом, если это не требуется.
Использование secrets и configs
В docker-compose.yaml можно определять секретные данные и конфигурации, которые контейнеры могут использовать. Это особенно полезно для хранения конфиденциальных данных, таких как пароли, ключи и сертификаты.
Секреты (secrets)
Секреты можно использовать для передачи конфиденциальной информации в контейнер:
version: '3.8'
services:
db:
image: mysql:5.7
secrets:
- mysql_root_password
secrets:
mysql_root_password:
file: ./secrets/mysql_root_password.txt
Этот пример подключает секретный файл с паролем для базы данных.
Конфигурации (configs)
Конфигурации позволяют передавать файлы конфигурации в контейнеры. Пример использования конфигураций:
version: '3.8'
services:
web:
image: nginx
configs:
- nginx_config
configs:
nginx_config:
file: ./nginx.conf
Этот пример подключает файл конфигурации NGINX к контейнеру.
Пример полного файла docker-compose.yaml
Вот пример более сложного файла docker-compose.yaml, который включает веб-сервер, базу данных и кэширование с Redis:
version: '3.8'
services:
web:
image: flask
build: .
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
- db
- redis
db:
image: postgres:13
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- db_data:/var/lib/postgresql/data
redis:
image: "redis:alpine"
volumes:
db_data:
В этом примере:
- web: Flask-приложение, которое зависит от базы данных и Redis.
- db: PostgreSQL база данных с томом для сохранения данных.
- redis: Кэширование с Redis.
Заключение
Файл docker-compose.yaml предоставляет гибкие возможности для описания и управления многоконтейнерными приложениями. Он упрощает процессы развертывания, тестирования и разработки. Понимание синтаксиса и функциональности этого файла позволит вам эффективно управлять любыми проектами на Docker, независимо от их сложности.
Комментарии