Docker and PHP: Application Containerization — Complete Guide

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

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 делает следующее:

  1. Берёт лёгкий образ php:8.2-fpm-alpine.
  2. Устанавливает необходимые расширения: pdo_mysql, gd, mbstring и другие.
  3. Копирует Composer из официального образа.
  4. Переносит код приложения.
  5. Настраивает права доступа для кэша и логов.


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: -

Blogs

Book Recommendations