本篇文章主要介绍了" Docker在PHP项目开发环境中的应用",主要涉及到方面的内容,对于MySql感兴趣的同学可以参考一下:
环境部署是所有团队都必须面对的问题,随着系统越来越大,依赖的服务也越来越多,比如我们目前的一个项目就会用到:Web服务器:NginxWeb程序:PHP Nod...
环境部署是所有团队都必须面对的问题,随着系统越来越大,依赖的服务也越来越多,比如我们目前的一个项目就会用到:
- Web服务器:Nginx
- Web程序:PHP + Node
- 数据库:MySQL
- 搜索引擎:ElasticSearch
- 队列服务:Gearman
- 缓存服务:Redis + Memcache
- 前端构建工具:npm + bower + gulp
- PHP CLI工具:Composer + PHPUnit
因此团队的开发环境部署随之暴露出若干问题:
- 依赖服务很多,本地搭建一套环境成本越来越高,初级人员很难解决环境部署中的一些问题
- 服务的版本差异及OS的差异都可能导致线上环境BUG
- 项目引入新的服务时所有人的环境需要重新配置
对于问题1,可以用Vagrant这样的基于虚拟机的项目来解决,团队成员共享一套开发环境镜像。对于问题2,可以引入类似PHPBrew这样的多版本PHP管理工具来解决。但两者都不能很好地解决问题3,因为虚拟机镜像没有版本管理的概念,当多人维护一个镜像时,很容易出现配置遗漏或者冲突,一个很大的镜像传输起来也不方便。
Docker的出现让上面的问题有了更好的解决方案,虽然个人对于Docker大规模应用到生产环境还持谨慎态度,但如果仅仅考虑测试及开发,私以为Docker的容器化理念已经是能真正解决环境部署问题的银弹了。
下面介绍Docker构建PHP项目开发环境过程中的演进,本文中假设你的操作系统为Linux,已经安装了Docker,并且已经了解Docker是什么,以及Docker命令行的基础使用,如果没有这些背景知识建议先自行了解。
Hello World
首先还是从一个PHP在Docker容器下的Hello World实例开始。我们准备这样一个PHP文件index.php
:
然后在同目录下创建文本文件并命名为Dockerfile
,内容为:
# 从官方PHP镜像构建
FROM php
# 将index.php复制到容器内的/var/www目录下
ADD index.php /var/www/
# 对外暴露8080端口
EXPOSE 8080
# 设置容器默认工作目录为/var/www
WORKDIR /var/www/
# 容器运行后默认执行的指令
ENTRYPOINT ["php", "-S", "0.0.0.0:8080"]
构建这个容器:
docker build -t allovince/php-helloworld .
运行这个容器
docker run -d -p 8080:8080 allovince/php-helloworld
查看结果:
curl localhost:8080
PHP in Docker
这样我们就创建了一个用于演示PHP程序的Docker容器,任何安装过Docker的机器都可以运行这个容器获得同样的结果。而任何有上面的php文件和Dockerfile的人都可以构建出相同的容器,从而完全消除了不同环境,不同版本可能引起的各种问题。
想象一下程序进一步复杂,我们应该如何扩展呢,很直接的想法是继续在容器内安装其他用到的服务,并将所有服务运行起来,那么我们的Dockerfile很可能发展成这个样子: