Dockerfile 是用來自動化建置 Docker 映像檔(Image)的純文字說明書。
可以把它想像成一份食譜:
- 基礎食材(Base Image):你要用哪種作業系統或環境底子?
- 準備工作(Commands):要安裝哪些套件?檔案要放哪?
- 開火上菜(CMD):容器啟動時要執行的指令。
1. 初學者必學的 5 個核心指令
寫 Dockerfile 其實不難,90% 的情況下你只需要搞懂這 5 個指令:
| 指令 | 說明 | 比喻 |
FROM | 指定基礎映像檔(通常是 OS 或語言環境) | 準備地基 / 選湯底 |
WORKDIR | 設定容器內的工作目錄(後續指令執行的位置) | 切換到廚房切菜區 |
COPY | 將電腦(Host)上的檔案複製到容器內 | 把食材放進鍋裡 |
RUN | 建置映像檔時執行的指令(通常用於安裝套件) | 備料(切菜、洗菜) |
CMD | 容器啟動後預設執行的指令 | 點火開吃 |
注意事項:
RUN是在「打包映像檔」時執行的(只執行一次);CMD則是容器「每次啟動」時才會執行的。
2. 實戰範例:Node.js Web 應用
假設有一個簡單的 Node.js 專案,檔案結構如下:
my-node-app/
├── package.json
├── index.js
└── Dockerfile
Dockerfile 範例
在專案根目錄建立名為 Dockerfile(無副檔名)的檔案,內容如下:
FROM node:18-alpine
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]
解說如下:
- # 1. 指定官方 Node.js 18 輕量版(alpine)作為基礎環境
FROM node:18-alpin - # 2. 設定容器內的工作目錄為 /app
WORKDIR /app - # 3. 把電腦裡的
package.json複製一份,放到容器裡面的/app/package.json。
COPY package.json ./ - # 4. 容器裡面終於有了
package.json,npm才可以讀取裡面的套件清單並開始下載
RUN npm install - # 5. 複製專案其餘所有檔案到容器內
COPY . . - # 6. 標示這個容器會使用 3000 埠號(主要用於提示與文件化)
EXPOSE 3000 - # 7. 設定容器啟動時執行的指令
CMD [“node”, “index.js”]
3. 如何編譯與執行?
寫好 Dockerfile 後,開起終端機(Terminal)執行以下步驟:
1.建置映像檔 (Build):打包你的應用程式。
在 Dockerfile 所在目錄執行:
docker build -t my-node-app:1.0 .
-t my-node-app:1.0:為你的映像檔命名與加上版本號。- 末尾的
.:代表 Dockerfile 在當前目錄。
2.啟動容器 (Run):將映像檔運行起來。
建置完成後,啟動容器並將電腦的 3000 埠對接容器的 3000 埠:
docker run -p 3000:3000 -d --name my-running-app my-node-app:1.0
-p 3000:3000:實作 Port 轉發([電腦 Port]:[容器 Port])。-d:在背景執行(Detached mode)。
3.驗證結果:確認服務正常運作。
打開瀏覽器輸入 http://localhost:3000,即可看到應用程式執行的結果!
初學者避坑指南
- 利用快取優化打包速度:上面的範例中,我們先複製
package.json並執行npm install,最後才複製其他程式碼(COPY . .)。這是因為 Docker 會快取(Cache)沒變動的層級。只要套件沒變,下次修改程式碼再打包時,就不用重新npm install,速度會快非常多! - 副檔名與大小寫:檔名必須精確為
Dockerfile,首字母大寫,且不要加.txt等副檔名。