您的当前位置:首页正文

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

2022-08-17 来源:步旅网
使⽤Docker快速搭建PHP开发环境

⼀般我们会把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镜像⾃⾏编译(选⽤的是 ⾥的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来⾃ 。/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:9000listen = 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.confserver {

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 --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-nginx02a4f9d804f7 php71-fpm-centos68-phalcon-withext \"/run.sh\" 24 minutes ago Up 3 seconds 80/tcp, 0.0.0.0:9001->9000/tcp yphpa9decc06558e 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程序,求解2、在docker 上使⽤alpine linux建⽴简易静态⽹站 - CSDN博客

3、Docker多容器连接-以Nginx+PHP为例 - 程序猿成长计划 - SegmentFault 思否4、Nginx调⽤远程php-fpm - 指间&流年 - 博客园5、基于boot2docker部署Docker环境 - 飞鸿影 - 博客园

因篇幅问题不能全部显示,请点此查看更多更全内容