说实话,若是在Windows下开发PHP程序,那么XAMPP足够了,一个安装包,什么都安装好了。可是若是要增长一些额外的依赖,好比须要的扩展的DLL不存在,须要编译安装一些扩展;或者须要同时维护不一样版本的PHP,那么就须要下多个版本的XAMPP。固然也有能够切换PHP版本的工具,好比WAMP。可是依赖其实无处不在,好比切换了针对Apache的PHP版本,命令行的PHP版本也得相应的切换,或者Composer的版本。在这种状况下,很容易掉坑。php
另一方面,随着各类语言的层出不穷,工做中不可能死磕一种语言。新增一种语言,势必须要安装对应的环境,好比Python,须要2.7.x版本和3.x版本,Node,各类全局安装,Go的安装也是一通配置。而随着这些语言版本的升级,卸载又安装,配置又更改,时间一长,真的很容易一团乱。html
针对开发环境问题,爱折腾的程序员开发了Vagrant这个工具。一个环境一个虚拟机,而后用自动化方法去管理这些虚拟机。这样一来,能够把各个项目的开发环境相隔离,一个项目一个镜像。这样无论多么复杂的依赖,都被隔离在镜像中,不会对其余的项目的环境形成影响。要删除这些安装程序和配置,只要把镜像删除掉就好了。很是干净,保证了操做系统不会留下各类垃圾文件。mysql
到这里其实没有Docker什么事了,Vagrant把问题解决的差很少了。可是有两个痛点:nginx
虽然有上面说的两个问题,可是因为有环境隔离的好处,选择Vagrant的程序员也就忍了。原本Docker刚出来的时候,也不是为了干掉Vagrant,你们相安无事,在各自的领域发光发热,Docker主要目标集中在方便部署上,一个项目,打包成几个容器,往服务器一放就搞定了。可是最近的几个改进,让爱折腾的程序员发现了Docker在本地开发环境上的潜力:git
这样一来,是时候用Docker取代Vagrant进行本地开发环境搭建啦。程序员
为了追赶潮流,各个部分的版本计划是这样的:sql
应用服务器:Nginx 最新版本 PHP: 固然是最新的7.x啦 MySQL:最新版本 phpMyAdmin:好用的MySQL可视化管理工具,最新版本docker
因为Docker容器默认状况下,中止的时候,运行中产生的修改都会丢失,可是在开发过程当中,代码和数据是要保存下来的,因此须要另外两个数据容器:MySQL数据容器和代码数据容器。服务器
肯定好了组成部分后,能够把项目的文件结构设置成以下样子:app
项目文件夹 ├── LICENSE ├── README.md ├── app │ └── basic ├── docker-compose.yml ├── nginx │ ├── Dockerfile │ └── default.conf └── php ├── Dockerfile ├── install-composer └── sources.list.jessie
version: "1.0" services: nginx: build: ./nginx/ ports: - 80:80 volumes: - "${PROJECT_ROOT}:/var/www/html:ro" networks: - server depends_on: - php php: build: ./php/ expose: - 9000 volumes: - "${PROJECT_ROOT}:/var/www/html" networks: - database - server depends_on: - mysql mysql: image: mysql:latest volumes: - data:/var/lib/mysql networks: - database ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}" MYSQL_DATABASE: "${DB_NAME}" MYSQL_USER: "${DB_USERNAME}" MYSQL_PASSWORD: "${DB_PASSWORD}" phpmyadmin: image: phpmyadmin/phpmyadmin ports: - 8080:80 networks: - database depends_on: - mysql environment: PMA_HOST: mysql volumes: data: networks: database: server:
采用最新的构建语法,大部分用depends_on代替links,用volumes列出须要持久化的mysql对应的数据文件。代码已经传到码云啦。https://gitee.com/linwx/Yii2Docker.git