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