說實話,若是在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