by Devin Yang , 4 years ago

前言

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的設定方式,
進而產生或調整出符合您需求的環境設定。

Tags:

Devin Yang

有什麼建議或想法,歡迎提出來哦

No Comment

Post your comment

Login is required to leave comments

Similar Stories


docker

攻略docker版Let's Encrypt憑證申請

本文主要分享,我如何採用Docker的方式進行Let's Encrypt憑證申請, Let's Encrypt有相當多種類的ACME Client, 我將使用官方推廌Certbot(ACME Client)做說明。 並且使用docker的方式來執行ACME Client。

docker

Devin Yang的Docker初學筆記

這是我初學Docker時的筆記,有點粗糙,有調整了一下下。 但我想對於Docker初學者,應該可以提供一些初步的概念, 歡迎參考看看。

docker

如何簡單的用Docker建立internet命令列的測速程式呢?

如何簡單的用Docker建立internet命令列的測速程式呢? 這裡我們使用python的程式speedtest-cli 會用Docker主要的用例,例如我想要在我的NAS內進行測速, 雖然我的NAS內有python,但沒有pip指令,這時用Docker感覺上安全很多, 當然前題您的NAS需能跑Docker:)。 或者,我在MacOS的環境,我不想安裝speedtest-cli到我的MacOS中。 這時用Docker簡單的自建簡單的執行環境還滿不錯的。