通常咱们会把nginx、php都安装在同一个容器,为了扩展方便,咱们但愿nginx容器和php容器分开。那么就可使用docker link命令实现这一目的。php
须要的镜像:html
这里nginx镜像选择daocloud.io/library/nginx:1.12.2-alpine
,php镜像自行编译(选用的是 https://github.com/52fhy/docker-images 里的php56-fpm-centos68-withext
和php71-fpm-centos68-phalcon-withext
)。linux
运行 php-fpm :nginx
docker run -d --restart=always --name yphp \ -v /work/:/work/ \ -v "/work/yphp/php/etc/":/usr/local/php/etc/ \ php71-fpm-centos68-phalcon-withext
--restart=always
使得容器开机随着docker服务自行启动。-v
指定宿主机和容器的目录映射关系。git
这里的/work/yphp
来自 https://github.com/52fhy/yphp 。github
/work
里面包含的子目录:docker
/work |-- www |---yphp
/www
是项目目录,yphp
是nginx和php配置目录,映射到容器,方便本地修改。segmentfault
运行 nginx :centos
docker run -d --restart=always --name some-nginx -p 80:80 --link yphp:yphp \ -v /work/:/work/ \ -v /work/yphp/nginx/conf/:/etc/nginx/ \ -v /work/yphp/nginx/logs/:/etc/nginx/logs/ \ daocloud.io/library/nginx:1.12.2-alpine
选用nginx:1.12.2-alpine
是由于该镜像很是小。bash
命令不是不少,可是有不少注意点,必须仔细查看,不然可能致使服务不正常:
一、对于php-fpm容器来讲,php-fpm的www.conf配置文件里,监听的IP致使不能是127.0.0.1,必须是0.0.0.0;不然会致使后续nginx这边出现404(查看问题)。
;listen = 127.0.0.1:9000 listen = 0.0.0.0:9000
二、nginx容器必须使用--link
链接到php-fpm容器。
三、nginx容器和php-fpm容器的www目录必须是一致的。
四、nginx容器配置fastcgi_pass的时候须要修改成--link
里的名称(实际为主机名称,会在nginx容器的/etc/hosts
新增一条主机记录)。
五、若是nginx容器须要支持更多端口访问,那么使用-p
范围表示,示例:-p 80-90:80-90
。或者多个-p
参数。
六、-v
参数指定的本地挂载目录(示例里的/work
)子目录(例如/www
)在宿主机不能是软连接,不然会致使nginx 404,由于软连接在容器里是无效的。可是/work
自己能够是软连接。
nginx配置:
hello.cc.conf
server { listen 80; server_name hello.cc; access_log logs/access.log; error_log logs/error.log; root /work/yphp/php/; index index.php index.html index.htm; location ~ \.php$ { #fastcgi_pass 127.0.0.1:9000; fastcgi_pass yphp:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
注意这里的fastcgi_pass
已作改动。
docker run -d --restart=always --privileged --name yphp56 --env COLUMNS=`tput cols` --env LINES=`tput lines` -p 9000:9000 -p 9400-9499:9400-9499 \ -v /work/:/work/ \ -v "/work/yphp/php/etc56/":/usr/local/php/etc/ \ php56-fpm-centos68-withext docker run -d --restart=always --privileged --name yphp --env COLUMNS=`tput cols` --env LINES=`tput lines` -p 9001:9000 -p 9500-9600:9500-9600 \ -v /work/:/work/ \ -v /work/:/alidata/ \ -v "/work/yphp/php/etc/":/usr/local/php/etc/ \ php71-fpm-centos68-phalcon-withext docker run -d --restart=always --name some-nginx -p 80-90:80-90 --link yphp56 --link yphp \ -v /work/:/work/ \ -v /work/yphp/nginx/conf/:/etc/nginx/ \ -v /work/yphp/nginx/logs/:/etc/nginx/logs/ \ daocloud.io/library/nginx:1.12.2-alpine
对于使用了--link
的nginx容器来讲,php-fpm容器的-p
参数实际没有产生做用,能够省略不写。
这里面的/work
对于宿主机来讲都是同一个目录。
使用docker ps
查看状态是否都是UP
:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 221c6ffb19dd daocloud.io/library/nginx:1.12.2-alpine "nginx -g 'daemon of…" 12 minutes ago Up 2 seconds 0.0.0.0:80-90->80-90/tcp some-nginx 02a4f9d804f7 php71-fpm-centos68-phalcon-withext "/run.sh" 24 minutes ago Up 3 seconds 80/tcp, 0.0.0.0:9001->9000/tcp yphp a9decc06558e php56-fpm-centos68-withext "/run.sh" 25 minutes ago Up 3 seconds 80/tcp, 0.0.0.0:9000->9000/tcp yphp56
说明正常。
若是本地是Mac或者Linux且安装的是Docker(非ToolBox之类),使用127.0.0.1
就能够看到nginx已经运行了。添加127.0.0.1 hello.cc
到/etc/hosts
(非Windows)后访问http://hello.cc/能够看到phpinfo信息。试着修改/work/yphp/nginx/conf/vhost/hello.cc.conf
里的fastcgi_pass
端口为9001,而后重启nginx容器或者重启nginx容器里的nginx服务,会发现phpinfo显示的PHP版本变成了PHP7.1。
# 重启nginx容器 docker restart some-nginx # 重启nginx容器里的nginx服务 docker exec some-nginx nginx -s reload
一、docker容器链接问题:nginx 和 php-fpm --link后并没有法正常解析php程序,求解
https://segmentfault.com/q/1010000006148224/a-1020000013359135
二、在docker 上使用alpine linux创建简易静态网站 - CSDN博客
http://blog.csdn.net/becivells/article/details/51599186
三、Docker多容器链接-以Nginx+PHP为例 - 程序猿成长计划 - SegmentFault 思否
http://www.javashuo.com/article/p-yfbausxv-gc.html
四、Nginx调用远程php-fpm - 指间&流年 - 博客园
http://www.javashuo.com/article/p-ejtllucu-dy.html
五、基于boot2docker部署Docker环境 - 飞鸿影 - 博客园
http://www.javashuo.com/article/p-uxmifybs-hx.html