Docker 教學大綱
0. 課程說明
- 課程目標:從入門到部屬與日常維運
- 預期環境:Docker Engine / Docker Desktop、VS Code + 擴充套件、Git
- 受眾:開發者、DevOps 初學者、內部系統維護人員
1. 認識 Docker
- 為什麼要容器化:可攜、隔離、一致性
- 與 VM 差異:映像檔、分層、Cgroups/Namespaces
- 基本名詞:Image / Container / Registry / Volume / Network
- 安裝與快速測試:
docker version、hello-world、docker run -it --rm alpine sh
2. Docker 基本操作
- 容器生命週期:
run、ps、stop、start、rm - 映像檔管理:
pull、images、rmi、tag、save/load - 進入與除錯:
exec -it、logs -f、inspect、top、stats - Volume 與持久化:具名/匿名 Volume、Bind mount、備份策略
- Network:bridge/host/none、自訂網路與服務互通
- Dockerfile 寫作與最佳實務
- 基底映像選擇、multi-stage build、
.dockerignore - 常見反模式與安全性提示(root 使用者、機密外洩)
- 基底映像選擇、multi-stage build、
3. Docker Compose(多容器協作)
- 為何使用 Compose:多服務定義、可複製、易分享
docker-compose.yml結構services、build、image、ports、volumes、environment、depends_on、healthcheckprofiles、deploy(資源限制)
- 常用指令:
docker compose up -d、down、ps、logs -f、exec -
範例:Web + DB + Cache ```yaml services: app: build: . ports: ["8080:8080"] env_file: .env depends_on: [db, redis] db: image: postgres:16 environment: POSTGRES_PASSWORD: example volumes: [pg:/var/lib/postgresql/data] redis: image: redis:7 volumes: pg: {} ````
-
進階技巧:多檔案覆寫(
-f)、環境變數注入、專案名稱(-p)
4. 用 VS Code 開發 Docker 專案
工具:Docker 擴充套件、Dev Containers(Remote – Containers)
4.1 Docker 擴充套件(圖形化管理)
- 圖形介面管理:Containers / Images / Volumes / Networks / Contexts
- 右鍵動作:Attach Shell、View Logs、Inspect、Prune
- 直接在 VS Code 建置與執行:
Dockerfile、docker-compose.yml導覽與 IntelliSense - Registry 整合:對接 Docker Hub / GHCR,Tag 與 Push
4.2 Dev Containers(容器即開發環境)
- 觀念:把「開發依賴」也容器化,確保每位開發者一致
- 三種開啟方式:在資料夾中開啟、在容器中重開資料夾、附加至執行中容器
- 最小範例(
.devcontainer/devcontainer.json):
{
"name": "Py Dev",
"image": "mcr.microsoft.com/devcontainers/python:3.12",
"features": { "ghcr.io/devcontainers/features/docker-in-docker:2": {} },
"postCreateCommand": "pip install -r requirements.txt",
"forwardPorts": [8080],
"customizations": { "vscode": { "extensions": ["ms-azuretools.vscode-docker"] } }
}
- 與 Compose 整合:以
docker-compose.yml定義開發服務、資料庫、快取 - 偵錯整合:Node/Python 在容器內下中斷點、
launch.json範例
4.3 VS Code 實戰工作流
- 一鍵 Task:Build、Run、Test、Lint
- 多階段 Dockerfile 與 VS Code 快速切換目標 Stage
- 在容器中跑測試、Coverage、Pre-commit hooks
5. 容器管理工具(GUI 與群集外掛)
5.1 Portainer
- 是什麼:Docker / Compose / Swarm / Kubernetes 的輕量管理面板
- 安裝(單節點快速起)
docker volume create portainer_data
docker run -d -p 9443:9443 --name portainer \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data portainer/portainer-ce:latest
- 常見操作:建立 Stack(Compose 檔)、管理 Volume/Network、使用者與 RBAC、Registry 認證
- 備援與升級:匯出設定、版本升級注意事項
5.2 其他工具速覽
- Rancher(多叢集 K8s 管理,可搭配 Docker 節點)
- LazyDocker(終端介面監控與操作)
6. Docker Swarm(簡易叢集/內建於 Docker Engine 的 Orchestrator)
備註:Swarm 模式目前仍維持支援,Mirantis 宣布將在 MKE 3 中至少支援至 2030;社群也持續指出「經典(獨立)Swarm 已退場,但 Swarm mode(整合於 Docker Engine)仍在維護與使用。(來源見下方註) (Mirantis, Docker Documentation, Reddit)
- Swarm 與 Kubernetes 的定位比較:學習曲線、操作簡易性、功能邊界
-
架設流程
-
初始化:
docker swarm init - 加入節點:
docker swarm join --token ... - 節點角色與管理:manager / worker、
docker node ls -
服務與 Stack 部署
-
docker service create --replicas 3 --name web -p 80:80 nginx - 以 Compose 檔發佈:
docker stack deploy -c docker-compose.yml mystack - 滾動更新、回滾:
docker service update --image ... - 網路與儲存:overlay network、Secrets/Configs 管理
- 監控與 GUI:Portainer 管 Swarm 節點、服務、Stack
- 實作:高可用 Nginx + 後端 API + Redis
註解與延伸閱讀:
- Mirantis 2025/07 宣布 Swarm(MKE3)支援至 2030。 (Mirantis, Efficiently Connected)
- 社群與文件常見澄清:獨立(classic)Swarm 已 deprecated;Docker Engine 的 Swarm mode 仍支援。 (Docker Documentation, Reddit)
7. 安全性、效能與映像檔治理
- 影像瘦身:Alpine/Distroless、多階段、Cache 最佳化
- 機密管理:
.env、Docker secrets、避免把憑證 bake 進 image - 權限與使用者:非 root 執行、檔案權限
- 相依修補:Trivy/Grype 掃描、SBOM、CVE 管理
- 資源限制:CPU/Memory/區塊 I/O 限額
- 日誌與監控:
docker logs、Prometheus + cAdvisor、Loki/Grafana
8. DevOps 與 CI/CD 整合
- GitHub Actions / GitLab CI:Build → Test → Scan → Push → Deploy
- 多環境部署:dev/staging/prod 的 Compose 變體與覆寫檔
- 私有 Registry:GHCR / Harbor / Nexus,影像命名與版本策略
- 滾動與藍綠/金絲雀(Swarm/K8s 對照)
9. 常見問題(FAQ)與疑難排解
- Bind mount 權限、line-ending、時區
- 內外網互通、DNS 解析、健康檢查失敗
- Build Cache 不生效、multi-arch(
buildx) - Windows/Mac 特殊議題:檔案系統效能、網路模式差異
- 清理資源:
system prune的安全使用
10. 範例與作業
- 作業 1:把現有專案容器化(Dockerfile + Compose)
- 作業 2:用 VS Code Dev Containers 建立一致的開發環境
- 作業 3:用 Portainer 建立 Stack,觀察滾動更新
- 作業 4:在兩台主機上建立 Swarm 叢集並做服務擴縮
附錄 A:速查表(Cheatsheet)
- 常用 CLI:建置、執行、偵錯、清理
- Compose 指令與 YAML 片段
- VS Code 快捷:Attach、Port Forward、Dev Containers 指令
- Portainer 管理路徑與常見操作
附錄 B:參考與延伸閱讀
- Docker 官方文件(Engine / Compose / Swarm)
- VS Code Docker / Dev Containers 擴充套件文件
- Mirantis(MKE/Swarm)官方部落格與說明
```