Skip to content

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