Docker
Описание
Использую Docker как основной способ собирать и запускать окружение для разработки, тестирования и deploy.
Работал с:
docker composeдля многоконтейнерных приложений;- кастомными
Dockerfileдляdevelopment,CIиproduction; - разделением ролей по контейнерам:
app,nginx,queue,websocket,postgres,redis, служебные сервисы; - локальной разработкой через bind mounts,
env-переменные, отдельные конфиги и volume; - публикацией production-образов в registry и запуском готовых образов на сервере;
- интеграцией Docker в
CI/CDи release-based deploy.
Локальная разработка
Для локальной разработки использовал Docker-окружение с несколькими сервисами.
В такой схеме настраивал:
- отдельный контейнер приложения (
PHP-FPM/ runtime); - отдельный
nginxкак reverse proxy; - БД и
Redis; - фоновые воркеры очередей;
WebSocket/real-time сервисы;- вспомогательные контейнеры для отладки.
Дополнительно:
- проброс портов для
HTTP,HTTPS,Vite/frontend dev server,WebSocket,PostgreSQL,Redis; - bind mount исходников для быстрой разработки без пересборки образа;
- разделение
read-onlyиread-writemounts; - named volumes для данных БД и
Redis; healthcheckдля инфраструктурных сервисов;- синхронизация
UID/GIDконтейнера с пользователем хоста, чтобы избежать проблем с правами на файлы; - подготовка отдельных конфигов для
CLIиFPM, включая инструменты отладки.
В работе использовал Laravel Sail как обёртку над Dockerized development workflow.
Dockerfile и сборка образов
Использовал Dockerfile под разные сценарии — dev, prod-среда.
Development image
Для локальной разработки собирал образы, в которых уже подготовлены:
- нужная версия
PHPи системные зависимости; - расширения (
pgsql,redis,gd,intl,imagick,xdebugи др.); Composer;Node.jsи зависимости для frontend-сборки;- инструменты отладки и анализа.
Дополнительно настраивал:
- запуск
PHP-FPMна TCP-порту внутри контейнера; - создание runtime-пользователя;
- безопасную работу с bind-mounted git-репозиторием;
- конфиги для профилирования и
xDebug.
Production image
Подготовка production-образов с упором на воспроизводимость и уменьшение runtime-слоя:
- multi-stage build;
- отдельный этап установки
vendor; - отдельный этап сборки frontend-ассетов;
- перенос в финальный образ только нужных runtime-артефактов;
- вынос production-конфигов
PHP/nginxв образ; - запуск приложения без dev-зависимостей.
Такой подход позволяет:
- сократить размер финального образа;
- сделать deploy быстрее;
- уменьшить число production-зависимостей;
- избежать сборки приложения непосредственно на сервере.
В подобных production-схемах сборка может дополнительно разделять ответственность между образами:
PHP-FPMimage собирает runtime приложения и frontend-ассеты;nginximage получает готовую статику и production-конфиг;- для
nginxотдельно собираются динамическиеbrotli-модули.
Reverse Proxy и сетевой слой
Использовал nginx в Docker как внешний entrypoint для приложения.
Что настраивал:
- проксирование запросов в
PHP-FPM; HTTPSвнутри локального окружения;- проксирование
WebSocket-подключений; - выдачу статических ассетов;
- кэширование frontend-артефактов;
- защиту служебных путей и скрытых файлов;
- подключение дополнительных модулей
nginxв production-образе; - настройка локальных сертификатов.
Очереди, фоновые процессы и real-time
Docker использовал не только для запуска web-приложения, но и для изоляции длительно живущих процессов:
- queue workers;
WebSocket/ event-broadcasting серверов;- служебных background-процессов.
Есть опыт настройки отдельных контейнеров с собственными командами запуска, таймаутами и параметрами retry.
Такой подход удобен тем, что:
- роли процессов разделены;
- проще перезапускать только проблемный сервис;
- логи и поведение каждого процесса изолированы;
- production-схема лучше масштабируется.
CI/CD и registry
Docker использовал как базовый артефакт поставки приложения.
Типовой процесс, с которым работал:
CIзапускает проверки и тесты.- Pipeline собирает production-образы приложения и
nginx. - Образы публикуются в
Docker Registry. - Сервер не собирает проект сам, а получает готовые образы.
- Deploy выполняется через
docker compose pullиdocker compose up -d.