Альпийские варианты PHP и Apache / httpd в Docker

Я экспериментирую с Docker и хочу перейти с локального стека MAMP на Docker. Конечно я наткнулся на чиновника php:7.0 изображение, но я хочу использовать Apache, так что кажется, как будто php:7.0-apache это путь. Однако я видел, что есть изображение под названием php:7.0-alpine который намного тоньше, в то время как есть две версии для Apache, а именно httpd:2.4 а также httpd:2.4-alpine,

Есть ли какая-либо предложенная комбинация для использования как Apache, так и PHP (либо отдельно, либо в сочетании), в то же время имея изображения небольшого размера? Кроме того, я хотел бы знать, где я могу просмотреть доступные модули в изображениях, так как я хочу также использовать MariaDB и mod_rewrite, которые могут иметь больше зависимостей, которые были опущены, чтобы сохранить маленький размер.


Информация о реализации желаемой инфраструктуры с помощью nginx

Я наткнулся это очень подробный и удивительный учебник о том, как разделить nginx и PHP, а также MySQL на разные контейнеры, но присоединить PHP к nginx с помощью FCGI. Это подразумевает, что я могу использовать все различные альпийские изображения инструментов и связывать их с помощью FCGI. К сожалению, я никогда не слышал о FCGI и не работал с ним, но, полагаю, дальнейшие исследования позволят получить информацию о том, как реализовать эту инфраструктуру с использованием Apache.

7

Решение

Запуск Apache / NGINX и PHP с FCGI

Если вы хотите запустить Apache и PHP в отдельных контейнерах, вам нужно использовать контейнер PHP-FPM (как, например, с помощью php:7-fpm или же php:7-fpm-alpine изображение), а затем используйте FCGI для соединения двух. По умолчанию официальные изображения PHP-FPM выставьте для этого порт TCP 9000, которого должно быть достаточно для большинства случаев.

Для PHP-FPM официальное изображение PHP должно быть хорошо (в отношении размера, 7.0.14-fpm-alpine тег размером всего 31M). Что касается Apache, я пришел к webdevops/apache образ (Я никак не связан). Он также поставляется с версией Alpine, размер которой составляет всего 38 МБ, и хорошо работает вместе с PHP-FPM.

Вот как вы запускаете отдельные контейнеры PHP-FPM и Apache, связанные вместе с помощью FCGI:

$ docker run -d \
-v /path/to/data:/var/www/html \
--name fpm \
php:fpm-7.0.14-alpine
$ docker run -d \
-v /path/to/data:/var/www/html \
--name apache \
--link fpm \
-e WEB_PHP_SOCKET=fpm:9000 \
-e WEB_DOCUMENT_ROOT=/var/www/html \
webdevops/apache:alpine-3

Для использования вместо Nginx просто замените webdevops/apache изображение с webdevops/nginx,

Добавление пользовательских расширений

Поскольку вы также спрашивали о добавлении дополнительных расширений PHP к своему изображению: это описано в официальной документации изображения PHP. Вы можете добавить пользовательские расширения PHP в базовый образ PHP, запустив docker-php-ext-install в пользовательском Dockerfile:

FROM php:7.0.14-fpm-alpine
RUN docker-php-ext-install pdo_mysql

Это позволяет вам создавать свой собственный образ на основе одного из базовых образов PHP-FPM, добавляя все необходимые расширения в Dockerfile,

1

Другие решения

Запуск официального Apache и PHP с FCGI

В дополнение к helmbertпредложенное решение, которое сработало для меня, я возился с официальным httpd:2.4-alpine образ. Я хочу добавить больше информации и предостережений, с которыми я столкнулся, работая над этим.

  • Конфигурация Apache была немного сложнее, так как это более легкая версия без обычной структуры данных vhost, нет a2en* и нет a2dis* скрипты.
  • Там нет общей структуры папок в /etc/apache2, Все в /usr/local/apache2 и у вас есть глобальный httpd.conf в /usr/local/apache2/conf/, В этом файле вы должны раскомментировать строки модуля вручную, чтобы загрузить их, а также другие файлы конфигурации, такие как httpd-vhosts.conf который хранится в /usr/local/apache2/conf/extra/,
  • Я использовал httpd-vhosts.conf настроить основные параметры для моего тестирования:

<VirtualHost *:80>
DocumentRoot /usr/local/apache2/htdocs

<Directory /usr/local/apache2/htdocs>
Options -Indexes +FollowSymLinks -MultiViews
AllowOverride All
Require all granted
</Directory>

ErrorLog /usr/local/apache2/main-error.log
LogLevel warn
CustomLog /usr/local/apache2/main-access.log combined
</VirtualHost>

  • Для сервера FCGI мне пришлось раскомментировать следующие две строки:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

  • Каждый раз, чтобы что-то изменить в конфигурации, вы должны ./bin/apachectl restart как обычно, если вы находитесь в /usr/local/apache2,
  • Так как я использую nano Мне пришлось установить его вручную, используя apk --no-cache add nano, Это может быть сделано в интерактивном сеансе или глобально с использованием Dockerfile раскошелиться на базовое изображение.
  • У меня была ошибка при открытии nano — в моем случае мне пришлось export TERM=xterm в интерактивной оболочке или ENV TERM xterm в Dockerfile,
  • Оказалось, что php-fpm должен иметь доступ к тем же файлам — это то, что я на самом деле не заметил в предложенном решении сначала. Это также означает, что исходные файлы были смонтированы по двум разным путям (/usr/local/apache2/htdocs в httpd изображение и /var/www/html в php-fpm изображение) и пришлось переадресовывать звонки правильно. Я использовал следующую строку в httpd.conf,

ProxyPassMatch "^/(.*\.php)$" "fcgi://fpm:9000/var/www/html/$1"

  • fpm имя в ссылке FCGI — это имя моего контейнера, который связан с httpd с помощью --link fpm и автоматически добавляется в /etc/hosts,
  • До сих пор мне удалось достичь желаемого, интерактивно делая все эти изменения. Я собираюсь добавить все изменения в мой Dockerfile используя либо COPY команды или применение основных sed звонки.
  • Я знаю, что есть возможность использовать сокеты Unix через команду SetHandler "proxy:unix:/var/run/php7-fpm.sock|fcgi://fpm/" но я не знаю, полезно это или нет.
7

По вопросам рекламы [email protected]