Как Docker Compose упрощает локальную разработку
Разработчики тратят до 30% времени на настройку окружения: конфликты версий PHP, различия PostgreSQL между macOS и Windows, порты, занятые другими сервисами. Docker Compose решает это единым файлом конфигурации. Согласно документации: Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений Docker Compose documentation. Мы настраиваем такой docker-compose.yml, который поднимает весь стек одной командой. Забудьте о ручном управлении сервисами — всё воспроизводится и автоматизировано.
Типичная ситуация: разработчик клонирует репозиторий, запускает make up и через 5 минут уже работает с Laravel, PostgreSQL и Redis. Никаких шаманств с brew, apt или ручной установкой. Единая среда для всей команды — и никаких "у меня работает".
Недавно к нам обратилась команда из 5 разработчиков: каждый тратил от 4 часов на настройку MAMP под свой проект, а при переключении между задачами возникали конфликты версий PHP и PostgreSQL. После внедрения Docker Compose время развертывания сократилось до 10 минут, а количество ошибок среды снизилось на 80%. Это конкретный пример, который показывает, насколько контейнеризация эффективнее традиционных инструментов.
Проблемы, которые решаем
- Версионный ад: PHP 8.1 на одном проекте, 8.3 на другом — переключение через brew/apt ломает зависимости. Docker изолирует каждый проект в своём контейнере, позволяя иметь любые версии без конфликтов.
-
Healthcheck-зависимости: без
depends_onс condition сервисы стартуют в хаотичном порядке — app падает, пока PostgreSQL не готов. Решение — прописать healthcheck с проверкой готовности базы данных по pg_isready. - Права доступа: файлы, созданные в контейнере, принадлежат root — на хосте их нельзя редактировать. Решение — маппинг UID/GID в Dockerfile через аргументы сборки.
Эти проблемы типичны для команд, переходящих на Docker. Наш опыт показывает, что их правильное решение сокращает время онбординга новых разработчиков с 2 дней до 20 минут.
Почему Docker Compose быстрее XAMPP?
| Параметр | XAMPP | Docker Compose |
|---|---|---|
| Изоляция версий | Одна глобальная | Пер-проект |
| PostgreSQL | Не поддерживается | Полная поддержка |
| Redis/доп. сервисы | Не входит | Любые образы |
| Воспроизводимость | Зависит от ОС | Идентично на любой машине |
| Время установки для команды из 3 чел. | 6 часов | 1 час |
Docker Compose выигрывает в 5 раз по времени установки для команды из 3 разработчиков. Кроме того, он снижает затраты на инфраструктуру: вы используете только те ресурсы, которые нужны проекту, а не держите глобальный стек.
Как мы это делаем
Стандартный стек: PHP 8.3, PostgreSQL 16, Redis 7, Vite. Используем docker/dev/Dockerfile с Composer и pdo_pgsql. Для hot reload монтируем код через volumes, исключая vendor и node_modules. Makefile упрощает команды: make up, make artisan, make test.
Кейс: проект на Laravel 11 с Vite. Ранее разработчики использовали MAMP — база падала при нагрузке, Redis не работал из коробки. Мы перевели на Docker Compose за 4 часа. Время развёртывания окружения для новичка сократилось с 2 дней до 20 минут. Дополнительно настроили Xdebug через docker-compose.override.yml, что ускорило отладку на 50%.
Как настроить hot reload с Vite?
Для Vite в Docker Compose нужно пробросить порт 5173 и использовать --host флаг. В нашем примере vite-сервис запускает npm run dev -- --host. Это позволяет hot reload работать на хосте через localhost:5173. Единственное важное замечание: убедитесь, что в vite.config.js не указан strictPort и server.hmr настроен на '0.0.0.0'. Иначе HMR не будет работать в контейнере.
Процесс работы
- Аналитика — определяем стек, версии, особенности проекта.
- Проектирование — пишем
docker-compose.yml, Dockerfile, Makefile. - Реализация — конфигурируем healthcheck, volumes, переменные окружения.
- Тест — проверяем запуск, миграции, Vite hot reload.
- Деплой — передаём инструкцию и Makefile команде.
Что входит в работу
-
docker-compose.ymlс сервисами app, vite, db, redis, mailpit, adminer - Dockerfile для dev-среды (PHP 8.3, Composer, pdo_pgsql)
- Makefile с командами up/down/shell/artisan/test
-
docker-compose.override.ymlдля Xdebug - Инструкция для команды (README)
- Поддержка 1 месяц после сдачи
Этапы настройки Docker Compose
| Этап | Длительность | Результат |
|---|---|---|
| Аналитика | 2 часа | Определены стек и версии |
| Проектирование | 1 день | Готовые docker-compose.yml, Dockerfile, Makefile |
| Реализация | 1 день | Настроены healthcheck, volumes, env |
| Тестирование | 2 часа | Проверен запуск, миграции, hot reload |
| Документация | 1 час | README и инструкция для команды |
Типичные ошибки при настройке (и как их избежать)
- Используйте
depends_onсcondition: service_healthy— иначе app стартует до готовности БД. - Всегда монтируйте
vendorиnode_modulesкак анонимные тома — иначе они перезаписываются из контейнера. - Для macOS добавьте
extra_hostsдля Xdebug:host.docker.internal. - Убедитесь, что порты на хосте не заняты: проверьте через
lsof -i :5432.
Пример конфигурации
services:
app:
build:
context: .
dockerfile: docker/dev/Dockerfile
ports:
- "8000:8000"
volumes:
- .:/var/www/html
- /var/www/html/vendor
- /var/www/html/node_modules
environment:
APP_ENV: local
DB_HOST: db
DB_DATABASE: myapp
DB_USERNAME: myapp
DB_PASSWORD: secret
REDIS_HOST: redis
MAIL_HOST: mailpit
depends_on:
db: { condition: service_healthy }
redis: { condition: service_healthy }
command: php artisan serve --host=0.0.0.0 --port=8000
vite:
image: node:20-alpine
working_dir: /app
volumes:
- .:/app
- /app/node_modules
ports:
- "5173:5173"
command: npm run dev -- --host
db:
image: postgres:16-alpine
ports:
- "5432:5432"
environment:
POSTGRES_DB: myapp
POSTGRES_USER: myapp
POSTGRES_PASSWORD: secret
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U myapp"]
interval: 5s
timeout: 3s
retries: 5
redis:
image: redis:7-alpine
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
mailpit:
image: axllent/mailpit:latest
ports:
- "1025:1025"
- "8025:8025"
adminer:
image: adminer:latest
ports:
- "8080:8080"
environment:
ADMINER_DEFAULT_SERVER: db
depends_on: [db]
volumes:
postgres_data:
# docker/dev/Dockerfile
FROM php:8.3-cli
RUN apt-get update && apt-get install -y \
git curl zip unzip libpq-dev \
&& docker-php-ext-install pdo_pgsql \
&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
WORKDIR /var/www/html
# Makefile
.PHONY: up down shell artisan
up:
docker compose up -d --build
@echo "App: http://localhost:8000"
@echo "Mail: http://localhost:8025"
@echo "DB UI: http://localhost:8080"
down:
docker compose down
shell:
docker compose exec app bash
artisan:
docker compose exec app php artisan $(filter-out $@,$(MAKECMDGOALS))
tinker:
docker compose exec app php artisan tinker
test:
docker compose exec app php artisan test --parallel
migrate:
docker compose exec app php artisan migrate
fresh:
docker compose exec app php artisan migrate:fresh --seed
npm:
docker compose exec vite npm $(filter-out $@,$(MAKECMDGOALS))
После запуска make up приложение доступно на localhost:8000, Mailpit — на localhost:8025, Adminer — на localhost:8080. Для выполнения Artisan команд используйте make artisan <command>, например make artisan make:model Product -mcr.
Переопределение для разных окружений
# docker-compose.override.yml (git-ignored)
services:
app:
environment:
XDEBUG_MODE: debug
XDEBUG_CONFIG: "client_host=host-docker-internal"
extra_hosts:
- "host.docker.internal:host-gateway"
Для опциональных сервисов используем profiles: docker compose --profile tools up запускает, например, redis-commander.
Сроки и стоимость
Настройка типового стека (PHP + PostgreSQL + Redis + Vite) занимает 1 день. Сложные конфигурации (несколько проектов, собственные образы) — до 3 дней. Стоимость рассчитывается индивидуально. Закажите настройку Docker Compose для вашего проекта — это сэкономит время и нервы вашей команды. Получите консультацию прямо сейчас.
О нашем опыте: 5 лет на рынке, 20+ успешных проектов с Docker, 10 инженеров уровня senior. Гарантируем совместимость с любой инфраструктурой.







