這幾天我們學習了如何建立Container image、建置運行APP、使用Volumes、Bind Mounts以及建立自己的MySQL,但是每次執行、更新、停止都要一個一個指令實在太花時間了,難道沒有辦法一次就能執行完嗎!?
沒問題!就讓Docker Compose來解決你的困擾。
Docker Compose只要一行指令就能執行multi-container的全部動作!只需要透過YAML定義好APP的設置,相等於使用批次檔管理檔案的概念。
接下來讓我們開始來實作Docker Compose吧!
首先要先定義好APP的設置因此從各個建置container image的命令看起吧,昨天建立的multi-container共有APP跟MySQL這兩個container因此接下來就根據這兩個來建立。
首先需要在APP的root底下建立compose檔案,因此先建立docker-compose.yml
,並先寫上要使用的版本。
docker-compose.yml
version: "3.8"
昨天我們在執行APP的時候使用了以下的指令
docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:12-alpine \
sh -c "yarn install && yarn run dev"
根據以上的命令編寫至compose檔案裡
docker-compose.yml
version: "3.8"
services:
# services 代表需要執行的containers
app:
# container 名稱
image: node:12-alpine
# image FROM
command: sh -c "yarn install && yarn run dev"
# 帶入-c flag的指令
ports:
- 3000:3000
working_dir: /app
# 帶入-w flag的路徑
volumes:
- ./:/app
# 帶入-v flag的路徑
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
# 帶入-e flag的內容
昨天我們在執行MySQL的時候使用了以下的指令
docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
根據以上的命令編寫至compose檔案裡
docker-compose.yml
version: "3.8"
services:
app:
# The app service definition
# ...
mysql:
image: mysql:5.7
# image FROM
volumes:
- todo-mysql-data:/var/lib/mysql
# 帶入-v flag的路徑
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
# 帶入-e flag的內容
volumes:
# 在這邊指定的volumes會提供給全部的services
todo-mysql-data:
最後compose則會呈現這樣
version: '3.8'
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
在我們擁有compose檔案之後就可以開始執行!!
執行以下命令
docker-compose up -d
還記得我們執行APP、MySQL都會使用的 -d flag嗎,其實不是忘記加在compose檔案裡呢,而是在這邊執行就好了。
執行完可以在輸出看到
Creating network "app_default" with the default driver
Creating volume "app_todo-mysql-data" with default driver
Creating app_app_1 ... done
Creating app_mysql_1 ... done
可以看到Docker Compose很貼心的幫我們建立了網路來連接volume了
如果要移除Docker Compose也是非常方便
只要執行以下命令,既然開始是up那結束自然是down瞜
docker-compose down
這邊要注意的是,移除compose的時候不會幫你移除volume,要一同移除volume則需要加上
--volumes
flag
終於把基礎教學學習完了,也了解了Image Layering、Layer Caching以及Multi-Stage Builds的概念,只是篇幅會太長就決定不加入此次文章。
這次的挑戰是打算只查看相關的官方文件而不參考他人文章教學的作法,因此有些不太懂得地方會先以主觀認知帶過,用意在於能夠不被他人的主觀意識影響,自行去了解其概念理論。
接下來的預估了幾個目標,例如簡單了解雲端部屬Docker、K8s等進階管理使用Docker的方法,之後再來詳細研究Docker常用的命令及各種flag,以及Dockerfile、Docker Compose file的寫法,預期還會有Docker api的使用 就敬請期待了。
參考文獻:
Docker官方文件