Skip to content

Docker 教學大綱

0. 課程說明

  • 課程目標:從入門到部屬與日常維運
  • 預期環境:Docker Engine / Docker Desktop、VS Code + 擴充套件、Git
  • 受眾:開發者、DevOps 初學者、內部系統維護人員

1. 認識 Docker

  • 為什麼要容器化:可攜、隔離、一致性
  • 與 VM 差異:映像檔、分層、Cgroups/Namespaces
  • 基本名詞:Image / Container / Registry / Volume / Network
  • 安裝與快速測試:docker versionhello-worlddocker run -it --rm alpine sh

2. Docker 基本操作

  • 容器生命週期:runpsstopstartrm
  • 映像檔管理:pullimagesrmitagsave/load
  • 進入與除錯:exec -itlogs -finspecttopstats
  • Volume 與持久化:具名/匿名 Volume、Bind mount、備份策略
  • Network:bridge/host/none、自訂網路與服務互通
  • Dockerfile 寫作與最佳實務
    • 基底映像選擇、multi-stage build、.dockerignore
    • 常見反模式與安全性提示(root 使用者、機密外洩)

3. Docker Compose(多容器協作)

  • 為何使用 Compose:多服務定義、可複製、易分享
  • docker-compose.yml 結構
    • servicesbuildimageportsvolumesenvironmentdepends_onhealthcheck
    • profilesdeploy(資源限制)
  • 常用指令:docker compose up -ddownpslogs -fexec
  • 範例: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 建置與執行:Dockerfiledocker-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

註解與延伸閱讀:


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)官方部落格與說明

```