Тема
Docker
Стандартная конфигурация
Сервисы
| Сервис | Образ | Назначение |
|---|---|---|
| app | php:8.x-fpm + расширения | PHP-FPM application |
| nginx | nginx:alpine | Web-сервер, проксирование |
| mysql | mysql:8 | База данных |
| redis | redis:7-alpine | Кеш, сессии, очередь |
| queue | тот же что app | php artisan queue:work |
| scheduler | тот же что app | php artisan schedule:work |
Структура файлов
project/
├── docker/
│ ├── app/Dockerfile
│ ├── nginx/default.conf
│ └── scheduler/entrypoint.sh
├── docker-compose.yml
├── docker-compose.dev.yml
└── src/ — Laravel rootPHP расширения (обязательные)
pdo_mysql, redis, gd, exif, zip, bcmath, intl, opcache
Команды
Жизненный цикл
| Команда | Действие |
|---|---|
docker compose up -d | Запуск всех сервисов |
docker compose down | Остановка |
docker compose restart app | Перезапуск PHP |
docker compose logs -f app | Логи приложения |
docker compose logs -f queue | Логи очереди |
Artisan / Composer
ВСЕГДА через docker exec:
| Команда | Действие |
|---|---|
docker exec {container} php artisan migrate | Миграции |
docker exec {container} php artisan db:seed | Сидеры |
docker exec {container} php artisan cache:clear | Очистка кеша |
docker exec {container} php artisan queue:restart | Перезапуск воркеров |
docker exec {container} composer install | Установка зависимостей |
docker exec {container} composer require pkg | Добавление пакета |
docker exec -it {container} bash | Shell в контейнер |
Никогда не запускать artisan/composer на хосте — версии PHP/расширений могут отличаться.
Environment (.env)
Обязательные переменные для Docker
| Переменная | Значение в Docker |
|---|---|
DB_HOST | mysql (имя сервиса) |
REDIS_HOST | redis (имя сервиса) |
CACHE_DRIVER | redis |
SESSION_DRIVER | redis |
QUEUE_CONNECTION | redis |
Правила
.env— НИКОГДА в git (.gitignore).env.example— шаблон с пустыми значениями, ВСЕГДА в git- Секреты (API-ключи, токены) — только в
.env, доступ черезconfig() - Для каждого окружения (dev/staging/prod) — свой
.env
Dev vs Production
Development (docker-compose.dev.yml)
- Xdebug включён
- Volume монтирование
src/для hot reload - Ports exposed на localhost
APP_DEBUG=true
Production
- opcache включён с preloading
- Nginx: gzip, кеш статики, security headers
- MySQL: bind только к internal network
- Redis:
maxmemory-policy allkeys-lru - Volumes:
storage/,bootstrap/cache/, MySQL data, Redis data APP_DEBUG=false— без исключений- HTTPS — обязателен (Let's Encrypt / Caddy)
Anti-patterns
| Паттерн | Проблема | Решение |
|---|---|---|
| artisan/composer на хосте | Версия PHP/расширений отличается | docker exec |
.env в git | Утечка секретов | .gitignore + .env.example |
APP_DEBUG=true в production | Stack traces видны пользователям | false |
| MySQL port exposed в production | Доступ извне | Только internal network |
| Нет volume для MySQL data | Потеря данных при docker compose down | Named volume |
| Один docker-compose для dev и prod | Конфликт настроек | Отдельный .dev.yml override |
| Нет queue/scheduler сервисов | Jobs не обрабатываются, cron не работает | Отдельные контейнеры |
Windows + Git Bash: PATH для Docker
На Windows docker установлен в C:\Program Files\Docker\Docker\resources\bin\ — эта папка не добавляется автоматически в PATH при использовании Git Bash (bash из Claude Code).
Симптомы
/usr/bin/bash: line 1: docker: command not found
which: no docker in (/mingw64/bin:/usr/bin:...)Решение в командах Bash-инструмента
Всегда добавляй PATH перед командами docker:
bash
export PATH="$PATH:/c/Program Files/Docker/Docker/resources/bin" && docker exec referendum ...Или для npm/artisan через контейнер:
bash
export PATH="$PATH:/c/Program Files/Docker/Docker/resources/bin" && docker exec referendum npm run build
export PATH="$PATH:/c/Program Files/Docker/Docker/resources/bin" && docker exec referendum php artisan migrateКонтейнеры проекта referendum
| Роль | Имя контейнера |
|---|---|
| App (PHP + Node) | referendum |
| PostgreSQL | referendum-postgres |
| Redis | referendum-redis |
Типичные команды для проекта
bash
DOCKER="export PATH=$PATH:/c/Program\ Files/Docker/Docker/resources/bin && docker"
# Миграции
export PATH="$PATH:/c/Program Files/Docker/Docker/resources/bin" && docker exec referendum php artisan migrate
# Сидеры
export PATH="$PATH:/c/Program Files/Docker/Docker/resources/bin" && docker exec referendum php artisan db:seed
# Build фронтенда
export PATH="$PATH:/c/Program Files/Docker/Docker/resources/bin" && docker exec referendum npm run build
# Shell
export PATH="$PATH:/c/Program Files/Docker/Docker/resources/bin" && docker exec -it referendum bashПочему npm run build запускать в контейнере, а не на хосте
Хостовый Node.js может быть несовместимой версии (напр. v20.10.0 < требуемой v20.19+). Контейнер содержит нужную версию Node. Всегда используй docker exec referendum npm run build.