看懂 Dockerfile 和 docker-compose.yml
你不需要會寫,但要能看懂
想像你是一家連鎖電商的營運主管。你不需要親自煮每一道菜,但你需要看得懂廚房的食譜,才能知道:這道菜需要幾個步驟?哪些材料是關鍵?如果換一種材料,味道會差很多嗎?
Dockerfile 和 docker-compose.yml 就是這樣的「食譜」。
Dockerfile:單一服務的食譜
Dockerfile 是工程師用來建立映像檔的說明書。每一行都是一個步驟,Docker 會依序執行,最後打包成一個映像檔。
以下是一個電商網站「商品頁後端服務」的 Dockerfile 範例:
逐行解讀
| 指令 | 意思 | 類比 |
|---|---|---|
FROM node:20-alpine | 基底環境是 Node.js 20(精簡版) | 廚房用哪種爐具和基本設備 |
WORKDIR /app | 設定工作目錄 | 把食材放在哪個工作檯 |
COPY package.json ./ | 把套件清單複製進去 | 把採購清單帶進廚房 |
RUN npm install | 安裝所有相依套件 | 按照採購清單把食材備齊 |
COPY . . | 把所有程式碼複製進去 | 把食譜和所有食材都放進廚房 |
CMD ["node", "server.js"] | 容器啟動時執行的指令 | 廚師進廚房後,第一件事是什麼 |
重點:作為 PM / 營運,你不需要改 Dockerfile,但如果工程師說「我們要換 Node.js 版本」或「要加一個環境變數」,你現在知道他在改哪一行了。
docker-compose.yml:多個服務的總食譜
現實的電商平台不只有一個服務。至少會有:
- 後端 API(處理訂單、商品資料)
- 前端網站(用戶看到的頁面)
- 資料庫(存所有資料)
- 快取服務(加速查詢,例如 Redis)
docker-compose.yml 是把這些服務「組合起來」的總設定。
以下是一個電商平台的簡化範例:
關鍵概念解讀
services:定義有哪些服務
每個縮排的區塊(api、web、database)就是一個獨立的服務,對應一個容器。
image:用哪個映像檔
myshop/api:v2.3.1 的格式是 倉庫名稱/服務名稱:版本號。版本號非常重要——這就是為什麼回滾(rollback)才能指定回到哪個版本。
ports:對外開放哪些埠
"80:80" 表示「把容器內的 80 port 對應到主機的 80 port」。如果不開放 port,外界就連不進來。
environment:環境變數
這是把設定值注入容器的方式。資料庫密碼、API 金鑰、第三方服務的 URL,通常都放這裡。這也是為什麼工程師說「我要更新環境變數」時,需要重啟容器才會生效。
volumes:資料持久化
容器停止後,裡面的資料預設會消失。volumes 是把資料存到主機上的機制,確保資料庫的資料不會因為容器重啟而消失。
練習題
AI 協作:學了這個,跟 AI 怎麼配合?
能看懂 Dockerfile 和 docker-compose.yml,讓你可以把設定檔直接貼給 AI,請它用非技術語言解釋,或協助找出潛在問題。
你的人類優勢:
- 你知道這個服務的業務重要性——資料庫是否存著金流資料、是否有 PCI 合規要求,這些 AI 不清楚
- 你能判斷某個環境變數(例如折扣上限)的業務邏輯是否正確
可以這樣跟 AI 說:
以下是我們電商平台的 docker-compose.yml(貼上內容)。請用非技術人員能理解的語言,解釋這個系統由哪幾個服務組成,各自負責什麼。並指出有哪些設定,身為 PM 需要特別注意或追蹤的?
互動示範
挑戰任務
看 Dockerfile 範例,回答:如果工程師說「我們要把 Node.js 從 20 升級到 22」,他會改 Dockerfile 的哪一行?改完之後需要做什麼,新版本才會生效?
在 docker-compose.yml 範例中,「版本號」(tag)出現在哪裡?它的重要性是什麼?如果你是 PM,為什麼要要求工程師每次上線都要更新版本號?
如果你的電商平台要整合一個新的「金物流服務」,在 docker-compose.yml 裡,你需要新增哪些基本設定?(不需要寫正確的語法,用中文描述即可)