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

简介: 使用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


目录
相关文章
|
23天前
|
SQL 安全 JavaScript
在多用户环境中,如何确保 PHP Shell 的安全性?
在多用户环境中确保 PHP Shell 安全,需采取限制执行环境、禁用危险函数、使用安全模式、采用 `suPHP` 或 `PHP-FPM`、使用参数化查询、输入验证、转义命令、强化会话管理、合理配置错误处理、正确设置文件权限及定期更新等措施。这些策略有助于防范潜在的安全威胁。
|
25天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
59 3
|
1月前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
198 1
|
1月前
|
JavaScript 开发者 Docker
深入理解Docker容器化技术,打造高效开发环境
深入理解Docker容器化技术,打造高效开发环境
|
2月前
|
网络安全 虚拟化 Docker
SSH后判断当前服务器是云主机、物理机、虚拟机、docker环境
结合上述方法,您可以对当前环境进行较为准确的判断。重要的是理解每种环境的特征,并通过系统的响应进行综合分析。如果在Docker容器内,通常会有明显的环境标志和受限的资源视图;而在云主机或虚拟机上,虽然它们也可能是虚拟化的,但通常提供更接近物理机的体验,且可通过硬件标识来识别虚拟化平台。物理机则直接反映硬件真实信息,较少有虚拟化痕迹。通过这些线索,您应该能够定位到您所处的环境类型。
66 2
|
2月前
|
存储 监控 Shell
docker的底层原理二:容器运行时环境
本文深入探讨了Docker容器运行时环境的关键技术,包括命名空间、控制组、联合文件系统、容器运行时以及分离的进程树,这些技术共同确保了容器的隔离性、资源控制和可移植性。
50 5
|
2月前
|
存储 Ubuntu JavaScript
如何使用Docker优化你的开发环境配置
如何使用Docker优化你的开发环境配置
|
2月前
|
jenkins Java 持续交付
Docker搭建jenkins环境
这篇文章详细介绍了如何利用Docker搭建Jenkins环境,包括拉取Jenkins镜像、配置端口映射及初始化设置的步骤。
220 0
Docker搭建jenkins环境
|
2月前
|
Docker 容器
利用Docker Compose优化开发环境的配置
在现代软件开发中,环境一致性至关重要。开发人员常需在不同机器间复制环境配置,而Docker Compose提供了一种简便有效的方法来定义和运行多容器Docker应用程序,确保开发、测试和生产环境一致,简化团队协作,提高开发效率。通过YAML文件配置服务、网络和卷,使用简单命令即可启动和停止服务。本文将介绍Docker Compose的核心优势、基本使用方法及高级功能,帮助你更好地管理和优化开发环境。
|
3月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo