1. 認識 Docker
為什麼容器化?
- 一致的運行環境
- 快速啟動、可攜、隔離
- 更容易複製與回滾
與 VM 的差異
- VM:硬體虛擬化;Docker:OS 層隔離(namespaces、cgroups)
- 啟動時間、資源使用、鏡像分層
核心名詞
- Image:唯讀模板
- Container:Image 的運行實例
- Registry:鏡像倉庫(Docker Hub、GHCR)
- Volume / Network:資料持久化與通訊
安裝
- Windows/macOS:Docker Desktop
- Linux(Ubuntu 範例)
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
# 依官方文件加入來源、安裝 docker-ce / docker-ce-cli / containerd.io ...
第一次跑容器
docker run --rm -it alpine sh
簡單說:
--rm 代表容器一結束就自動刪除(包含容器本身與它的匿名 volumes)。
- 會刪:容器、該容器在
-v /data 這種只給「容器路徑」時自動建立的匿名 volume。
- 不會刪:具名 volume(例如
-v pgdata:/var/lib/postgresql/data)與 bind mount(-v $(pwd):/app)。
- 可與
-d 一起用(容器退出就刪),但不能和 --restart 政策並用。
常用指令 options 速查
docker run
| 參數 |
用途 |
-d |
背景執行(detached) |
--name <名> |
指定容器名稱 |
-p 主機:容器 |
連接埠對映(ex: -p 8080:80) |
-v 名稱:/path |
具名 volume 掛載 |
-v /主機路徑:/path |
bind mount |
--mount ... |
新式掛載語法(更明確) |
-e KEY=VAL / --env-file .env |
設定環境變數 |
--network <網路> |
指定網路(自訂 bridge/overlay 等) |
--rm |
容器結束自動移除(匿名 volumes 也清) |
--restart=always |
總是重啟(daemon 重啟也拉起來) |
--restart=unless-stopped |
類似 always,但手動停過後就不會再自動復活 |
--restart=on-failure[:N] |
只在異常退出時重啟,可選擇最多重試 N 次 |
-it |
互動式終端(常配 bash/sh) |
--cpus / --memory |
資源限制(ex: --cpus 1.5 --memory 512m) |
--gpus all |
指定 GPU(需 NVIDIA runtime) |
--user 1000:1000 |
以特定使用者身分執行 |
--workdir /app |
進入容器的工作目錄 |
--entrypoint <可執行檔> |
覆寫 image 既定 entrypoint |
--pull=always |
每次 run 前都拉最新 image |
--platform linux/amd64 |
指定平台(多架構 image 時) |
--health-cmd / --health-interval |
健康檢查 |
--add-host x:y / --dns <IP> |
额外 hosts 或 DNS |
--log-driver <driver> |
指定日誌驅動 |
--privileged |
提高權限(慎用) |
常見組合
# 開發互動
docker run --rm -it -v $(pwd):/app -w /app node:22-alpine sh
# 服務常見
docker run -d --name web -p 8080:80 --restart unless-stopped nginx:1.27
docker build / docker buildx build
| 參數 |
用途 |
-t 名稱:標籤 |
指定 image 名稱與標籤 |
-f Dockerfile |
指定 Dockerfile 路徑 |
--build-arg KEY=VAL |
傳遞建置參數(ARG) |
--target <stage> |
指定 multi-stage 的目標階段 |
--no-cache |
不使用快取建置 |
--pull |
建置前拉最新 base image |
--platform linux/amd64,linux/arm64 |
多平台建置(搭配 buildx) |
--cache-from/--cache-to |
外部快取來源/目標(buildx) |
--secret id=...,src=... / --ssh |
BuildKit 機密/SSH 轉傳 |
docker compose(CLI)
| 指令 |
常用參數 |
docker compose up |
-d 背景、--build 先建置、--scale svc=N |
docker compose down |
-v 同時刪 volumes、--remove-orphans |
docker compose logs |
-f 追蹤、-n 100 只看最後 N 行 |
docker compose exec |
-it 互動殼層 |
docker compose ps |
查看狀態 |
全域:-f 檔.yml、-p 專案名 |
指定多檔與專案名稱 |
Compose 檔常見鍵
services: { image/build, ports, volumes, environment, depends_on, healthcheck }
volumes: { 名稱: {} }、networks: { 名稱: {} }
deploy.resources.limits(Swarm 模式下資源限制)
其他常用指令
| 指令 |
用途 |
docker ps -a |
列出容器(含已停止) |
docker logs -f <容器> |
追蹤日誌 |
docker exec -it <容器> sh |
進入容器 |
docker cp a b |
主機與容器間拷檔 |
docker images / rmi |
查/刪 images |
docker volume ls / prune |
Volume 管理 |
docker network ls / inspect |
網路管理 |
docker system df / prune -af |
容量統計 / 清理(小心) |
小提醒
- 想要一次性測試:
--rm 很好用;想要長期服務:改用 --restart 政策(就不要 --rm)。
- 想保留資料:用具名 volume;臨時資料:匿名 volume 或 bind mount。
- 在 CI/CD 或多架構環境,優先使用 BuildKit / buildx 與
--platform。