PHP 和 Apache/httpd 在 Docker 中的 Alpine 变体
Alpine variants of PHP and Apache/httpd in 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 实施所需基础设施的信息
我发现 this very detailed and awesome tutorial 如何将 nginx 和 PHP 以及 MySQL 拆分到不同的容器中,但使用 FCGI 将 PHP 附加到 nginx。这意味着我可以使用这些工具的所有不同的基于 alpine 的图像,并且 link 它们使用 FCGI。不幸的是,我从未听说过或使用过 FCGI,但我想更多的研究将提供有关如何使用 Apache 实施此基础架构的信息。
运行 Apache/NGINX 和 PHP 与 FCGI
如果你想 运行 Apache 和 PHP 在不同的容器中,你需要使用 PHP-FPM 容器(例如,使用 php:7-fpm
或 php:7-fpm-alpine
image) 然后使用 FCGI 将两者连接起来。默认情况下,official PHP-FPM images 为此公开 TCP 端口 9000,这对于大多数情况应该足够了。
对于 PHP-FPM,official PHP image should do fine (regarding size, the 7.0.14-fpm-alpine
tag is only 31M in size). Regarding Apache, I've come to like the webdevops/apache
image(我没有任何隶属关系)。它还带有一个基于 Alpine 的版本,大小只有 38M,并且可以与 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 图像的官方文档中有所介绍。您可以在自定义 Dockerfile 中通过 运行ning docker-php-ext-install
添加自定义 PHP 扩展到 PHP 基础镜像:
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/
中。在此文件中,您必须手动取消注释模块行以加载它们以及存储在 /usr/local/apache2/conf/extra/
. 中的其他配置文件,如 httpd-vhosts.conf
- 我使用
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
时出错 - 在我的情况下,我必须在交互式 shell 中 export TERM=xterm
或 Dockerfile
中的 ENV TERM xterm
。
- 事实证明
php-fpm
必须访问完全相同的文件 - 这是我一开始在提议的解决方案中实际上没有注意到的事情。这也意味着我将源文件安装在两个不同的路径(httpd
图像中的 /usr/local/apache2/htdocs
和 php-fpm
图像中的 /var/www/html
)并且必须正确转发调用.我在 httpd.conf
. 中使用了以下行
ProxyPassMatch "^/(.*\.php)$" "fcgi://fpm:9000/var/www/html/"
- FCGI link 中的
fpm
名称是我的容器名称,使用 --link fpm
linked 到 httpd
并自动添加到/etc/hosts
.
- 到目前为止,我通过交互式地进行所有这些更改设法实现了我想要的。我将使用
COPY
命令或应用基本 sed
调用将所有更改添加到我的 Dockerfile
。
- 我知道可以通过命令
SetHandler "proxy:unix:/var/run/php7-fpm.sock|fcgi://fpm/"
使用 unix 套接字,但我不知道这是否有用。
我正在试验 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 实施所需基础设施的信息
我发现 this very detailed and awesome tutorial 如何将 nginx 和 PHP 以及 MySQL 拆分到不同的容器中,但使用 FCGI 将 PHP 附加到 nginx。这意味着我可以使用这些工具的所有不同的基于 alpine 的图像,并且 link 它们使用 FCGI。不幸的是,我从未听说过或使用过 FCGI,但我想更多的研究将提供有关如何使用 Apache 实施此基础架构的信息。
运行 Apache/NGINX 和 PHP 与 FCGI
如果你想 运行 Apache 和 PHP 在不同的容器中,你需要使用 PHP-FPM 容器(例如,使用 php:7-fpm
或 php:7-fpm-alpine
image) 然后使用 FCGI 将两者连接起来。默认情况下,official PHP-FPM images 为此公开 TCP 端口 9000,这对于大多数情况应该足够了。
对于 PHP-FPM,official PHP image should do fine (regarding size, the 7.0.14-fpm-alpine
tag is only 31M in size). Regarding Apache, I've come to like the webdevops/apache
image(我没有任何隶属关系)。它还带有一个基于 Alpine 的版本,大小只有 38M,并且可以与 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 图像的官方文档中有所介绍。您可以在自定义 Dockerfile 中通过 运行ning docker-php-ext-install
添加自定义 PHP 扩展到 PHP 基础镜像:
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/
中。在此文件中,您必须手动取消注释模块行以加载它们以及存储在/usr/local/apache2/conf/extra/
. 中的其他配置文件,如 - 我使用
httpd-vhosts.conf
设置了测试的基本选项:
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
时出错 - 在我的情况下,我必须在交互式 shell 中export TERM=xterm
或Dockerfile
中的ENV TERM xterm
。 - 事实证明
php-fpm
必须访问完全相同的文件 - 这是我一开始在提议的解决方案中实际上没有注意到的事情。这也意味着我将源文件安装在两个不同的路径(httpd
图像中的/usr/local/apache2/htdocs
和php-fpm
图像中的/var/www/html
)并且必须正确转发调用.我在httpd.conf
. 中使用了以下行
ProxyPassMatch "^/(.*\.php)$" "fcgi://fpm:9000/var/www/html/"
- FCGI link 中的
fpm
名称是我的容器名称,使用--link fpm
linked 到httpd
并自动添加到/etc/hosts
. - 到目前为止,我通过交互式地进行所有这些更改设法实现了我想要的。我将使用
COPY
命令或应用基本sed
调用将所有更改添加到我的Dockerfile
。 - 我知道可以通过命令
SetHandler "proxy:unix:/var/run/php7-fpm.sock|fcgi://fpm/"
使用 unix 套接字,但我不知道这是否有用。