Поиск по сайту:

Как использовать 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 в своем терминале.