Skip to content

Docker

Стандартная конфигурация

Сервисы

СервисОбразНазначение
appphp:8.x-fpm + расширенияPHP-FPM application
nginxnginx:alpineWeb-сервер, проксирование
mysqlmysql:8База данных
redisredis:7-alpineКеш, сессии, очередь
queueтот же что appphp artisan queue:work
schedulerтот же что appphp artisan schedule:work

Структура файлов

project/
├── docker/
│   ├── app/Dockerfile
│   ├── nginx/default.conf
│   └── scheduler/entrypoint.sh
├── docker-compose.yml
├── docker-compose.dev.yml
└── src/                          — Laravel root

PHP расширения (обязательные)

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} bashShell в контейнер

Никогда не запускать artisan/composer на хосте — версии PHP/расширений могут отличаться.


Environment (.env)

Обязательные переменные для Docker

ПеременнаяЗначение в Docker
DB_HOSTmysql (имя сервиса)
REDIS_HOSTredis (имя сервиса)
CACHE_DRIVERredis
SESSION_DRIVERredis
QUEUE_CONNECTIONredis

Правила

  • .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 в productionStack traces видны пользователямfalse
MySQL port exposed в productionДоступ извнеТолько internal network
Нет volume для MySQL dataПотеря данных при docker compose downNamed 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
PostgreSQLreferendum-postgres
Redisreferendum-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.

Внутренняя база знаний студии