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: 3docker 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Обновления без сюрпризов #
- Pin тег (
1.26.3), неlatest. pull→up -d→ smoke (curl, health).- Держать
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 уже жмёт, а не «потому что так модно» 🚢