經過昨天的教學,相信大家對於UNRIAD的Docker Compose已熟練
所以從今天要來開始進階寫Docker Compose程式了
我們要來在單個APP運行多個Container
在開始之前,我們需要先了解為什麼Docker需要利用Docker Compose做相依性管理:
如果是用Docker run
那每個容器要一同使用某個變量,是無法辦到的
但Docker Compose 因為能同時管理多個Container的特性
所以可在yaml裡定義某個屬性
例如:在.env檔案裡定義不同屬性及變量
不僅起到資安的作用,也能增加方便和易讀性
小提示
雖然叫".env"檔案,但可不只
能定義環境變數(environment:)喔!
舉例來說
.env檔案
IMG: mysql:latest
INTER_PORT: 8080
INTER_FOLDER: /var/lib/mysql
UNRAID_FOLDER: /mnt/user/appdata
MYSQL_ROOT_PASSWORD_1: test123
MYSQL_DATABASE_1: testdb
MYSQL_ROOT_PASSWORD_2: test987987
MYSQL_DATABASE_2: mydb
yaml檔案
version: "2.11"
services:
mysql:
image: ${IMG}
volumes:
- ${UNRAID_FOLDER}/mysql:${INTER_FOLDER}:rw
ports:
- 8888:${INTER_PORT}
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD_1}
MYSQL_DATABASE: ${MYSQL_DATABASE_1}
#第二個Container
mysql2:
image: ${IMG}
volumes:
- ${UNRAID_FOLDER}/mysql2:${INTER_FOLDER}:rw
ports:
- 8887:${INTER_PORT}
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD_2}
MYSQL_DATABASE: ${MYSQL_DATABASE_2}
這樣要改值,不只不用擔心手殘
也能規劃編輯/寫入檔案的權限
例如
.env >> root
docker-compose.yml >> nobody
舉例來說,有個雲端服務的APP(例如:NextCloud)
它是綁著資料庫來運作的(例如:mysql)
雖然我們可以在Docker主頁手動進行先後執行
就能解決某些APP因其他APP未啟動而產生錯誤
但這實在難搞阿,就沒有更懶人的方法嗎?
有的!
我們一起來利用Docker Compose設定啟動先後順序
利用剛剛的程式來改寫:
yaml檔案
version: "2.11"
services:
mysql:
image: ${IMG}
volumes:
- ${UNRAID_FOLDER}/mysql:${INTER_FOLDER}:rw
ports:
- 8888:${INTER_PORT}
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD_1}
MYSQL_DATABASE: ${MYSQL_DATABASE_1}
#第二個Container
mysql2:
image: ${IMG}
volumes:
- ${UNRAID_FOLDER}/mysql2:${INTER_FOLDER}:rw
ports:
- 8887:${INTER_PORT}
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD_2}
MYSQL_DATABASE: ${MYSQL_DATABASE_2}
# 新增以下Code
depends_on:
- mysql
這樣Compose就會等待mysql執行成功後,再執行mysql2了~
好的,這時執行Compose UP試試看能否正常運行!