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

时间:2016-12-23 15:09:01

标签: php apache docker alpine

我正在尝试使用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

实施所需基础架构的信息

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

2 个答案:

答案 0 :(得分: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>
  • 对于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=xtermENV TERM xtermDockerfile
  • 事实证明php-fpm必须能够访问相同的文件 - 这是我最初在提议的解决方案中没有注意到的。这也意味着我将源文件安装在两个不同的路径(/usr/local/apache2/htdocs图像httpd/var/www/html图像中的php-fpm)并且必须正确转发呼叫。我在httpd.conf
  • 中使用了以下行
ProxyPassMatch "^/(.*\.php)$" "fcgi://fpm:9000/var/www/html/$1"
  • FCGI链接中的fpm名称是我的容器名称,该名称使用httpd链接到--link fpm并自动添加到/etc/hosts
  • 到目前为止,我通过交互式方式完成所有这些更改,实现了我想要的目标。我将使用Dockerfile命令或应用基本COPY调用将所有更改添加到sed
  • 我知道有可能通过SetHandler "proxy:unix:/var/run/php7-fpm.sock|fcgi://fpm/"命令使用unix套接字,但我不知道这是否有用。

答案 1 :(得分:2)

使用FCGI运行Apache / NGINX和PHP

如果要在单独的容器中运行Apache和PHP,则需要使用PHP-FPM容器(例如,使用 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <script src="https://use.fontawesome.com/f86debf509.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> <link rel="stylesheet" type="text/css" href="home.css"> php:7-fpm图像),然后使用FCGI连接这两个。默认情况下,official PHP-FPM images会为此公开TCP端口9000,这对于大多数情况应该足够了。

对于PHP-FPM,official PHP image应该没问题(关于大小,php:7-fpm-alpine标记的大小只有31M)。关于Apache,我开始喜欢webdevops/apache image(我不以任何方式加入)。它还附带一个基于Alpine的版本,只有38M大小,与PHP-FPM一起使用。

以下是如何启动单独的PHP-FPM和Apache容器,使用FCGI链接在一起:

7.0.14-fpm-alpine

要使用Nginx,只需将$ 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 图片替换为webdevops/apache

添加自定义扩展程序

由于您还询问了如何向映像添加其他PHP扩展:这在官方PHP映像的文档中有所介绍。您可以通过在自定义Dockerfile中运行webdevops/nginx来向PHP基本映像添加自定义PHP扩展:

docker-php-ext-install

这允许您基于其中一个PHP-FPM基础映像构建自定义映像,并在FROM php:7.0.14-fpm-alpine RUN docker-php-ext-install pdo_mysql 中添加所需的所有扩展。