Как использовать Docker для контейнеризации PHP и Apache
Контейнеры Docker делают ваше приложение переносимым в разных средах. Получив образ контейнера, вы можете использовать его везде, где доступен Docker. Вот как контейнеризировать веб-приложение PHP с помощью сервера Apache.
Мы будем использовать официальный образ PHP Docker в качестве основы. Предоставляются варианты, предварительно настроенные с помощью Apache, поэтому вам не нужно устанавливать веб-сервер самостоятельно. Базовый образ PHP также предлагает удобные утилиты для управления расширениями PHP.
Создание Dockerfile
Образы Docker создаются из Dockerfile
. Этот файл содержит инструкции, которые используются для создания образа. Инструкции включают в себя COPY
для копирования файлов и папок в контейнер и RUN
для запуска команды внутри контейнера.
Вы можете запустить простой PHP-сайт, просто скопировав его файлы в образ на основе php:8.0-apache
.
FROM php:8.0-apache
WORKDIR /var/www/html
COPY index.php index.php
COPY src/ src
EXPOSE 80
Этот Dockerfile
берет index.php
и src
из нашего рабочего каталога и копирует их в корень документа Apache. Теперь вы можете создать образ и запустить из него контейнер. Вы увидите, что ваш сайт обслуживается Apache.
docker build -t my-php-site:latest .
docker run -d -p 80:80 my-php-site:latest
Образы PHP Docker имеют корень документа Apache в расположении Debian по умолчанию /var/www/html
. Инструкция WORKDIR
в Dockerfile
означает, что последующие команды будут выполняться в корне документа.
Apache предоставляет доступ к порту веб-сервера по умолчанию 80. На это указывает директива EXPOSE
в Dockerfile
. Явно раскрывая порт, вы можете использовать флаг -P
с docker run
для автоматической привязки случайного порта хоста к порту 80 контейнера.
Настройка конфигурации Apache
Официальные образы PHP/Apache основаны на Debian. Вы можете использовать диспетчер пакетов apt
, чтобы добавить необходимое вам дополнительное программное обеспечение.
У вас также есть полный доступ к встроенным инструментам Apache. Вы можете использовать a2enmod
/a2dismod
для управления модулями и a2ensite
/a2dissite
для взаимодействия с виртуальными хостами.
Файл конфигурации Apache по умолчанию имеет вид /etc/apache2/apache2.conf
. Добавьте строки в этот файл или полностью замените его, чтобы расширить конфигурацию Apache.
Одно изменение, которое всегда стоит сделать, — это явно установить Apache ServerName
. Это останавливает предупреждение «невозможно надежно определить ServerName», которое обычно появляется в журналах вашего контейнера.
Вы также обычно хотите добавить свой собственный виртуальный хост Apache. Это позволяет вам настроить пользовательскую конфигурацию помимо того, что предоставляет сайт Apache 000-default
. Вот как внести эти изменения.
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
В этом примере отключается сайт по умолчанию, включается пользовательский сайт и перезапускается Apache для применения изменений. Также включен модуль mod_rewrite
, позволяющий использовать директивы Rewrite
в файлах .htaccess
. Вы также можете включить другие модули, такие как headers
, если ваша конфигурация будет взаимодействовать с заголовками ответов.
Добавление расширений PHP
Образы PHP Docker поставляются со встроенными утилитами управления расширениями. Некоторые расширения включены по умолчанию — вы можете проверить, что доступно, запустив php -m
в работающем контейнере.
Многие распространенные расширения можно установить с помощью docker-php-ext-install
:
docker-php-ext-install pdo_mysql
Некоторые расширения необходимо настроить перед установкой. Вы можете использовать docker-php-ext-configure
для выполнения предварительной настройки. Доступные параметры зависят от расширения. Прочтите справочную страницу расширения, чтобы определить флаги, которые вы можете указать.
RUN docker-php-ext-configure gd --with-jpeg=/usr/include/ &&
docker-php-ext-install gd
Вы также можете использовать расширения, распространяемые через PECL. Эти расширения требуют двухэтапной процедуры установки. Сначала установите пакет PECL, а затем используйте docker-php-ext-enable
, чтобы зарегистрировать расширение в вашей установке PHP.
RUN apt-get install -y libmcached-dev zlib1g-dev &&
pecl install memcached-3.1.5 &&
docker-php-ext-enable memcached
Конфигурация PHP
Образы Docker предварительно настроены для загрузки файлов конфигурации PHP, находящихся в /usr/local/etc/php/conf.d
. Добавьте в этот каталог свой собственный файл .ini
. PHP будет включать свое содержимое во время выполнения, перезаписывая любые существующие значения. Это рекомендуемый способ расширения конфигурации по умолчанию.
Путь к каталогу конфигурации может измениться в будущем. Вы можете получить его текущее местоположение, используя переменную среды $PHP_INI_DIR
. В настоящее время он разрешается в /usr/local/etc/php/conf.d
.
Использование композитора
Композитор недоступен по умолчанию. Composer — это проект сообщества, существующий независимо от PHP. Вам нужно установить его вручную, если вы хотите использовать его в контейнере Docker.
Лучший способ использовать Composer в своих сборках — ссылаться на собственный образ Docker инструмента через многоэтапную сборку. Используйте COPY --from
, чтобы перенести двоичный файл Composer в ваш контейнер PHP; затем вы можете использовать Composer как обычно для установки зависимостей вашего проекта.
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
Использование этого подхода снижает сложность. Вам не нужно скачивать и запускать скрипт установки Composer. Ссылаясь на composer:2
, Docker извлечет образ, а затем скопирует двоичный файл Composer.
Пользовательские сценарии точки входа
Вам может понадобиться использовать настраиваемый сценарий точки входа, если вы хотите запускать миграцию приложений до того, как запустится среда выполнения основного сервера. Вы можете переопределить контейнер ENTRYPOINT
, чтобы использовать собственную последовательность запуска.
Вы можете продолжить выполнение контейнера в обычном режиме, выполнив apache2-foreground
. Это запустит Apache на переднем плане, предотвращая выход из контейнера после завершения сценария точки входа.
ENTRYPOINT ["bash", "/Docker.sh"]
Содержимое Docker.sh
:
php app.php my-migration-command # run migrations
service cron start # start some services
exec apache2-foreground # main execution
Заключение
Докеризация веб-сервиса PHP проста при использовании официальных образов. Вы можете легко настроить Apache и PHP с помощью расширений и собственных файлов конфигурации.
Скорее всего, вы столкнетесь с трудностями при попытке использовать сторонние надстройки сообщества, такие как Composer. Они не включены по умолчанию, поэтому вам нужно будет использовать многоэтапные сборки Docker или процедуры ручной установки.
Использование Docker дает вашему приложению гибкость в том, как и где оно развертывается. С помощью вашего образа вы можете запустить рабочую установку своего сайта, используя только docker build
и docker run
в своем терминале.