使用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镜像自行编译(选用的是 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 --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
参考
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
5、基于boot2docker部署Docker环境 - 飞鸿影 - 博客园
https://www.cnblogs.com/52fhy/p/8413029.html
相关文章
- centos7安装php环境_docker搭建php开发环境
- 【好玩儿的Docker项目】VoceChat——又一个即时聊天(IM)应用!可以嵌入任何网页!
- PHP DFA算法实现敏感词过滤包 php-dfa-sensitive
- 【php】Parse error: syntax error, unexpected ‘?’, expecting variable (T_VARIABLE)–PHP版本的问题
- PHP与MySQL:紧密结合的良好伙伴(php与mysql关系)
- PHP与MySQL融合,尽享轻松开发(php与mysql整合)
- Linux下使用PHP开发软件的简易指南(linux下php开发)
- 开发Linux下PHP模块开发:实现程序性能最大化(linux下php模块)
- 环境快速搭建Linux上的PHP开发环境(Linux装php)
- 的关系PHP与Oracle的良好结合(php和oracle)
- 借助 PHP 与 MySQL 轻松实现文件下载(php和mysql下载)
- 数据PHP操作MySQL:删除数据(php删除mysql)
- PHP如何使用Redis连接: 代码实例(php连接redis代码)
- php开发MySQL 4.1 PHP开发:越来越优秀(mysql4.1)
- 编程开发之路:PHP 与 MySQL 结缘(php与mysql程序设计)
- docker从Abp到MySQL,使用Docker快速部署(abpmysql)
- 实现PHP与MySQL的无缝连接,增强web开发效率(让php支持mysql)
- 数据库解决PHP连接远程MySQL数据库的问题(php连接远程mysql)
- Linux下简易安装 PHP(linux下php安装)
- PHP MySQL 开发构建实现功能多样的网站(php mysql 类)
- 用PHP测试MSSQL类的新尝试(php 测试mssql类)
- 『PHP无法读取MSSQL数据库出现问题』(php无法读取mssql)
- PHP如何开启MSSQL支持?(php怎么开启mssql)
- PHP搭配MSSQL营造完美环境联动(php加mssql环境)
- PHP MSSQL框架:为企业开发更好的应用程序(php mssql 框架)
- 馆PHP编程与MySQL建立图书馆管理系统(php mysql 图书)
- PHP字符转义相关函数小结(php下的转义字符串)