在這篇文章中我們將通過Docker在個人本地電腦上構建一個快速、輕量級、不依賴本地電腦所安裝的任何開發套件的可複製的Laravel和Vue項目的開發環境(開發環境的所有依賴都安裝在Docker構建容器里),加入Vue只是因為有的項目里會在Laravel項目中使用Vue做前後端分離開發,開發環境中需要安裝前端開發需要的工具集,當然前後端也可以分成兩個項目開發,這個話題不在本篇文章的討論範圍內。
所以我們的目標是:
開始前你需要先去安裝一個Docker客戶端,Docker的官網中有詳細的安裝方法。
第一步:獲取Laravel的源碼包
因為我們電腦上不安裝Composer,所以就不能使用Composer來創建Laravel項目了, 這裡我使用cURL直接從github上下載了最新的Laravel源碼包,你也可以使用wget或者git clone 來獲取源碼包。
上面的命令在curl下載完源碼包後會解壓源碼壓縮包,解壓完成後在把源碼壓縮包v5.5.0.tar.gz刪掉,執行完後你會看到一個laravel-5.5.0的項目目錄。
第二步:添加docker-compose.yml
在項目中創建docker-compose.yml文件。
Compose 項目是 Docker 官方的開源項目,負責實現對 Docker 容器集群的快速編排。我們知道使用一個 Dockerfile 模板文件,可以讓用戶很方便的定義一個單獨的應用容器。在這裡我們會用到四個容器分別將PHP、Mysql、Nginx放在四個不同的容器中,通過compose`將四個應用容器關聯到一起組成項目。
編排文件的開頭如下:
在編排文件中,把每個容器叫做一個服務,services下定義整個應用中用到的所有服務(即容器)。
App服務
APP服務的容器將執行我們項目中的代碼。
Notes:
現在我們需要創建上面build環節中提到的app.dockerfile這個文件了,具體內容如下:
圖圖圖??????
Notes:
Web服務
接下來,我們需要配置一個Web伺服器用,我們把這個容器在編排文件中命名成web
Notes:
根據鏡像文件的定義,我們把項目中的vhost.conf複製到了容器的/etc/nginx/conf.d/default.conf中,這樣基本的nginx配置就配置好了,vhost.conf中的定義如下:
Notes:
Mysql服務
接下來我們將配置Mysql服務,與上面兩個服務有點不一樣的是,在PHP-FPM和Nginx的容器中,我們配置本地電腦的文件可以同步到容器中供容器訪問,這讓我們開發時對文件作的更改能夠快速的在容器中得到反饋加快我們的開發過程。但是在資料庫容器中我們希望容器中創建的文件能夠持久化(默認容器銷毀時,容器內創建的文件也會被銷毀),我們可以通過Docker的數據捲來實現上述功能,只不過這次不用再把本地電腦的文件掛在到數據卷上了,Docker客戶端會管理創建的數據卷的在本地電腦上具體存儲的位置。
下面是編排文件中對database服務的設置
Notes:
將所有服務編排到一起
下面是完整的docker-compose.yml文件,通過編排文件我們將三個應用容器關聯在一起組成了項目的服務端
version: '2'
services:
# The Application
app:
build:
context: ./
dockerfile: app.dockerfile
working_dir: /var/www
volumes:
- ./:/var/www
environment:
- "DB_PORT=3306"
- "DB_HOST=database"
# The Web Server
web:
build:
context: ./
dockerfile: web.dockerfile
working_dir: /var/www
volumes_from:
- app
ports:
- 8080:80
# The Database
database:
image: mysql:5.6
volumes:
- dbdata:/var/lib/mysql
environment:
- "MYSQL_DATABASE=homestead"
- "MYSQL_USER=homestead"
- "MYSQL_PASSWORD=secret"
- "MYSQL_ROOT_PASSWORD=secret"
ports:
- "33061:3306"
volumes:
dbdata:
啟動服務
按照上面的步驟配置好編排文件還有指定的docker鏡像文件後,我們就可以通過下面的命令啟動服務了,執行完後會啟動上面文件里定義的三個服務。
docker-compose up -d
第一次啟動時,由於docker客戶端要下載上面提到的三個鏡像並且構建服務所以啟動速度會慢一些,等到下載完鏡像並構建完成後,以後的啟動都會非常快。
初始化Laravel項目
啟動完服務後我們可以初始化Laravel項目了,步驟跟官方文檔里介紹的一樣,但是需要在啟動的app服務的容器里執行:
Notes:
查看nginx日誌的方法:
執行完上面的命令後你就能通過http://127.0.0.1:8080/訪問到項目啦。
在我的Github gist有一組參考文件方便同學們參考 https://gist.github.com/kevinyan815/fa0760902d29f19a4213b4a16fe0501b
gist里的文件稍微舊一些,後來在使用的過程中又加入些新的PHP模塊和Node,之前composer也單獨放到了一個容器中,不過相信聰明的你看到這裡應該已經會根據需求更改這些文件啦。
原文連結:https://segmentfault.com/a/1190000018372614
本文作者:KevinYan