php - Docker 中 PHP 和 Apache/httpd 的 Alpine 变体

标签 php apache docker alpine-linux

我正在试验 Docker,并希望从本地 MAMP 堆栈转移到 Docker。当然,我偶然发现了官方 php:7.0 图像,但我也想使用 Apache,所以似乎 php:7.0-apache 是要走的路。但是我看到有一个名为 php:7.0-alpine 的图像更 slim ,而 Apache 也有两个版本,即 httpd:2.4httpd :2.4-alpine.

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


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

我遇到了this very detailed and awesome tutorial关于如何将 nginx 和 PHP 以及 MySQL 拆分到不同的容器中,但使用 FCGI 将 PHP 附加到 nginx。这意味着我可以使用所有不同的基于 alpine 的工具图像,并使用 FCGI 链接它们。不幸的是,我从未听说过或使用过 FCGI,但我想更多的研究将产生有关如何使用 Apache 实现此基础架构的信息。

最佳答案

使用 FCGI 运行官方 Apache 和 PHP

除了helmbert s 提出的对我有用的解决方案我正在摆弄官方 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 手动安装它。这可以在交互式 session 中完成,也可以在全局范围内使用 Dockerfile 来 fork 基础镜像。
  • 打开 nano 时出现错误 - 在我的情况下,我必须在交互式 shell 或 ENV TERM xtermexport TERM=xtermDockerfile 中。
  • 事实证明,php-fpm 必须能够访问相同的文件——这是我最初在提议的解决方案中并没有真正注意到的。这也意味着我将源文件安装在两个不同的路径(/usr/local/apache2/htdocshttpd 图像和 /var/www/htmlphp-fpm 图像中)并且必须正确转发调用。我在 httpd.conf 中使用了以下行。

ProxyPassMatch "^/(.*\.php)$" "fcgi://fpm:9000/var/www/html/$1"

  • FCGI 链接中的 fpm 名称是我使用 --link fpm 链接到 httpd 并自动添加的容器的名称到 /etc/hosts
  • 到目前为止,我通过交互方式完成所有这些更改,成功实现了我想要的。我将使用 COPY 命令或应用基本的 sed 调用将所有更改添加到我的 Dockerfile
  • 我知道可以通过命令 SetHandler "proxy:unix:/var/run/php7-fpm.sock|fcgi://fpm/" 使用 unix 套接字,但我不知道'不知道这是否有用。

关于php - Docker 中 PHP 和 Apache/httpd 的 Alpine 变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41303775/

相关文章:

php - 我的工厂是反模式吗?

php - 如何使策略自动发现新的 Laravel 功能与我在不同文件夹中的模型一起使用?

php - Regex PHP - 自动检测 YouTube、图像和 "regular"链接

apache - piwik 跟踪器状态 500 安装错误

macos - 如何在 Mac 中更改 docker 网络 IP 地址

php - 为什么 PHP 文件不用于(自定义)CSS 和 JS?

apache - CKAN可以支持Solr 7.0吗?

apache - 实现HTTP到HTTP的重定向,以保留Google Analytics(分析)引荐来源网址

docker - 如何使用花来监控1个以上的 worker

python - 安装 python shapely 时出现 Alpine 错误