Я экспериментирую с 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 и PHP, а также MySQL на разные контейнеры, но присоединить PHP к nginx с помощью FCGI. Это подразумевает, что я могу использовать все различные альпийские изображения инструментов и связывать их с помощью FCGI. К сожалению, я никогда не слышал о FCGI и не работал с ним, но, полагаю, дальнейшие исследования позволят получить информацию о том, как реализовать эту инфраструктуру с использованием Apache.
Если вы хотите запустить 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
,
В дополнение к helmbertпредложенное решение, которое сработало для меня, я возился с официальным httpd:2.4-alpine
образ. Я хочу добавить больше информации и предостережений, с которыми я столкнулся, работая над этим.
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>
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
звонки.SetHandler "proxy:unix:/var/run/php7-fpm.sock|fcgi://fpm/"
но я не знаю, полезно это или нет.