7.1 Монтирование томов
Монтирование томов и сетей в Docker Compose позволяет создавать гибкие и эффективные многоконтейнерные приложения. Тома (volumes) используются для хранения данных, которые должны сохраняться вне контейнеров, в то время как сети (networks) обеспечивают взаимодействие между контейнерами. В этой лекции мы подробно рассмотрим, как использовать тома и сети в Docker Compose.
Тома в Docker позволяют сохранять данные вне контейнеров, обеспечивая их доступность даже после остановки или удаления контейнеров. Это особенно полезно для хранения данных баз данных, файлов журналов и других данных, которые должны быть долговременными.
Типы томов:
- Именованные тома (Named Volumes): управляются Docker и сохраняются в специальной директории на хосте.
- Привязанные тома (Bind Mounts): монтируются в контейнер из указанной директории на хосте.
Задание томов в Docker Compose
Пример именованных томов
В этом примере создан именованный том postgres-data, который монтируется в директорию /var/lib/postgresql/data внутри контейнера db.
version: '3.8'
services:
db:
image: postgres:latest
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
Пример привязанных томов
В этом примере локальные директории и файлы nginx.conf и html монтируются в контейнер web как привязанные тома.
version: '3.8'
services:
web:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
7.2 Монтирование сетей
Сети в Docker Compose позволяют контейнерам взаимодействовать друг с другом. Каждый контейнер может быть подключён к одной или нескольким сетям, что обеспечивает изоляцию и управление трафиком.
Типы сетей:
- Мостовые сети (Bridge): по умолчанию контейнеры подключаются к мостовой сети, которая обеспечивает их взаимодействие на одном хосте.
- Оверлейные сети (Overlay): используются для взаимодействия контейнеров, запущенных на разных хостах в кластере Docker Swarm.
- Сетевые плагины (Network Plugins): позволяют использовать сторонние сетевые драйверы для более сложных конфигураций.
Пример создания и использования пользовательских сетей
В этом примере создаются две пользовательские сети front-end и back-end. Сервис app подключён к обеим сетям, сервис web только к front-end, а сервис db только к back-end.
version: '3.8'
services:
web:
image: nginx:latest
networks:
- front-end
app:
image: myapp:latest
networks:
- front-end
- back-end
db:
image: postgres:latest
networks:
- back-end
networks:
front-end:
back-end:
Практические советы:
- Использование именованных томов: именованные тома управляются Docker и обеспечивают простоту использования и управления данными. Именованные тома можно подключать к нескольким сервисам одновременно. Например, сервис бекенда записывает логи, а мониторинг-сервис анализирует их и уведомляет при обнаружении ошибок уровня
error. - Разделение сетей: использование нескольких сетей позволяет изолировать различные части приложения и контролировать их взаимодействие.
- Хранение конфигурационных файлов: используйте привязанные тома для монтирования конфигурационных файлов, что позволяет легко изменять конфигурацию без пересборки образов.
- Безопасность сетей: ограничьте доступ к сетям, чтобы только необходимые контейнеры могли взаимодействовать, что повышает безопасность приложения.
7.3 Примеры использования томов и сетей
Примеры использования томов и сетей в Docker Compose:
Пример 1: Приложение с веб-сервером и базой данных
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
networks:
- webnet
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- db-data:/var/lib/postgresql/data
networks:
- webnet
volumes:
db-data:
networks:
webnet:
В этом примере:
- Веб-сервер nginx и база данных PostgreSQL подключены к одной сети webnet, что позволяет им взаимодействовать. Если сеть одна, её можно не указывать — будет создана дефолтная сеть.
- Данные базы данных хранятся в именованном томе db-data, что обеспечивает их сохранность при перезапуске контейнеров.
Пример 2: Приложение с несколькими уровнями
version: '3.8'
services:
frontend:
image: myfrontend:latest
networks:
- front-tier
- back-tier
backend:
image: mybackend:latest
networks:
- back-tier
volumes:
- backend-data:/var/lib/backend
database:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db-data:/var/lib/mysql
networks:
- back-tier
volumes:
backend-data:
db-data:
networks:
front-tier:
back-tier:
В этом примере:
- Созданы две сети: front-tier и back-tier.
- Сервис frontend подключён к обеим сетям, что позволяет ему взаимодействовать как с backend, так и с внешними клиентами.
- Сервисы backend и database подключены только к сети back-tier для обеспечения их изоляции и взаимодействия.
- Данные сервисов backend и database хранятся в отдельных именованных томах backend-data и db-data.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ