DevOps & Docker
Как Claude Code работает с Docker-контейнерами через MCP, настраивает WSL2 и Caddy, и не ломает продакшн. Полный разбор — от основ до безопасности.
Зачем Docker в связке с Claude Code
Docker упаковывает приложение со всеми зависимостями в изолированный «контейнер» — он работает одинаково на любой машине. Для Claude Code это важно: CC может запускать команды, миграции и тесты внутри контейнера, не засоряя вашу систему и не завися от локальных версий PHP/Python/Node.
docker через Bash — это ненадёжно. Используйте MCP-инструменты mcp__docker__*, которые работают через Docker SDK напрямую.Четыре понятия, которые нужно знать
postgres:16. Из образа создаются контейнеры.my-project-backend-1.Что Claude Code умеет с Docker
Docker через MCP (не через Bash)
На Windows с WSL2 прямые docker команды из Claude Code часто не работают из-за PATH. Кроме того, Bash hook в настройках блокирует их явно. Правило: всегда использовать mcp__docker__* инструменты.
bash-mcp-guard.cjs) перехватит любой docker exec и предложит альтернативу.Полный справочник Docker MCP инструментов
| MCP инструмент | Аналог docker команды | Когда использовать |
|---|---|---|
docker_exec | docker exec -it | Запуск команд внутри контейнера |
docker_container_logs | docker logs | Просмотр логов контейнера |
docker_list_containers | docker ps -a | Список всех контейнеров |
docker_inspect_container | docker inspect | Детальная информация о контейнере |
docker_container_stats | docker stats | CPU/RAM использование |
docker_start_container | docker start | Запустить остановленный контейнер |
docker_stop_container | docker stop | Остановить контейнер |
docker_restart_container | docker restart | Перезапустить контейнер |
docker_compose_ps | docker compose ps | Статус compose-стека |
docker_compose_logs | docker compose logs | Логи всего стека |
docker_compose_up | docker compose up -d | Запуск стека |
docker_compose_down | docker compose down | Остановка стека (без --volumes!) |
docker_compose_restart | docker compose restart | Перезапуск сервиса в стеке |
docker_list_images | docker images | Список образов |
docker_create_network | docker network create | Создать сеть |
docker_list_networks | docker network ls | Список сетей |
Подключение Docker MCP
Глобальные MCP-серверы прописываются в ~/.claude.json (не в settings.json, не в settings.local.json). Три точки входа покрывают все Docker-потребности:
mcp__MCP_DOCKER__* инструменты. Docker Desktop должен быть запущен с WSL2 backend.WSL2 — настройка памяти
На Windows Server 2025 с 47 GB RAM конфигурация WSL2 критична для Docker. OOM убивал PostgreSQL при ETL-операциях — решение зафиксировано.
Caddy Reverse Proxy
Все публичные домены проксируются через Caddy. Caddy — единственный сервис, занимающий порты 80/443. Никакой другой контейнер не биндится на эти порты.
Расположение и управление
Текущая маршрутизация
Снимок на момент написания — актуальный список даёт proxy list.
| Домен | Upstream |
|---|---|
| phone.rosveb.ru | phone-rosveb-ru-frontend-1:3000/api/* → phone-rosveb-ru-backend-1:8000 |
| massage.rosveb.ru | project-nginx-1:80 |
| dev.gulaev.ru | gulaev-nginx:80 |
| notal.rosveb.ru | notal-nginx:80 |
| gis.rosveb.ru | catalog_nginx:80 |
Добавление нового сайта — чек-лист
Docker Compose — лучшие практики
Шаблон compose для Laravel-проекта
<проект>-<сервис>-1. Это совпадает с автоматическим именованием Compose и важно для Caddy, который обращается по имени через embedded DNS.docker compose down --volumes уничтожает все named volumes — включая данные PostgreSQL. Если вы попросили CC «перезапустить стек», убедитесь что он не добавил флаг --volumes. Используйте docker_compose_down через MCP (без флага), а данные БД всегда держите в named volumes, а не в bind mounts.
Выполнение команд внутри контейнеров
Laravel Artisan через Docker MCP
Python / FastAPI команды
Health Checks и мониторинг
Признаки OOM и решение
| Симптом | Диагноз | Решение |
|---|---|---|
| Контейнер перезапускается сам | OOM killer | Уменьшить shared_buffers в PG, увеличить WSL2 memory |
Exit code 137 | SIGKILL от OOM | Снизить max_parallel_workers в PG |
| Медленные запросы при ETL | Swap активен | Снизить work_mem, добавить батчинг |
| PG не стартует | shared_buffers > 25% WSL2 | ALTER SYSTEM SET shared_buffers = '4GB' |
Безопасность контейнеров
docker-compose.production.yml. Для редактирования — установить переменную CONFIRM_CRITICAL=yes или изменить вручную.Docker + Claude Code: плюсы и минусы
- Изоляция: CC не трогает вашу систему, работает в контейнере
- Воспроизводимость: одинаково на dev и prod
- MCP даёт предсказуемый, безопасный доступ без shell
- CC видит логи и статус — отлаживает по реальным данным
- Откат: пересоздать контейнер проще, чем чинить систему
- Кривая обучения: образы, тома, сети — надо понять
- На Windows нужен WSL2 + правильная настройка памяти
- Bash-команды
dockerненадёжны — только MCP -
down --volumesможет уничтожить данные БД - Опубликованные порты БД = дыра в безопасности
Типовые ошибки
- docker compose down --volumes на продеФлаг
--volumesудаляет named volumes вместе с данными PostgreSQL. Используйтеdocker_compose_downчерез MCP (без флага), держите данные в named volumes. - Публикация портов БД наружу
ports: "5432:5432"открывает PostgreSQL в интернет. БД — только во внутренней сети, без секцииports. - docker exec через Bash на WindowsИз-за PATH в WSL2 команды часто молча падают или зависают. CC должен использовать
mcp__docker__docker_exec. - Большой swap в WSL2 «чтобы хватило памяти»Большой swap маскирует OOM и резко замедляет работу. Правило: WSL2 memory = 80% RAM, swap = 2GB.
- Bind mount для данных БД вместо volumeBind mount на Windows-папку медленный и ломает права. Данные БД — всегда в named volume.
- Свой контейнер на портах 80/443Эти порты заняты Caddy. Дев-доступ — через свободные порты. Публичные домены — через
proxy add.
Частые вопросы
docker в Bash зависит от PATH и часто молча падает. MCP-инструменты используют Docker SDK напрямую — надёжнее и безопаснее. Bash-хук блокирует docker и предлагает MCP-альтернативу.MCP_DOCKER в ~/.claude.json (см. «Подключение»). Docker Desktop должен работать с WSL2 backend. После этого CC получит доступ к mcp__docker__*.docker compose down --volumes в deny-лист, используйте docker_compose_down через MCP. Регулярные бэкапы тома обязательны.shared_buffers и max_parallel_workers в PostgreSQL, добавьте батчинг в ETL.proxy connect <сеть>, proxy add домен container:port, адаптация под reverse proxy (TrustProxies в Laravel, --proxy-headers в FastAPI). Не публикуйте порты 80/443 в своём compose.