Cyber Coding Course

師其意,不泥其跡

攻略D-Laravel設定檔

前言

D-Laravel是一個採用Docker進行的PHP執行環境,將所有的服務放入容器中執行,
資料庫的服務(db),網頁伺服器的服務(web),PHP-FPM的服務(php)...等,
經由定義docker-compose.yml檔,我們能輕易調整資料庫的版本或PHP版本。
D-Laravel同時建立了簡易的bash,可幫我們更快速的採用docker,來建立Laravel的專案,並且完成資料庫設定。
就算您單純只是個PHP的開發著,其實也是可以透過D-Laravel,打造自己的開發環境的。
接下來,讓我們借由Docker官方文件,來理解D-Laravel做了那些設定。

關於docker-compose.yml設定

以下為D-Laravel v1.6.10版之docker-compose-normal.yml檔。
請點下方藍色連結查看說明: (往下捲動提供簡易的中文說明
version: '3.6'
services:
#=== 網頁伺服器的container ======================
 web:
  image: nginx
  dns: 8.8.8.8
  ports:
    - "80:80"
    - "443:443"
  volumes:
  - ./sites:/var/www/html
  - ./etc:/etc/nginx/conf.d
  - ./var/log/web:/var/log/nginx
  hostname: web
  networks:
    - dlaravel_net
  
#=== PHP-FPM container ==========================
### Laravel 5.6/5.7 >= 7.1.3
### Laravel 5.5 >= 7.0.0
### Laravel 5.4 >= 5.6.4
### Laravel 5.3 between 5.6.4 & 7.1.*
 php:
  network_mode: "service:web"
  image: deviny/fpm:7.2.10
  #image: deviny/fpm:7.1.22
  #image: deviny/fpm:7.0.32
  #image: deviny/fpm:5.6.38
  volumes:
  - ./etc/php:/usr/local/etc/php/conf.d
  - ./sites:/var/www/html
  - ./etc/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf
  ###建立composer cache###
  - ./etc/cache:/home/dlaravel/.composer/cache
  #- ./var/log/php:/var/log
  #- ./etc/supervisor:/etc/supervisor/conf.d
  #- ./var/log/supervisor:/var/log/supervisor
  environment:
   - TZ=Asia/Taipei
  #- PHP_IDE_CONFIG=serverName=dlaravel
  #- XDEBUG_CONFIG="remote_host=???? profiler_enable=1"
  #建立bash_aliases在etc下,可用來自訂dlaravel使用者的環境變數
  #- ./etc/bash_aliases:/home/dlaravel/.bash_aliases

#=== 資料庫 container ===========================
 db:
  image: mysql:5.7.19
  hostname: db
  ports:
    - "127.0.0.1:3306:3306"
  volumes:
    - ./etc/mysql/my.cnf:/etc/mysql/my.cnf
    - ./data:/var/lib/mysql
  environment:
   #- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD-secret}
   - MYSQL_ALLOW_EMPTY_PASSWORD= "yes"
   - TZ=Asia/Taipei
  networks:
    - dlaravel_net

#=== top-level netowks key ======================
networks:
    dlaravel_net:
 
簡短的中文說明
 語法 中文說明
version: '3.6' 非常明顯,就是compose-file的版本囉,不同docker-compose檔案版本會使用不同的Docker釋出版本。關於版本的相容請參看此文件
 
services 在分佈式應用程式中,應用程式的不同部分稱為“服務”。例如,如果您想像一個視訊共享站點,它可能包括一個用於將應用程式資料存儲在資料庫中的服務,一個用於在後台進行視訊轉碼的服務。 用戶上傳內容,前端服務等。

服務實際上就是“建立出的容器”。服務會運行一個映像(image)檔,但服務中編寫了映像(Image)檔的執行方式 - 像是應該使用哪些連接埠(ports),應該執行多少個容器副本,及服務具有所需容量等等。 擴展服務會調整運行在該應用程式中的容器實例的數量,從而為流程中的服務分配更多計算資源。

幸運的是,使用Docker平台定義,運行和擴展服務非常容易 - 只需編寫一個docker-compose.yml文件即可。
(作者註: 我想這裡指的服務是在Docker swarm mode下的服務,一個Service有多個Task,所以可以Scale,在D-Laravel的stack.yml中,有類似的定義像是一個web的服務replicas了4個task,這屬於進階的運用,我們可以不需理會。)
=====
上面我用Goolge翻譯後,小調整的,所以看了是不是覺的頭昏了,簡單說,services的字面上看,有s嘛,複數,所以services下是有多個服務的,以D-Laravel為例,主要有三個服務,分別是webphpdb
這也是為何,在D-Laravel建好的Project中,會把Laravel的.env的資料庫主機(DB_HOST)指到了db服務,非127.0.0.1囉。
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=test1
DB_USERNAME=test1
DB_PASSWORD=test1
image 定義要使用那個映象檔。docker的映像檔主要是由dockerfile產生的。
我可以在DockerHub上搜尋不同的印象檔,但請盡量選擇標示為官方版本的印像檔才是安全的。
dns

自訂的DNS伺服器。可以一個或多個。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9
ports 定義要暴露的連接埠(Expose ports)。
在docker文件中,host指的,就是我們執行docker的主機。透過了posts的設定,我們才能連到container內開啟的連接埠。
volumes 掛載主機端的目錄到容器內。在docker-compose的環境,當我們執行docker-compose down時,容器是會被移掉的,所以透過volumes的掛載,我們才能保留我們的資料。
當然Volume(卷宗)的使用決對不僅於此,請自行查看官方文件說明
environment 新增環境變數,在container中打env即可看到我們定義的環境變數。
hostname 直接翻譯主機名稱,非常明顯囉,定義了容器執行時使用的稱,而非顯示Container ID。
networks 在docker-compose的設定中,相同網路下的"服務"是可以互ping的,所以,我們可以看見,web及db服務都是使用了
  networks:
    - dlaravel_net
這代表了,我們在web的容器內能ping到db的服務。
我們可以發現到--links的方式以列為不建議使用了,所以D-Laravel的設定,並不採用links的方式,進行container之間的連接。
 
  network_mode: "service:web" 在php的服務下,是否發覺了這個network_mode的設定呢?
 php:
  network_mode: "service:web"
php的服務主要是php-fpm,他會開啟port 9000,這裡的策略上將他開啟的連接埠綁到了,
web的服務了,這樣在整合Laravel Dusk運用時才不會有問題。
並無規定php-fpm一定要採用此方式,當然如果您調整為networks的方式時,您必需手動變更nginx的設定。
例如: etc/default.conf。
將原來的web變更為php如下,代表了php的服務已不是使用network_mode綁定在web的服務上了。
fastcgi_pass web:9000;
變更為
fastcgi_pass php:9000;
最後,期盼本文可以讓您理解docker-compose.yml的設定方式,
進而產生或調整出符合您需求的環境設定。

作者: Devin Yang