Docker中PHP和Apache/httpd的高级变体

Chr*_*vic 9 php apache docker alpine-linux

我正在尝试使用Docker,并希望从本地MAMP堆栈转移到Docker.当然我偶然发现了官方php:7.0图片,但我也想使用Apache,所以看起来好像php:7.0-apache是要走的路.不过我看到有一个名为图像php:7.0-alpine,同时有两个版本的Apache以及即是更苗条httpd:2.4httpd:2.4-alpine.

是否有任何建议的组合使用Apache和PHP(分离或组合),同时仍然具有小图像大小?此外,我想知道在哪里可以查看图像中的可用模块,因为我想要使用MariaDB和mod_rewrite,这可能有更多的依赖项,为了保持较小的尺寸而省略.


有关使用nginx实现所需基础架构的信息

我遇到了这个非常详细和令人敬畏的教程,关于如何将nginx和PHP以及MySQL分成不同的容器,但是使用FCGI将PHP附加到nginx.这意味着我可以使用工具的所有不同的基于阿尔卑斯的图像并使用FCGI链接它们.不幸的是,我从未听说过或曾与FCGI合作,但我想更多的研究将会产生有关如何使用Apache实现此基础架构的信息.

hel*_*ert 8

使用 FCGI 运行 Apache/NGINX 和 PHP

如果要在单独的容器中运行 Apache 和 PHP,则需要使用 PHP-FPM 容器(例如,使用php:7-fpmphp:7-fpm-alpine图像),然后使用 FCGI 将两者连接起来。默认情况下,官方 PHP-FPM 图像为此公开了 TCP 端口 9000,这对于大多数情况应该足够了。

对于PHP-FPM,官方的PHP镜像应该没问题(关于大小,7.0.14-fpm-alpine标签大小只有31M)。关于 Apache,我开始喜欢webdevops/apache这张图片(我没有任何关联)。它还带有一个基于 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
Run Code Online (Sandbox Code Playgroud)

要改用 Nginx,只需将webdevops/apache图像替换为webdevops/nginx.

添加自定义扩展

由于您还询问了向图像添加其他 PHP 扩展的问题:官方 PHP 图像文档中对此进行了介绍。您可以通过docker-php-ext-install在自定义 Dockerfile 中运行来将自定义 PHP 扩展添加到 PHP 基础映像:

FROM php:7.0.14-fpm-alpine
RUN docker-php-ext-install pdo_mysql
Run Code Online (Sandbox Code Playgroud)

这允许您基于 PHP-FPM 基础镜像之一构建自定义镜像,在Dockerfile.


Chr*_*vic 8

使用FCGI运行官方Apache和PHP

除了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>
Run Code Online (Sandbox Code Playgroud)
  • 对于FCGI服务器,我必须取消注释以下两行:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
Run Code Online (Sandbox Code Playgroud)
  • 每次改变配置中的某些东西,你必须./bin/apachectl restart像往常一样假设你在/usr/local/apache2.
  • 因为我使用nano我必须手动安装它apk --no-cache add nano.这可以在交互式会话中完成,也可以使用a Dockerfile来分叉基本映像.
  • 我打开时出错nano- 在我的情况下,我不得不export TERM=xterm在交互式shell中或ENV TERM xtermDockerfile.
  • 事实证明,php-fpm必须能够访问相同的文件 - 这是我在提议的解决方案中实际上没有注意到的事情.这意味着,以及我有安装在两个不同的路径(的源文件/usr/local/apache2/htdocshttpd的图像,并/var/www/htmlphp-fpm图像)并具有正确地转发呼叫.我用了以下几行httpd.conf.

ProxyPassMatch "^/(.*\.php)$" "fcgi://fpm:9000/var/www/html/$1"
Run Code Online (Sandbox Code Playgroud)
  • fpm在FCGI链接名称是链接到我的容器的名称httpd使用--link fpm,并自动添加到/etc/hosts.
  • 到目前为止,我通过交互式方式完成所有这些更改,成功实现了我想要的.我将Dockerfile使用COPY命令或应用基本sed调用添加所有更改.
  • 我知道有可能通过命令使用unix套接字,SetHandler "proxy:unix:/var/run/php7-fpm.sock|fcgi://fpm/"但我不知道这是否有用.