Докеризация 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 сборкой, но для локальной разработки этого набора хватает с головой.