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

я экспериментирую с Докером и хочу перейти от локального стека MAMP к докеру. Конечно, я наткнулся на чиновника!--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.

2 ответов


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

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

для PHP-FPM,официальный PHP image должны сделать нормально (относительно размер,7.0.14-fpm-alpine бирка только 31M в размере). Что касается Apache, мне нравится webdevops/apache изображения (я никоим образом не связан). Он также поставляется с альпийской версией, которая имеет размер всего 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 image. Вы можете добавить пользовательские расширения PHP в базовый образ PHP, запустив docker-php-ext-install в пользовательском Dockerfile:

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

это позволяет создавать пользовательский образ на основе одного из базовых образов PHP-FPM, добавляя все расширения, которые требуются в Dockerfile.


запуск официальных 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 в интерактивном shell или ENV TERM xterm на Dockerfile.
  • выяснилось, что php-fpm должен иметь доступ к тем же файлам - это то, что я сначала не заметил в предлагаемом решении. Это также означает, что у меня были исходные файлы, смонтированные по двум разным путям (/usr/local/apache2/htdocs на httpd изображения и /var/www/html на php-fpm image) и должен был переадресовывать вызовы должным образом. Я использовал следующую строку в httpd.conf.

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

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