您的位置:首页 > 运维架构 > Docker

使用Docker link快速搭建PHP开发环境

2018-02-25 10:46 926 查看
一般我们会把nginx、php都安装在同一个容器,为了扩展方便,我们希望nginx容器和php容器分开。那么就可以使用docker link命令实现这一目的。

需要的镜像:

nginx 1.12.2

php(含php-fpm7.1) 7.1

这里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
)。

实践

运行 php-fpm :

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
指定宿主机和容器的目录映射关系。

这里的
/work/yphp
来自 https://github.com/52fhy/yphp

/work
里面包含的子目录:

/work
|-- www
|---yphp

/www
是项目目录,
yphp
是nginx和php配置目录,映射到容器,方便本地修改。

运行 nginx :

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
是因为该镜像非常小。

命令不是很多,但是有很多注意点,必须仔细查看,否则可能导致服务不正常:

1、对于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

2、nginx容器必须使用
--link
连接到php-fpm容器。

3、nginx容器和php-fpm容器的www目录必须是一致的。

4、nginx容器配置fastcgi_pass的时候需要修改为
--link
里的名称(实际为主机名称,会在nginx容器的
/etc/hosts
新增一条主机记录)。

5、如果nginx容器需要支持更多端口访问,那么使用
-p
范围表示,示例:
-p 80-90:80-90
。或者多个
-p
参数。

6、
-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
已做改动。

运行多个版本PHP

docker run -d --restart=always --name yphp56  -p 9000:9000 \
-v /work/:/work/  \
-v "/work/yphp/php/etc56/":/usr/local/php/etc/  \
php56-fpm-centos68-withext

docker run -d --restart=always --name yphp  -p 9001:9000 \
-v /work/:/work/  \
-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

参考

1、docker容器连接问题:nginx 和 php-fpm --link后并无法正常解析php程序,求解

https://segmentfault.com/q/1010000006148224/a-1020000013359135

2、在docker 上使用alpine linux建立简易静态网站 - CSDN博客

http://blog.csdn.net/becivells/article/details/51599186

3、Docker多容器连接-以Nginx+PHP为例 - 程序猿成长计划 - SegmentFault 思否

https://segmentfault.com/a/1190000002949036

4、Nginx调用远程php-fpm - 指间&流年 - 博客园

https://www.cnblogs.com/feiyafeiblog/p/6938515.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: