Docker и PHP: полное руководство по контейнеризации приложений
Современная веб-разработка немыслима без контейнеризации. Docker стал стандартом де-факто для упаковки, доставки и запуска приложений. Для PHP-разработчиков использование Docker решает множество проблем: от несовместимости версий PHP до сложностей с настройкой окружения на разных машинах. В этой статье мы разберем, как контейнеризировать PHP-приложение с нуля, используя Docker и docker-compose.
1. Основы Docker для PHP-разработчика
Docker — это платформа для разработки, доставки и запуска приложений в изолированных средах (контейнерах). Каждый контейнер содержит всё необходимое для работы: код, библиотеки, системные утилиты и настройки. Для PHP это особенно актуально, так как приложение часто зависит от конкретной версии интерпретатора, расширений (например, pdo_mysql, redis, gd) и веб-сервера (Apache или Nginx).
Основные компоненты Docker:
- Dockerfile — текстовый файл с инструкциями для сборки образа.
- Образ (Image) — неизменяемый шаблон для создания контейнеров.
- Контейнер (Container) — запущенный экземпляр образа.
- docker-compose — инструмент для определения и запуска многоконтейнерных приложений.
2. Создание Dockerfile для PHP-приложения
Начнём с простого примера. Допустим, у нас есть PHP-приложение на фреймворке Laravel или Symfony. Создадим файл Dockerfile в корне проекта:
# Используем официальный образ PHP 8.2 с FPMFROM php:8.2-fpm-alpine
# Устанавливаем рабочую директориюWORKDIR /var/www/html
# Устанавливаем системные зависимости и PHP-расширенияRUN apk add --no-cache \ git \ unzip \ libpng-dev \ libjpeg-turbo-dev \ freetype-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) \ pdo_mysql \ mbstring \ exif \ pcntl \ bcmath \ gd
# Устанавливаем ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Копируем файлы проектаCOPY . .
# Устанавливаем права (для Laravel/Symfony)RUN chown -R www-data:www-data /var/www/html \ && chmod -R 755 storage bootstrap/cache
# Открываем порт 9000 (PHP-FPM)EXPOSE 9000
# Команда запускаCMD ["php-fpm"]Этот Dockerfile делает следующее:
- Берёт лёгкий образ
php:8.2-fpm-alpine. - Устанавливает необходимые расширения:
pdo_mysql,gd,mbstringи другие. - Копирует Composer из официального образа.
- Переносит код приложения.
- Настраивает права доступа для кэша и логов.
3. Настройка docker-compose: PHP + Nginx + MySQL
Для реального проекта нам понадобится веб-сервер и база данных. Создадим файл docker-compose.yml:
version: '3.8'
services: # PHP-FPM сервис php: build: context: . dockerfile: Dockerfile container_name: app_php volumes: - .:/var/www/html networks: - app-network
# Nginx веб-сервер nginx: image: nginx:alpine container_name: app_nginx ports: - "8080:80" volumes: - .:/var/www/html - ./nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php networks: - app-network
# MySQL база данных mysql: image: mysql:8.0 container_name: app_mysql environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: app_db MYSQL_USER: app_user MYSQL_PASSWORD: app_password ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql networks: -