Альпийские варианты 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
команды или применение basicsed
звонки. - я знаю, что есть возможность используйте сокеты unix с помощью команды
SetHandler "proxy:unix:/var/run/php7-fpm.sock|fcgi://fpm/"
но я не знаю, полезно это или нет.