Перейти к содержимому

9. Docker Compose

Docker Compose — инструмент для описания и запуска многоконтейнерных Docker-приложений. Вся конфигурация хранится в файле 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 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 файл (автоматически загружается)
POSTGRES_PASSWORD=secret
NODE_ENV=production
API_PORT=3000
services:
api:
environment:
- NODE_ENV=${NODE_ENV}
- PORT=${API_PORT:-3000} # значение по умолчанию
ports:
- "${API_PORT:-3000}:3000"
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: 10s
services:
app:
image: myapp
debug-tools:
image: nicolaka/netshoot
profiles: ["debug"] # запускается только с --profile debug
monitoring:
image: prom/prometheus
profiles: ["monitoring"]
Окно терминала
docker compose --profile debug up
docker compose --profile monitoring up