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.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ