← До програми курсу

Модуль 10 / 18

Docker Compose: модель застосунку та середовища

DOCKER

Зміст
01

1. Цілі та модель Compose

Після модуля ви зможете описати multi-container застосунок декларативно, обчислити підсумкову конфігурацію, керувати project lifecycle та діагностувати розбіжність між YAML і об’єктами Engine.

  • Compose Specification описує бажану модель
  • service — шаблон контейнерів
  • project ізолює імена та lifecycle
  • config показує обчислену модель
  • up узгоджує об’єкти, down видаляє project resources
02

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.

03

3. Теорія: обчислення конфігурації

YAML на диску ще не є effective configuration. Compose об’єднує файли, обробляє anchors, profiles та interpolation і нормалізує syntax. docker compose config показує результат до створення об’єктів.

Змінні для interpolation надходять із shell та env-файлів за precedence. environment service належить контейнеру й не тотожний джерелам interpolation. Secrets не зберігають у committed .env.

04

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 керує лише ним.

05

5. Теорія: DNS, ports та volumes

Default network створюється на project, а service names стають DNS-іменами. Між services використовують container port; ports потрібні для доступу з host або ззовні.

Named volumes оголошують явно. down не видаляє їх без -v. External resources Compose не створює й не повинен видаляти.

06

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.

07

7. Методичні вказівки

  • Запускайте config --quiet і переглядайте config
  • Фіксуйте image version або digest
  • Не задавайте container_name без потреби
  • Розділяйте build-time і runtime variables
  • Прив’язуйте локальні ports до 127.0.0.1
  • Використовуйте labels для ownership
  • Не застосовуйте down -v без перевірки даних
  • Працюйте з відомого project directory
08

8. Лабораторна робота: Compose project

Створіть web та опціональний debug client, дослідіть interpolation і project name.

terminal
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 --images
terminal
cd /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.

terminal
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 top
terminal
cd /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 зберігає бажаний стан.

09

9. Діагностика Compose

Рухайтеся від effective model до project labels і фактичних об’єктів. Не починайте з видалення project.

terminal
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

10. Контроль і cleanup

  • Чим service відрізняється від container?
  • Як визначається project name?
  • Чому config важливіший за один YAML?
  • Чим run відрізняється від exec?
  • Що видаляє down?
  • Чому container_name заважає scale?
  • Навіщо profiles?
  • Де межі Compose?
terminal
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.