🐳 Что это
Docker Patterns — это сборник проверенных практик и шаблонов для работы с Docker и Docker Compose в повседневной разработке. Он охватывает ключевые аспекты: настройку окружения для локальной разработки, безопасность контейнеров, стратегии работы с томами (volumes), сетевые взаимодействия и оркестрацию нескольких сервисов. Skill пригодится, когда нужно быстро настроить или ревьювить Docker-конфигурацию, чтобы избежать типовых ошибок и сразу получить рабочий, безопасный и эффективный стек.
⚙️ Как работает
### Локальный стек с Docker Compose
Skill предлагает типовой docker-compose.yml для веб-приложения:
- app — сервис приложения, собирается из Dockerfile (стадия
dev), монтирует исходники через bind mount для hot-reload, использует анонимный том /app/node_modules, чтобы не перетирать зависимости с хост-машины.
- db — PostgreSQL 16 Alpine с healthcheck (проверка
pg_isready), именованным томом pgdata для данных и SQL-скриптом для инициализации.
- redis — Redis 7 Alpine с томом для персистентности.
- mailpit — локальный SMTP-сервер для тестирования email (веб-интерфейс на порту 8025, SMTP на 1025).
Ключевой приём — depends_on с условием service_healthy для БД: приложение запускается только после того, как PostgreSQL ответит на healthcheck.
### Multi-stage Dockerfile
Пример для Node.js приложения:
- deps — установка зависимостей (
npm ci).
- dev — копирование node_modules из deps, исходников, запуск
npm run dev.
- build — сборка (
npm run build) и удаление dev-зависимостей.
- production — минимальный образ: только
dist, node_modules (production), package.json, непривилегированный пользователь appuser, healthcheck.
Такой подход даёт маленький и безопасный production-образ, а стадия dev остаётся удобной для разработки.
### Override-файлы
- docker-compose.override.yml — загружается автоматически (
docker compose up) и содержит dev-специфичные настройки: debug-логи, порт для отладчика Node.js (9229).
- docker-compose.prod.yml — явно подключается через
-f для продакшена: стадия production, restart: always, лимиты ресурсов.
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
### Сеть и безопасность
Сервисы общаются по именам (service discovery): db:5432, redis:6379. Skill рекомендует custom networks для изоляции: фронтенд видит только API, API видит БД и Redis, но фронтенд не имеет прямого доступа к БД.
networks:
frontend-net:
backend-net:
Для production — порты БД и других внутренних сервисов не публикуются наружу вовсе. Для локальной разработки порт БД можно привязать к 127.0.0.1:5432:5432, чтобы он был доступен только с хост-машины.
Безопасность контейнера:
- Запрет новых привилегий (
no-new-privileges:true).
- Read-only корневая файловая система + tmpfs для
/tmp и кэша.
- Drop всех capabilities, кроме минимально необходимых (
NET_BIND_SERVICE для портов <1024).
- Never
:latest — всегда фиксированная версия образа.
- Секреты — через
.env (не в git!) или Docker Secrets (Swarm), никогда не hardcode.
### Volume-стратегии
- Именованные тома (
pgdata) — для данных, которые должны пережить перезапуск контейнера.
- Bind mount (
.:/app) — для кода, hot-reload.
- Анонимные тома (
/app/node_modules, /app/.next) — чтобы перезаписать директории, которые создаются внутри контейнера (например, при bind mount пустая папка с хоста не стирает node_modules).
### Полезные команды и отладка
# Логи сервиса
docker compose logs -f app
# Зайти в контейнер
docker compose exec app sh
# Проверить DNS внутри контейнера
docker compose exec app nslookup db
# Инспектировать сеть
docker network ls
docker network inspect project_default
# Полная пересборка без кэша
docker compose build --no-cache app
# Осторожно: down -v удалит все тома
docker compose down -v
✅ Когда использовать
Skill незаменим в типовых сценариях:
- Настройка локального окружения — быстро поднять стек с БД, Redis, Mailpit и горячей перезагрузкой.
- Проектирование multi-container архитектур — правильное разделение сетей, healthcheck-и, зависимости.
- Code review Dockerfile и Compose-файлов — проверка на security-уязвимости (root, лишние capabilities, secrets в слоях).
- Переход с локальной разработки на контейнеризацию — готовые паттерны для миграции.
- Оптимизация размера и безопасности образов — multi-stage сборка, .dockerignore, read-only fs.
💡 Важно знать
- Не используй
docker compose в продакшене без оркестратора — для production multi-container нужны Kubernetes, ECS или Docker Swarm.
- Контейнер эфемерен — все данные, не сохранённые в volume, пропадут после
docker compose down.
- Не запускай контейнеры от root — всегда создавай непривилегированного пользователя.
- Не делай один контейнер со всеми сервисами — каждый процесс в отдельном контейнере.
- Не указывай секреты в docker-compose.yml — используй
.env (добавлен в .gitignore) или Docker Secrets.
- Всегда указывай фиксированную версию образа (
node:22.12-alpine3.20 вместо node:latest).
Комментарии
Комментариев пока нет. Будьте первым.