Dockerfile

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.jsonnpm 才可以讀取裡面的套件清單並開始下載
    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,即可看到應用程式執行的結果!


初學者避坑指南

  1. 利用快取優化打包速度:上面的範例中,我們先複製 package.json 並執行 npm install,最後才複製其他程式碼(COPY . .)。這是因為 Docker 會快取(Cache)沒變動的層級。只要套件沒變,下次修改程式碼再打包時,就不用重新 npm install,速度會快非常多!
  2. 副檔名與大小寫:檔名必須精確為 Dockerfile,首字母大寫,且不要加 .txt 等副檔名。