Контейнеризация PHP через Apache с помощью Docker
Быстрые ссылки
- Создание Dockerfile
- Настройка Apache
- Добавление PHP‑расширений
- Конфигурация PHP
- Использование Composer
- Пользовательские entrypoint‑скрипты
- Шпаргалка и чек‑листы
- Заключение

Изображение: логотип Docker на синем фоне, символизирующий контейнеризацию.
Docker‑контейнеры делают приложение переносимым между средами. Как только образ собран, его можно запускать там, где установлен Docker. Ниже описан практический путь контейнеризации PHP веб‑приложения на Apache с рекомендациями по настройке, расширениям и распространённым приёмам.
Создание Dockerfile
Docker‑образ строится по инструкциям в файле Dockerfile. Основные инструкции, которые вы встретите:
COPY # копирует файлы и папки в образ
RUN # выполняет команду внутри образа во время сборкиДля простого сайта достаточно скопировать файлы в образ на базе варианта с Apache, например:
FROM php:8.0-apache
WORKDIR /var/www/html
COPY index.php index.php
COPY src/ src
EXPOSE 80Пояснения:
FROM php:8.0-apache— официальный образ PHP с преднастроенным Apache на Debian.WORKDIR /var/www/html— все последующие команды будут выполняться в корне документа Apache.EXPOSE 80— декларативно указывает, что контейнер использует порт 80 (HTTP).
Собрать и запустить образ:
docker build -t my-php-site:latest .
docker run -d -p 80:80 my-php-site:latestПодсказка: при использовании -P Docker автоматически сопоставит случайный свободный порт хоста с портом контейнера.
Важно: не храните чувствительные данные (пароли, ключи) в образе. Вынесите конфигурацию в переменные окружения, тома или секреты.
Настройка Apache
Образы PHP/Apache базируются на Debian и позволяют устанавливать пакеты через apt. Для управления модулями и сайтами Apache используйте встроенные утилиты:
a2enmod/a2dismod— включение/отключение модулейa2ensite/a2dissite— включение/отключение виртуальных хостов
Основной файл конфигурации: /etc/apache2/apache2.conf. Частая правка — явная установка ServerName, чтобы избежать предупреждений в логах:
COPY my-apache-site.conf /etc/apache2/sites-available/my-apache-site.conf
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf && \
a2enmod rewrite && \
a2dissite 000-default && \
a2ensite my-apache-site && \
service apache2 restartСоветы:
- Включите
mod_rewrite, если используете правила перенаправлений или «чистые» URL в .htaccess. - Если взаимодействуете с заголовками (CORS, HSTS), включите модуль
headers. - Для production‑окружения избегайте
service apache2 restartв финальном образе: лучше запускать сервис в foreground в entrypoint.
Добавление PHP‑расширений
Образы PHP содержат утилиты для управления расширениями.
- Посмотреть установленные расширения:
php -mвнутри контейнера. - Установить расширение из стандартных источников:
docker-php-ext-install.
Пример установки MySQL‑драйвера:
RUN docker-php-ext-install pdo_mysqlНекоторым расширениям требуется предварительная настройка:
RUN docker-php-ext-configure gd --with-jpeg=/usr/include/ && \
docker-php-ext-install gdPECL‑расширения устанавливаются в два шага: сначала pecl install, затем docker-php-ext-enable:
RUN apt-get update && apt-get install -y libmemcached-dev zlib1g-dev && \
pecl install memcached-3.1.5 && \
docker-php-ext-enable memcachedПодсказки и типичные проблемы:
- Устанавливайте только нужные зависимости; лишние пакеты увеличивают размер образа.
- После установки рекомендуем очищать apt‑кеш (apt-get clean и rm -rf /var/lib/apt/lists/*), чтобы уменьшить слой.
- Если расширение требует компиляции, убедитесь, что в образе есть build‑зависимости (gcc, make, autoconf), и удаляйте их после сборки.
Конфигурация PHP
По умолчанию контейнеры загружают INI‑файлы из каталога /usr/local/etc/php/conf.d. Добавьте свой .ini в этот каталог — его настройки будут применяться поверх значений по умолчанию.
Переменная окружения $PHP_INI_DIR указывает на текущую директорию конфигов и помогает избежать хардкодинга путей.
Пример простого конфига:
# php-production.ini
upload_max_filesize=20M
post_max_size=21M
memory_limit=256MИспользование Composer
Composer не входит в базовый образ. Рекомендуемый способ — брать Composer из официального образа через multi‑stage сборку и копировать бинарник:
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
COPY composer.json composer.json
COPY composer.lock composer.lock
RUN composer install --no-dev --prefer-dist --no-interaction --no-progressПреимущества multi‑stage:
- Не нужно запускать инсталлятор Composer вручную.
- Избегаете наличия лишних утилит в финальном слое.
- Можно выполнить
composer installв отдельном слое, затем скопировать только vendor/ в финальный образ.
Альтернатива: запуск Composer на CI/хосте и передача vendor/ через COPY или через артефакт сборки.
Пользовательские entrypoint‑скрипты
Иногда нужно выполнить миграции или другие подготовительные задачи перед запуском сервера. Для этого переопределяют ENTRYPOINT и затем запускают apache2-foreground.
Пример Dockerfile‑entrypoint:
ENTRYPOINT ["bash", "/Docker.sh"]Содержимое /Docker.sh:
#!/bin/bash
set -e
# Выполнить миграции
php app.php my-migration-command
# Запустить планировщик задач, если нужно
service cron start
# Передать исполнение Apache в foreground
exec apache2-foregroundВажно: скрипт должен завершаться exec apache2-foreground, чтобы контейнер продолжал работу под PID 1 и корректно обрабатывал сигналы.
Шпаргалка: полезные команды и флаги
# Сборка образа
docker build -t my-php-site:latest .
# Запуск в фоне с пробросом порта
docker run -d -p 80:80 my-php-site:latest
# Запуск с томом для разработки (горячая перезагрузка)
docker run -v $(pwd):/var/www/html -p 80:80 my-php-site:latest
# Просмотр логов контейнера
docker logs -f
# Подключение в контейнер
docker exec -it bash Сравнение: Apache в образе vs PHP‑FPM + Nginx
| Критерий | php:*-apache | php:fpm + nginx | Комментарий |
|---|---|---|---|
| Простота | Высокая | Средняя | Меньше компонентов в официальном образе Apache. |
| Производительность | Хорошая | Часто лучше | Nginx + PHP‑FPM масштабируется для больших нагрузок. |
| Конфигурация | Простая | Гибкая | Разделение ролей — вебсервер/приложение. |
| Поддержка .htaccess | Да | Нет | .htaccess работает только с Apache. |
Когда выбрать Apache: простой переход с классического стека LAMP, использование .htaccess, минимальная конфигурация. Когда выбрать Nginx+FPM: высокая нагрузка, разделение веб‑ и PHP‑слоёв, необходимость гибкой балансировки.
Роль‑ориентированные чек‑листы
Разработчик:
- Убедиться, что приложение запускается локально в контейнере.
- Не хранить секреты в образе; использовать .env и секреты CI.
- Добавить Dev‑volume для быстрой отладки.
DevOps/Инженер по доставке:
- Настроить CI на сборку и сканирование образов.
- Использовать multi‑stage для уменьшения размера образа.
- Добавить SCA/сканы уязвимостей и тесты.
Инженер безопасности:
- Проанализировать слои образа на наличие лишних пакетов.
- Минимизировать привилегии в runtime (не запускать от root, если возможно).
- Настроить правила CSP и заголовки безопасности через конфиг Apache.
Безопасность и hardening
- Минимизируйте привилегии: используйте USER в Dockerfile для запуска процесса под непривилегированным пользователем.
- Закрывайте ненужные модули Apache и порты.
- Храните секреты в менеджере секретов, а не в образе.
- Обновляйте базовый образ и зависимости по расписанию, используйте сканирование уязвимостей.
Пример переключения пользователя:
# Создать пользователя и назначить владельца файлов
RUN useradd -m appuser && chown -R appuser:www-data /var/www/html
USER appuserТонкости и крайние случаи
- Проблема:
permission deniedпри монтировании тома — проверьте UID/GID и права на файловой системе хоста. - Проблема: расширение не компилируется — убедитесь, что установлены build‑зависимости и пути к библиотекам.
- Проблема: контейнер падает после запуска entrypoint — проверьте, что последний шаг выполняет
execи что все команды возвращают корректные коды возврата.
Плейбук: быстрая методика сборки и деплоя
- Локальная проверка: убедитесь, что
index.phpиsrc/работают в контейнере. - Dockerfile оптимизация: используйте multi‑stage, очищайте apt‑кеш.
- Composer: устанавливайте через
COPY --from=composer:2или запускайте на CI. - Тесты: выполняйте PHPUnit/интеграционные тесты в CI stage до сборки финального образа.
- Сканы: запуск SAST/DAST и проверка уязвимостей образа.
- Деплой: публикуйте образ в registry и используйте orchestrator (Kubernetes/Swarm) для запуска.
Mermaid: выбор стратегии установки зависимостей
flowchart TD
A[Нужен Composer?] -->|Да| B{Установить в образ}
B --> C[Копировать из composer:2 'рекомендуется']
B --> D[Установить вручную через installer]
A -->|Нет| E[Собрать без Composer]
C --> F[Копировать vendor/ и бинарник]
D --> F
F --> G[Меньше слоёв, меньше зависимости]Глоссарий — 1 строка на термин
- Dockerfile — сценарий сборки Docker‑образа.
- Composer — менеджер зависимостей PHP.
- PECL — хранилище расширений PHP.
- Apache virtual host — конфигурация виртуального хоста в Apache.
Критерии приёмки
- Приложение запускается локально с
docker runи отвечает на HTTP запросы. - Все необходимые PHP‑расширения присутствуют и активны (
php -m). - Конфигурация хранится отдельно от образа (env/volumes/секреты).
- Размер образа и слоёв находится в пределах допустимого для деплоя (организационные критерии).
Заключение
Контейнеризация PHP‑сервиса с Apache проста при использовании официальных образов: вы получаете готовую основу, удобные утилиты для установки расширений и чёткое расположение конфигурации. Основные трудности возникают при подключении внешних инструментов (Composer, PECL) и при попытке уменьшить размер образа. Следуйте рекомендациям: multi‑stage сборки, очистка временных пакетов и запуск Apache через foreground в entrypoint. Это обеспечит предсказуемость и удобство развёртывания.
Важно: перед промышленным запуском прогоните CI‑pipeline с тестами и сканами безопасности.
Краткие выводы:
- Используйте официальные образы как базу; они уже настроены для большинства задач.
- Composer лучше подключать через multi‑stage или на этапе CI.
- Чистите ненужные пакеты и уменьшайте слои образов.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента