首页 » docker » 正文

docker多容器运行-php+fpm+httpd

我尽可能的使用基于alpine的镜像

一.安装PHP-fpm

Dockerfile参考:
Docker官方: https://hub.docker.com/_/php/
阿里云:https://dev.aliyun.com/detail.html?repoId=1250

可以在PORTS下方看到端口默认是9000

二.安装httpd

Dockerfile参考:
Docker官方: https://hub.docker.com/_/httpd/
阿里云: https://dev.aliyun.com/detail.html?repoId=1220

我们进入httpd:2.4.33-alpine 看下网站的根目录在哪里

Ctrl+D退出该容器

测试httpd运行网站成功。

三.配置文件

运行httpd需要配置文件,我们一般将配置文件放到宿主机上,很少直接将配置文件copy到容器里面。如果你拷贝到容器里,一旦丢失就找不回来了。

如果你手头没有现成的配置文件,可以去容器里面copy一个。然后挂载就可以了。

根据文档,容器里默认的配置文件在 /usr/local/apache2/conf/httpd.conf

我们先来看下是不是有这个文件

(确实有)

1.将容器里的httpd配置文件copy到宿主机

copy到宿主机里,先创建一个文件夹叫 conf

docker 的copy命令是怎么操作的呢?我们可以通过 来看下

开始从容器copy配置文件

2.修改copy过来的httpd.conf

找到这三个配置,把前面的#号去掉
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

删除默认的DocumentRoot,以及相关设置。添加如下配置

ProxyRequests Off 就是启用httpd的反向代理功能

简单说下 fcgi://172.17.0.3:9000/php/$1 是怎么来的

四.docker的虚拟网络

可以看到fpm的地址是 172.17.0.3
Containers之间是可以通过网络(ip)互通的,同样,容器跟宿主机之间也是可以通过网络互通的。我的宿主机IP是172.17.0.1

还可以通过 ifconfig 来查看 docker 设置的宿主机虚拟IP

至于 fcgi://172.17.0.3:9000/php/$1 后面跟的 php ,这个可以随便写,你写成abc都没关系

五.挂载

我们可以启动fpm的时候把php文件夹挂载到fpm容器中,因此fpm的启动要改成

注意:fcgi://172.17.0.3:9000/php/$1 后面是 php,容器里挂载的目录 -v /home/joefom/code/php:/php 后面 :/php 也必须跟其一致

现在将myweb容器停止,重新配置运行

测试配置是否成功

注意修改配置文件,容器要重启、要重启、要重启

六.docker-compose启动

docker-compose.yml 文件配置

启动

$ docker-compose up -d

fpm映射的必要性

Nginx 调用 fpm 服务是通过 fastcgi 参数进行的。如通过 SCRIPT_FILENAME 参数指定要加载的文件路径。

比如,nginx的配置文件可能是这样的

fastcgi_pass 倒是很好理解,指定 fpm 服务的调用地址,只需要把容器中的 9000 端口映射到宿主机的 9000 端口上就可以了。

fastcgi_index 也好理解,就是默认文件嘛。

重点在 fastcgi_param,每一个 fastcgi_param 指令都定义了一个会发送给 cgi 进程的参数,打开 Nginx 配置目录中的 fastcgi_params 文件可以看到里面定义了很多参数。其中,SCRIPT_FILENAME 对我们来说算是最重要的。

SCRIPT_FILENAME 指令指定了 cgi 进程需要加载的文件路径。例如用户访问 http://xxx.com/a.php,Nginx 中将会处理此次请求。Nginx 判断后缀名是 .php 的请求后将会把此次请求转发给 cgi 进程处理,即 fastcgi_pass;转发的过程中会携带一些和访问相关的参数或其它预设的参数(fastcgi_param),然而这个 cgi 进程(PHP FPM)并不知道要加载的文件在哪里,这便是 SCRIPT_FILENAME 的作用了。

简单的说,配置 SCRIPT_FILENAME 的值就是要做到 FPM 进程能找到这个文件就可以了。例如代码目录存放在宿主机的 /home/joefom/code/php 目录下,我们使用 -v 命令启动 docker 时把代码目录映射到了容器内部的 /php 目录下:

因为 fpm 进程是运行在容器里面的,所以 SCRIPT_FILENAME 查找的路径一定是在容器内能找到的,即:

发表评论

正在加载验证码......

请先完成验证