Як 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 для вашого проекту — це заощадить час і нерви вашої команди. Отримайте консультацію прямо зараз.
Про наш досвід: 10+ років на ринку, 40+ успішних проектів із Docker, 10 інженерів рівня senior. Гарантуємо сумісність із будь-якою інфраструктурою.







