喵の窝

我可能遇上了假主机 - docker使用小记 (叁)

php

上一节我们已经在docker中搭建好了nginx环境,这一节介绍怎么在docker中搭建php环境以及nginx如何跟php通信。

背景

不同于apache,nginx是通过php fpm来跟php通信的。简单的说,就是nginx先过滤出php程序,然后将php程序(通过restAPI)转发给php fpm处理。php fpm处理完成以后再讲处理后的结果返回给nginx。于是,我们就需要解决不同容器之前如何通信的问题。

创建php fpm容器

执行

1
$ docker run -d php:fpm

就能创建一个php fpm容器,这个时候用

1
$ docker ps

就可以看到容器的状态,记录下容器的名字,后续操作会用上。

连接nginx与php fpm

如果已经有一个nginx容器在运行,先删除。
我们可以使用docker的link选项将两个容器连接起来。link选项的格式是

--link <需要连接的容器名>:<别名>

以上一篇文章中nginx为例,如果我们需要把nginx与刚创建的php fpm容器连接起来,启动命令应该如下所示

1
2
3
4
5
6
$ docker run -p 80:80 -d \
-v /Your/Index/Path/index.html:/usr/share/nginx/html/index.html \
-v /Your/Conf/Directory/:/etc/nginx/conf.d/ \
-v /Your/Other/Site/In/Virtual/Host:/Some/Path/ \
--link <php fpm容器的名字>:<别名> \
nginx

上面这条命令把php fpm容器连接进了nginx容器中。相当于在nginx容器中的host文件中,添加了一条phpfpm的记录,这个记录指向了php fpm容器的ip地址。不仅如此,docker还在两个容器内部建立了一条连接。因此php fpm容器不用向宿主机暴露任何端口也能被nginx容器访问到。

两个容器连接完成以后,就可以在nginx中使用php fpm了。在nginx站点的配置文件中使用连接容器的别名来访问php fpm了。配置文件大概如下

1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
server_name your.domain.com;
index xxxxx.xxx;
root /Some/Path/SomeSite;
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass <php fpm容器别名>:9000;
fastcgi_param SCRIPT_FILENAME /Some/Path/SomeSite/$fastcgi_script_name;
}
}

注意事项

  1. php fpm收到nginx的请求时,是在自己的容器内部处理相关的请求,因此需要把相关的文件目录也映射到php fpm容器的内部。 以上面的配置文件和nginx容器的启动命令为例。在nginx启动命令中,将/Your/Other/Site/In/Virtual/Host'目录映射到了nginx容器中的/Some/Path/‘目录。而在nginx的站点配置文件中,我们将SCRIPT_FILENAME'配置成了/Some/Path/SomeSite/$fastcgi_script_name’,因此在php fpm收到nginx的请求时,会到自己容器的`/Some/Path/SomeSite/‘目录下去找对应文件,因此我们需要把这个目录也映射到php fpm的内部。
  2. 在启动容器时,可以使用–name选项为容器指定名字,这样在容器连接时候会方便一些。
  3. 一个完整的例子
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 启动php fpm
    $ docker run -d \
    -v /Your/Other/Site/In/Virtual/Host:/Some/Path/ \
    --name phpfpm \
    php:fpm


    # 启动nginx
    $ docker run -d \
    -v /Your/Other/Site/In/Virtual/Host:/Some/Path/
    # 其他需要映射的目录 \
    -p 80:80 \
    -p 443:443 \ # 如果需要使用SSL
    --link phpfpm:phpfpm \
    nginx

> TO BE CONTINUED …