Докеризация PHP-проекта: Dockerfile и docker-compose для локалки
2026-08-25 10:00:00Задача — не «идеальный продакшен-образ», а рабочее окружение, которое поднимается одной командой и одинаково у всех в команде. Вот минимальный набор, который реально используется.
Dockerfile
FROM php:8.3-fpm
RUN apt-get update && apt-get install -y \
git unzip libzip-dev libpng-dev \
&& docker-php-ext-install pdo_mysql zip gd opcache
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
docker-compose.yml
services:
app:
build: .
volumes:
- ./:/var/www/html
depends_on:
- db
nginx:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./:/var/www/html
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
db:
image: mysql:8
environment:
MYSQL_DATABASE: app
MYSQL_ROOT_PASSWORD: root
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
volumes:
db_data:
Запуск
docker compose up -d --build
docker compose exec app composer install
Частые грабли
- Медленный volume на Windows/macOS. Если проект большой — используйте
:cachedдля volume или держите vendor вне общего тома. - Права на файлы. Контейнер пишет от root, а на хосте файлы становятся «чужими».
Решается через
user: "${UID}:${GID}"в сервисеapp. - OPcache кэширует старый код. На локалке держите
opcache.validate_timestamps=1, на проде —0.
Для продакшен-сборки образ, конечно, нужен другой — без dev-зависимостей и с multi-stage сборкой, но для локальной разработки этого набора хватает с головой.