Dockerfile 與 Docker Compose 寫法全攻略
前言
各位同學應該常常聽到一句話:「有了 Docker,環境跑起來就不怕!」
但真的要寫 Dockerfile 或 compose.yaml 的時候,十之八九還是會卡在格式,或不小心讓主機資源爆掉。
這篇文章就來整理一下 2025 年的實務寫法:
- Dockerfile 怎麼寫。
- Compose(compose.yaml)怎麼寫。
- 怎麼限制資源,避免主機 GG。
Dockerfile:容器的食譜
Dockerfile 的角色就像食譜,逐行告訴 Docker 怎麼建置你的應用環境。常見的幾個指令如下:
- FROM:指定基礎映像,例如
FROM python:3.11-slim。 - WORKDIR:設定容器中的工作路徑。
- COPY / ADD:把檔案從宿主機複製到容器。
- RUN:建置階段要執行的指令(例如安裝套件)。
- CMD:定義容器啟動時要跑的預設指令。
- ENTRYPOINT:跟 CMD 類似,但更「強制」,適合固定的啟動行為。
- ENV:設定環境變數。
- EXPOSE:宣告容器會用到的 Port(僅供文件用途,實際仍要用
-p或ports)。
範例:Go 應用的 Dockerfile
1FROM golang:1.22-alpine
2WORKDIR /app
3
4# 安裝依賴
5COPY go.mod .
6COPY go.sum .
7RUN go mod download
8
9# 複製程式碼並建置
10COPY . .
11RUN go build -o server .
12
13# 開放服務 Port
14EXPOSE 8080
15
16# 啟動指令
17CMD ["./server"]
乾乾淨淨的一份食譜,就能讓 Go 專案跑起來。
Docker Compose:多容器的劇本
有了 Dockerfile 只是建好環境,Compose 則像劇本,能協調多個服務一次跑起來。
基本結構
在 Compose v2(2023 之後)開始:
version欄位 可以省略,Compose 會自動偵測 schema。services:定義多個容器服務。volumes、networks:全域資源。
範例:API + Postgres
1services:
2 api:
3 build: .
4 ports:
5 - "8080:8080"
6 volumes:
7 - ./data:/app/data
8 environment:
9 - ENV=production
10 depends_on:
11 - db
12 deploy:
13 resources:
14 limits:
15 cpus: "1.0"
16 memory: 512M
17
18 db:
19 image: postgres:16
20 restart: always
21 environment:
22 POSTGRES_USER: user
23 POSTGRES_PASSWORD: password
24 POSTGRES_DB: demo
25 volumes:
26 - db-data:/var/lib/postgresql/data
27
28volumes:
29 db-data:
👉 注意:
過去常見的 cpus、mem_limit 屬性,在 v2 中雖然還能用,但已經屬於 legacy 寫法,官方建議改成 deploy.resources。
舊版 vs 新版:資源限制對照表
| 功能 | 舊版寫法 (legacy) | 新版建議寫法 (v2) |
|---|---|---|
| 限制 CPU | cpus: "1.0" | deploy.resources.limits.cpus: "1.0" |
| 限制記憶體 | mem_limit: "512m" | deploy.resources.limits.memory: 512M |
| 保證資源 | 無 | deploy.resources.reservations |
| 多副本 | scale: 3(已廢棄) | deploy.replicas: 3(Swarm 才生效) |
👉 小結:
- 單機環境:只會套用
limits.memory與limits.cpus。 - Swarm 環境:
replicas、placement、reservations才會生效。
限制資源:避免把主機吃爆
如果沒有設限,容器很容易就把主機 CPU、記憶體吃光光。
在 Compose v2,建議用 deploy.resources 來控制。
單機 Compose 寫法
1services:
2 api:
3 build: .
4 deploy:
5 resources:
6 limits:
7 cpus: "0.5" # 限制 0.5 顆 CPU
8 memory: 256M # 限制 256MB 記憶體
雖然 deploy 最初是給 Docker Swarm 用的,但在 Compose v2(單機模式)也能套用 資源限制。
Swarm:補充說明
deploy 區塊完整功能(replicas、placement、update_config…)原本是設計給 Docker Swarm 的。
不過要提醒:
- Swarm 在 2023 後已進入維護模式,官方重心已經移到 Kubernetes。
- 單機 Compose 雖然能吃到部分
deploy.resources,但像replicas、placement在非 Swarm 環境並不會生效。
👉 如果是新專案,不建議再投資 Swarm,應該直接考慮 Kubernetes 或單機 Compose。
GPU/TPU 限制
在 AI/ML 場景,常常需要 GPU。
在 Compose v2.5 之後,可以這樣寫:
1services:
2 trainer:
3 image: tensorflow/tensorflow:latest-gpu
4 deploy:
5 resources:
6 reservations:
7 devices:
8 - driver: nvidia
9 count: 1
10 capabilities: [gpu]
👉 補充:
- 需要安裝 NVIDIA Container Toolkit。
- 等價於
docker run --gpus 1。 - 舊的
capabilities: ["nvidia-compute"]仍能用,但建議用driver: nvidia+capabilities: [gpu]。
docker run 寫法
不透過 Compose,也能在 docker run 限制:
1docker run --cpus="0.5" --memory="256m" myapp:latest
--cpus需要 cgroup v2 支援(大部分 Linux 已預設啟用)。- 在 macOS/Windows 的 Docker Desktop,限制會作用在 VM 層級,不是原生宿主機。
小結
到 2025 年為止,幾個要點可以記住:
version可省略 → Compose v2 會自動偵測。cpus、mem_limit是舊寫法 → 改用deploy.resources。- Swarm 已進入維護模式 → 新專案不要再用。
- GPU 支援靠 NVIDIA Container Toolkit →
deploy.resources.devices或--gpus。 - Docker Desktop 限制 → 設定套用在 VM,不是宿主機。