Альпийские варианты 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-fpmimage) и должен был переадресовывать вызовы должным образом. Я использовал следующую строку в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/"но я не знаю, полезно это или нет.