使用Docker搭建Yii2本地開發環境

爲何要用Docker

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

  1. Vagrant鏡像大,一個項目一個鏡像,SSD空間原本就吃緊,很快就空間不夠啦
  2. 性能。Vagrant啓動其實就是虛擬機啓動,幾分鐘內也就搞定了,等等其實無所謂。一般開發的時候,會把代碼所在的文件夾掛載到虛擬機上,對於文件多的項目,風扇就會狂轉。

雖然有上面說的兩個問題,可是因爲有環境隔離的好處,選擇Vagrant的程序員也就忍了。原本Docker剛出來的時候,也不是爲了幹掉Vagrant,你們相安無事,在各自的領域發光發熱,Docker主要目標集中在方便部署上,一個項目,打包成幾個容器,往服務器一放就搞定了。可是最近的幾個改進,讓愛折騰的程序員發現了Docker在本地開發環境上的潛力:git

  1. 使用操做系統的虛擬化技術,不在依賴於Virtualbox
  2. 提高了卷的地位,使得文件映射和持久化更方便

這樣一來,是時候用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
  1. 代碼放在app目錄下,這裏做爲示例,放了yii建立的basic應用
  2. niginx目錄下放了單獨的nginx容器構建文件,以及默認的PHP站點的nginix配置文件
  3. php目錄下放了單獨的php容器構建文件,由於Yii2有一些擴展是必須支持的,因此官方默認的php鏡像是不能知足要求,因此須要基於官方的容器再安裝一些必要的擴展;另外直接使用國外的源安裝因爲種種緣由,速度實在使人遺憾,因此sources.list.jessie裏放了163的源,構建的時候把這個源也放進容器

編寫docker-compose.yml

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

相關文章
相關標籤/搜索