3.1 Файл compose.yaml
Файл compose.yaml (или один из следующих вариантов: docker-compose.yaml, docker-compose.yml, compose.yml) — это основной конфигурационный файл, используемый Docker Compose для определения и управления многоконтейнерными приложениями. Он описывает, какие контейнеры (сервисы) должны быть запущены, как они взаимодействуют друг с другом и какие ресурсы им нужны.
Для единообразия в этой лекции мы будем использовать вариант compose.yaml, так как он рекомендуется для современных версий Docker Compose.
Структура файла compose.yaml
Файл compose.yaml состоит из нескольких разделов, каждый из которых описывает различные аспекты конфигурации приложения. Основные разделы включают:
- version: указывает версию файла Compose (например,
'3.9'). - services: описывает контейнеры (сервисы), их настройки и зависимости.
- volumes: определяет тома для хранения данных между контейнерами и хостом.
- networks: настраивает сети, через которые сервисы общаются друг с другом.
3.2 Основные директивы
1. version
Директива version определяет версию синтаксиса Docker Compose, используемого в файле compose.yaml. На момент написания статьи наиболее актуальной является версия 3, в частности её обновления, такие как 3.8 и 3.9.
version: '3.9'
2. services
Раздел services определяет контейнеры, которые Compose должен создать и запустить. Каждый сервис представляет собой отдельный контейнер с определенной конфигурацией.
Пример:
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
В этом примере определены два сервиса: web и db. Сервис web использует образ nginx:latest и открывает порт 80. Сервис db использует образ mongo:latest и подключает том для хранения данных.
3. volumes
Раздел volumes используется для определения томов, которые могут быть подключены к контейнерам для хранения данных. Это полезно для сохранения данных при перезапуске контейнеров.
Пример:
volumes:
mongo-data:
4. networks
Раздел networks позволяет определить пользовательские сети, в которых будут работать контейнеры. Это обеспечивает изоляцию и настройку сетевых подключений. Если сети не указаны, Docker Compose создаст дефолтную сеть, и все сервисы будут подключены к ней.
Пример:
networks:
front-end:
back-end:
3.3 Директивы для настройки сервисов
Основные директивы для настройки сервисов:
1. image
Директива image указывает образ, который будет использоваться для создания контейнера.
Пример:
services:
web:
image: nginx:latest
2. build
Директива build используется для указания пути к Dockerfile, который должен быть использован для сборки образа.
Пример:
services:
app:
build: ./app
3. ports
Директива ports определяет порты, которые должны быть открыты и перенаправлены с хост-машины на контейнер.
Пример:
services:
web:
image: nginx:latest
ports:
- "80:80"
4. volumes
Директива volumes монтирует тома в контейнеры, что позволяет сохранять данные между перезапусками контейнеров.
Пример:
services:
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
5. environment
Директива environment задаёт переменные окружения для контейнера.
Пример:
services:
app:
image: myapp:latest
environment:
- NODE_ENV=production
- API_KEY=1234567890
6. depends_on
Директива depends_on указывает, что данный сервис зависит от других сервисов и должен быть запущен после них.
Важно! При запуске вашего сервиса у вас нет 100% гарантии, что все необходимые для его работы сервисы полностью готовы. Они будут запущены — да, но дальнейшая работоспособность не гарантируется. Эта проблема решается с помощью health-check, но об этом позднее.
Пример:
services:
web:
image: nginx:latest
depends_on:
- db
db:
image: mongo:latest
7. command
Директива command позволяет переопределить команду, которая будет выполнена при запуске контейнера.
Пример:
services:
app:
image: myapp:latest
command: python app.py
8. networks
Директива networks подключает сервис к одной или нескольким сетям.
Пример:
services:
web:
image: nginx:latest
networks:
- front-end
db:
image: mongo:latest
networks:
- back-end
3.4 Полный пример
Пример полного файла compose.yaml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
networks:
- front-end
app:
build: ./app
volumes:
- ./app:/usr/src/app
environment:
- NODE_ENV=production
networks:
- front-end
- back-end
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
networks:
- back-end
volumes:
mongo-data:
networks:
front-end:
back-end:
В этом примере:
- Определены три сервиса:
web,appиdb. -
webиспользует образ Nginx, монтирует конфигурационный файл и зависит от сервисаapp. -
appсобирается из локального Dockerfile, монтирует исходный код приложения и использует переменные окружения. -
dbиспользует образ MongoDB и монтирует том для хранения данных. - Созданы два тома и две сети для изоляции и управления взаимодействием сервисов.
Примечание: один том – это mongo-data, а второй – это замаунченная директория с хост-машины (например, ./app).
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ