Docker и PHP: контейнеризация приложений — полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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 с FPM
FROM 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

# Устанавливаем Composer
COPY --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:
      - app-network

volumes:
  mysql_data:

networks:
  app-network:
    driver: bridge

Также потребуется конфигурация Nginx. Создайте файл nginx/default.conf:

server {
    listen 80;
    server_name localhost;
    root /var/www/html/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

4. Запуск и оптимизация контейнеров

После подготовки файлов выполните команду в терминале:

docker-compose up -d --build

Флаг -d запускает контейнеры в фоновом режиме, а --build пересобирает образ PHP. Откройте браузер и перейдите по адресу http://localhost:8080 — вы увидите ваше приложение.

Полезные команды для работы:

  • docker-compose ps — просмотр статуса контейнеров.
  • docker-compose logs -f php — просмотр логов PHP-контейнера.
  • docker exec -it app_php bash — вход в контейнер PHP.
  • docker-compose down — остановка и удаление всех контейнеров.

Советы по оптимизации:

  1. Многослойная сборка (multi-stage build) — используйте отдельные образы для сборки зависимостей и продакшена. Это уменьшит размер финального образа.
  2. Кэширование слоёв — располагайте редко изменяемые инструкции (установка расширений, Composer install) выше в Dockerfile.
  3. Healthcheck — добавьте проверку здоровья контейнера для автоматического перезапуска при сбоях.
# Пример healthcheck в docker                

Блоги

Рекомендаций по книгам