Docker в проде и дома — это не «знать 200 подкоманд», а предсказуемый цикл: поднять, обновить, посмотреть логи, откатиться. Шпаргалка под Compose V2 🧭

Compose V2, не python-пакет #

docker compose version
# не docker-compose (с дефисом) — он legacy

Типичный стек:

# docker-compose.yml
services:
  web:
    image: nginx:1.26.3
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1/"]
      interval: 30s
      timeout: 3s
      retries: 3
docker compose up -d
docker compose ps
docker compose logs -f --tail=100 web
docker compose pull && docker compose up -d
docker compose down          # контейнеры; тома named — отдельно

Тома: named vs bind #

ТипЗачем
Bind ./data:/dataконфиг в git, данные рядом с репо
Named pgdata:/var/lib/postgresql/dataБД, чтобы down не снёс files
docker volume ls
docker volume inspect pgdata

Бэкап named volume:

docker run --rm -v pgdata:/data -v "$PWD":/backup alpine \
  tar czf /backup/pgdata.tgz -C /data .

Логи и отладка #

docker compose logs -f web
docker exec -it web sh
docker inspect web --format '{{.State.Health.Status}}'

Если контейнер в restart loop:

docker compose ps
docker inspect web --format '{{.State.Status}} {{.State.OOMKilled}}'
# смотреть exit code и последние логи без -f

Обновления без сюрпризов #

  1. Pin тег (1.26.3), не latest.
  2. pullup -d → smoke (curl, health).
  3. Держать docker-compose.yml в git; секреты — в .env (gitignore) или secrets.
docker image prune -f
docker system df

Осторожно с docker system prune -a — снесёт неиспользуемые образы, которые вы ещё хотели.

Безопасность (коротко) #

  • не монтировать docker.sock «для удобства» в недоверенные контейнеры;
  • user: / non-root в Dockerfile;
  • publish порты только на 127.0.0.1: если снаружи есть reverse-proxy;
  • secrets не в environment: в git.

Итог #

Освойте compose up/logs/pull, healthcheck и бэкап томов — этого достаточно для 90 % домашних стеков. Оркестраторы (k8s) подключайте, когда compose уже жмёт, а не «потому что так модно» 🚢