Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker中PHP和Apache/httpd的阿尔卑斯变体_Php_Apache_Docker_Alpine - Fatal编程技术网

Docker中PHP和Apache/httpd的阿尔卑斯变体

Docker中PHP和Apache/httpd的阿尔卑斯变体,php,apache,docker,alpine,Php,Apache,Docker,Alpine,我正在试验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和m

我正在试验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实现所需基础架构的信息 我遇到了如何将nginx和PHP以及MySQL拆分成不同的容器,但使用FCGI将PHP附加到nginx。这意味着我可以使用所有不同的基于阿尔卑斯山的工具图像,并使用FCGI链接它们。不幸的是,我从来没有听说过FCGI,也没有使用过FCGI,但我想更多的研究将提供有关如何使用Apache实现此基础架构的信息。

使用FCGI运行Apache/NGINX和PHP 如果希望在单独的容器中运行Apache和PHP,则需要使用PHP-FPM容器(例如,使用
PHP:7-FPM
PHP:7-FPM-alpine
图像),然后使用FCGI连接这两个容器。默认情况下,服务器会为此公开TCP端口9000,这在大多数情况下应该足够了

对于PHP-FPM,标签应该很好(关于大小,
7.0.14-FPM-alpine
标签的大小只有31M)。关于Apache,我开始喜欢它(我没有任何附属关系)。它还附带了一个基于Alpine的版本,该版本的大小只有3800万,并且与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图像文档中有介绍。通过在自定义docker文件中运行
docker PHP ext install
,可以将自定义PHP扩展添加到PHP基本映像:

FROM php:7.0.14-fpm-alpine
RUN docker-php-ext-install pdo_mysql
这允许您基于其中一个PHP-FPM基本映像构建自定义映像,并在运行带有FCGI的正式Apache和PHP的
Dockerfile

中添加所需的所有扩展 除了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
    设置测试的基本选项:


  • 每次要更改配置中的某些内容,您必须像往常一样重新启动
    /bin/apachectl
    ,假设您在
    /usr/local/apache2
  • 由于我使用了
    nano
    ,所以我必须使用
    apk手动安装它——无缓存添加nano
    。这可以在交互式会话中完成,也可以全局使用
    Dockerfile
    分叉基本映像
  • 我在打开nano时出错-在我的情况下,我必须在交互式shell中导出TERM=xterm,或者在
    Dockerfile
    中导出ENV TERM xterm
  • 事实证明,
    php-fpm
    必须访问完全相同的文件——这是我最初在建议的解决方案中没有注意到的。这也意味着我将源文件装载在两个不同的路径上(
    httpd
    图像中的
    /usr/local/apache2/htdocs
    ,以及
    php fpm
    图像中的
    /var/www/html
    ),并且必须正确地转发调用。我在
    httpd.conf
    中使用了以下行


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

如果您有兴趣了解有关使用正式Apache映像的更多信息,请参考我自己的答案。从一开始,你的帮助我很多:)
<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>
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
ProxyPassMatch "^/(.*\.php)$" "fcgi://fpm:9000/var/www/html/$1"