9. Docker Compose
Docker Compose — инструмент для описания и запуска многоконтейнерных Docker-приложений. Вся конфигурация хранится в файле docker-compose.yml, что делает её воспроизводимой и документированной.
Структура docker-compose.yml
Заголовок раздела «Структура docker-compose.yml»version: '3.8'
services: frontend: image: nginx:alpine ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - api networks: - web
api: build: context: ./api dockerfile: Dockerfile environment: - NODE_ENV=production - DATABASE_URL=postgresql://user:pass@postgres/mydb depends_on: postgres: condition: service_healthy networks: - web - db
postgres: image: postgres:15-alpine environment: POSTGRES_DB: mydb POSTGRES_USER: user POSTGRES_PASSWORD: pass volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U user -d mydb"] interval: 10s timeout: 5s retries: 5 networks: - db
volumes: postgres_data:
networks: web: db: internal: trueОсновные команды Docker Compose
Заголовок раздела «Основные команды Docker Compose»# Запустить все сервисы (в фоне)docker compose up -d
# Запустить и пересобрать образыdocker compose up -d --build
# Остановить и удалить контейнерыdocker compose down
# Остановить и удалить с томамиdocker compose down -v
# Список запущенных сервисовdocker compose ps
# Просмотр логов всех сервисовdocker compose logs -f
# Логи конкретного сервисаdocker compose logs -f api
# Выполнить команду в сервисеdocker compose exec api sh
# Пересобрать конкретный образdocker compose build api
# Масштабировать сервисdocker compose up -d --scale api=3
# Перезапустить сервисdocker compose restart apiПеременные и .env файлы
Заголовок раздела «Переменные и .env файлы»# .env файл (автоматически загружается)POSTGRES_PASSWORD=secretNODE_ENV=productionAPI_PORT=3000services: api: environment: - NODE_ENV=${NODE_ENV} - PORT=${API_PORT:-3000} # значение по умолчанию ports: - "${API_PORT:-3000}:3000"depends_on и healthcheck
Заголовок раздела «depends_on и healthcheck»services: api: depends_on: postgres: condition: service_healthy # ждать готовности redis: condition: service_started # просто дождаться запуска
postgres: healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 start_period: 10sProfiles — условный запуск
Заголовок раздела «Profiles — условный запуск»services: app: image: myapp
debug-tools: image: nicolaka/netshoot profiles: ["debug"] # запускается только с --profile debug
monitoring: image: prom/prometheus profiles: ["monitoring"]docker compose --profile debug updocker compose --profile monitoring up