Модуль 10 / 18
Docker Compose: модель застосунку та середовища
Зміст
1. Цілі та модель Compose
Після модуля ви зможете описати multi-container застосунок декларативно, обчислити підсумкову конфігурацію, керувати project lifecycle та діагностувати розбіжність між YAML і об’єктами Engine.
- Compose Specification описує бажану модель
- service — шаблон контейнерів
- project ізолює імена та lifecycle
- config показує обчислену модель
- up узгоджує об’єкти, down видаляє project resources
2. Теорія: project, service та resource
Compose CLI перетворює compose.yaml на модель project і викликає Docker API. Це не окремий orchestrator: контейнери виконує той самий Engine. Service задає image, command, environment, mounts і networks.
Project name входить до labels і типових імен ресурсів. Його задають top-level name, -p, COMPOSE_PROJECT_NAME або каталог за визначеним пріоритетом. Стабільне ім’я захищає сусідній project.
3. Теорія: обчислення конфігурації
YAML на диску ще не є effective configuration. Compose об’єднує файли, обробляє anchors, profiles та interpolation і нормалізує syntax. docker compose config показує результат до створення об’єктів.
Змінні для interpolation надходять із shell та env-файлів за precedence. environment service належить контейнеру й не тотожний джерелам interpolation. Secrets не зберігають у committed .env.
4. Теорія: up, run, exec і down
up створює або перестворює змінені services, networks і volumes. Повторний up має бути ідемпотентним. stop зберігає контейнери, start запускає їх, down видаляє project containers та networks.
exec запускає процес у наявному service container. run створює окремий one-off container і типово не публікує service ports. --rm керує лише ним.
5. Теорія: DNS, ports та volumes
Default network створюється на project, а service names стають DNS-іменами. Між services використовують container port; ports потрібні для доступу з host або ззовні.
Named volumes оголошують явно. down не видаляє їх без -v. External resources Compose не створює й не повинен видаляти.
6. Теорія: profiles, scale та межі Compose
Profiles вмикають необов’язкові services: debug, migration або maintenance. Service без profile запускається завжди.
Scale створює кілька контейнерів service, але fixed container_name і host port заважають. Compose одного Engine не забезпечує multi-host scheduling, rolling update чи cluster failover.
7. Методичні вказівки
- Запускайте config --quiet і переглядайте config
- Фіксуйте image version або digest
- Не задавайте container_name без потреби
- Розділяйте build-time і runtime variables
- Прив’язуйте локальні ports до 127.0.0.1
- Використовуйте labels для ownership
- Не застосовуйте down -v без перевірки даних
- Працюйте з відомого project directory
8. Лабораторна робота: Compose project
Створіть web та опціональний debug client, дослідіть interpolation і project name.
mkdir -p /tmp/docker-module-10/html
printf '%s\n' '<!doctype html><html><meta charset="utf-8"><title>Compose lab</title><h1>compose works</h1></html>' > /tmp/docker-module-10/html/index.html
printf '%s\n' 'WEB_PORT=18090' 'APP_ENV=lab' > /tmp/docker-module-10/.env
printf '%s\n' 'name: docker-m10' 'services:' ' web:' ' image: nginx:1.29-alpine' ' ports:' ' - "127.0.0.1:${WEB_PORT:-18090}:80"' ' volumes:' ' - type: bind' ' source: ./html' ' target: /usr/share/nginx/html' ' read_only: true' ' environment:' ' APP_ENV: ${APP_ENV:-development}' ' networks: [frontend]' ' labels:' ' course.module: "10"' ' client:' ' image: alpine:3.21' ' command: ["sh", "-c", "sleep 300"]' ' profiles: [debug]' ' networks: [frontend]' 'networks:' ' frontend:' ' name: docker-m10-frontend' > /tmp/docker-module-10/compose.yaml
cd /tmp/docker-module-10
docker compose version
docker compose config --quiet
docker compose config
docker compose config --services
docker compose config --imagescd /tmp/docker-module-10
docker compose config --environment
docker compose config --format json | jq '{name,services:(.services | keys),networks:(.networks | keys)}'
WEB_PORT=18091 APP_ENV=override docker compose config --format json | jq '.services.web | {environment,ports}'
docker compose -p docker-m10-alt config --format json | jq '.name'Запустіть profile, перевірте DNS і host publishing, потім reconciliation та scale.
cd /tmp/docker-module-10
docker compose --profile debug up --detach
docker compose ps
docker compose images
docker compose exec --interactive=false client wget -qO- http://web/
curl --fail --silent --show-error --retry 10 --retry-connrefused --retry-delay 1 http://127.0.0.1:18090/
docker compose logs --no-color --tail 20 web
docker compose topcd /tmp/docker-module-10
docker compose --profile debug up --detach --scale client=2
docker compose ps --format json | jq -s 'map({Name,Service,State})'
docker compose --profile debug up --detach
docker compose psКритерій: config валідний; client отримує сторінку за ім’ям web; loopback port відповідає; повторний up зберігає бажаний стан.
9. Діагностика Compose
Рухайтеся від effective model до project labels і фактичних об’єктів. Не починайте з видалення project.
cd /tmp/docker-module-10
docker compose config --quiet
docker compose ps --all
docker compose logs --no-color --timestamps --tail 50
docker compose events --json --since 10m --until 0s 2>/dev/null | tail -20 || true
docker network inspect docker-m10-frontend
docker inspect docker-m10-web-1 --format '{{json .Config.Labels}}' | jq- config: interpolation, merge та profiles
- ps --all: exited і restarting containers
- logs: stderr/stdout services
- inspect labels: project, service та config hash
- network/volume inspect: membership і ownership
- events: create/start/die
10. Контроль і cleanup
- Чим service відрізняється від container?
- Як визначається project name?
- Чому config важливіший за один YAML?
- Чим run відрізняється від exec?
- Що видаляє down?
- Чому container_name заважає scale?
- Навіщо profiles?
- Де межі Compose?
cd /tmp/docker-module-10
docker compose --profile debug down --remove-orphans
cd /
rm -f /tmp/docker-module-10/compose.yaml /tmp/docker-module-10/.env /tmp/docker-module-10/html/index.html
rmdir /tmp/docker-module-10/html /tmp/docker-module-10
docker ps -a --filter label=com.docker.compose.project=docker-m10
docker network ls --filter name=docker-m10Модуль засвоєно, якщо ви прогнозуєте effective configuration, безпечно керуєте project lifecycle і знаходите об’єкт за Compose labels.