Docker 基礎入門

第四章:映像檔與 Dockerfile

Dockerfile 基本語法

Dockerfile 描述如何一步步建置出一個映像檔:

FROM node:20-alpine

WORKDIR /app
COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000
CMD ["node", "server.js"]
  • FROM:基礎映像檔
  • WORKDIR:設定容器內工作目錄
  • COPY:複製檔案進映像檔
  • RUN:建置時執行的指令
  • EXPOSE:宣告容器使用的連接埠(文件性質)
  • CMD:容器啟動時執行的指令

建置映像檔

docker build -t myapp:1.0 .

-t 指定映像檔名稱與標籤(tag),. 是建置上下文(Dockerfile 所在目錄)。

多階段建置(Multi-stage Build)

Docker 推廣的一個重要技巧,是用「多個 FROM」把「建置環境」與「執行環境」分開,讓最終映像檔變得更小:

# 建置階段:包含完整的編譯工具
FROM golang:1.22 AS builder
WORKDIR /src
COPY . .
RUN go build -o app .

# 執行階段:只包含執行檔,映像檔小很多
FROM alpine:3.19
COPY --from=builder /src/app /usr/local/bin/app
CMD ["app"]

COPY --from=builder 只把編譯好的執行檔複製到最終映像檔,不會把整個 Go 編譯環境也打包進去。

.dockerignore

.gitignore 類似,列出建置時不要複製進映像檔的檔案,例如:

node_modules
.git
*.log

這能加快建置速度,也避免不小心把機密檔案打包進映像檔。

分層快取

每一行指令都會產生一層,建議把「不常變動的步驟」(如安裝套件)放前面,「常變動的步驟」(如複製程式碼)放後面,修改程式碼後重新建置會更快。