2026 年 Docker 實戰:容器化部署完整指南

modern%20workspace%20with%20laptop%2C%20smartphone...
發表時間:2026 年 09 月 17 日 | 更新日期:2026 年 09 月 17 日 | 編輯:雅寶社區編輯團隊
2026 年 Docker 實戰:容器化部署完整指南|ty} - 雅寶社區 · 頂客論壇

cache-from: type=gha

cache-to: type=gha,mode=max

docker compose up -d --no-deps --scale api=2 api

sleep 20

docker compose up -d --no-deps --scale api=1 api

inference:

image: my-inference:latest

deploy:

resources:

reservations:

devices:

  • driver: nvidia

count: 1

capabilities: [gpu]

需要注意的是,映像中的 CUDA 版本必須與主機驅動相容,模型檔案建議放在 Volume 而非打包進映像,否則映像會膨脹到數 GB 且無法獨立更新模型。

八、安全、效能與維運最佳實踐

8-1 映像安全:掃描、SBOM 與最小基底映像

安全性要從建置階段就開始。三個基本動作:

  • 選最小基底。能用 distroless 或 Alpine 就不要用完整版 Ubuntu。基底越小,內含的已知漏洞就越少。
  • 固定版本標籤。不要用 latest。用 nginx:1.27-alpine 這種明確版本,甚至加上 digest 鎖定。
  • 掃描映像。Docker Scout 可以直接掃出 CVE 並提供修復建議:docker scout cves myapp:1.0.0。把掃描接進 CI,讓高風險漏洞直接擋下部署。
  • 另外建議產生 SBOM(軟體物料清單),記錄映像中包含的所有套件與版本。這在合規稽核與漏洞爆發時(例如某個套件突然被揭露重大漏洞),能讓你快速判斷哪些映像受影響。

    8-2 執行期安全:非 root、權限限制與 Rootless Docker

    映像層面的安全只是第一步,執行期才是真正的戰場。基本原則:

  • 永遠用非 root 執行。在 Dockerfile 最後加上 USER,建立專屬使用者。
  • 唯讀根檔案系統。加上 read_only: true,需要寫入的目錄另外掛 Volume 或 tmpfs。
  • 移除不必要的能力。用 cap_drop: [ALL] 再視需要加回特定能力。
  • 停用權限提升。security_opt: ["no-new-privileges:true"] 幾乎沒有副作用,建議一律加上。
  • 考慮 Rootless Docker。讓 Docker Daemon 本身以非 root 身分執行,即使容器逃逸也拿不到主機 root。
  • 8-3 效能調校與資源限制

    幾個實際有感的調校方向:

  • 善用建置快取。BuildKit 的 --mount=type=cache 對套件管理器效果顯著,重複建置時間常能減少一半以上。
  • 調整日誌驅動。高流量服務改用 local 或 json-file 搭配輪替設定,避免 I/O 成為瓶頸。
  • CPU 與記憶體限制。用 deploy.resources.limits 設定上限,避免單一容器影響其他服務。
  • 避免過度分層。把相關的 RUN 指令合併,減少層數與映像大小。
  • 選擇合適的儲存驅動。現代 Linux 發行版預設的 overlay2 通常已是最佳選擇,不需手動更動。
  • 8-4 日誌、監控與備份

    沒有監控的容器化部署,等於在黑盒子裡開車。最低限度要有的配置:

  • 日誌集中化。用 Loki、Fluent Bit 或雲端日誌服務收集容器輸出,不要只靠 docker logs。
  • 指標監控。cAdvisor 搭配 Prometheus 收集容器層級指標,Grafana 做視覺化。
  • Volume 備份。資料庫用 pg_dump 等原生工具定期匯出,Volume 本身也要做快照。記得:備份沒驗證過就等於沒有備份。
  • 告警設定。容器重啟次數異常、記憶體逼近上限、健康檢查連續失敗,這些都應該觸發通知。
  • 九、常見問題與疑難排解

    9-1 十大常見錯誤與解法

  • 容器啟動後立刻結束。主程序必須是前景執行。若服務預設 daemon 化,加上 -g "daemon off;" 之類的參數。
  • 資料在容器重啟後消失。忘了掛 Volume。檢查 docker inspect 的 Mounts 區段。
  • 映像太大。檢查是否忘記多階段建置或 .dockerignore。

  • 建置每次都重跑全部步驟。COPY 的順序放錯了,把 COPY . . 提前會讓快取完全失效。
  • 容器間連不上。確認是否在同一自訂網路、是否用服務名稱而非 localhost。
  • 埠被佔用。本機已有服務佔用該埠,或另一個容器映射了相同埠。

  • 權限錯誤(Permission denied)。綁定掛載的主機目錄權限與容器內使用者 UID 不符。
  • 拉取映像被限流。Docker Hub 對匿名使用者有速率限制,登入帳號或改用自架 Registry。
  • 記憶體被吃光導致 OOM Kill。為容器設定記憶體上限,並檢查應用是否有記憶體洩漏。
  • ARM 與 x86 映像不相容。用 buildx 建多平台映像,或指定正確的 --platform。
  • 9-2 除錯工具箱

    遇到問題時,這幾招依序用下去通常都能定位:

    # 看容器為什麼掛掉

    docker logs --tail 200 <container>

    docker inspect <container> | grep -A 20 State

    進容器看現場(即使容器已停止)

    docker run -it --rm --entrypoint sh myapp:1.0.0

    檢查網路與 DNS

    docker run --rm --network myapp_backend nicolaka/netshoot nslookup db

    docker run --rm --network myapp_backend nicolaka/netshoot curl -v http://api:3000/health

    檢查資源使用

    docker stats --no-stream

    docker system df -v

    netshoot 這個映像內建了 curl、dig、tcpdump、iperf 等工具,是排查容器網路問題的利器。把它跑在目標網路上,就能模擬服務之間的真實連線狀況。

    十、結語:把容器化變成你的日常肌肉記憶

    回頭看這篇的內容,從環境建置、Dockerfile 撰寫、Compose 編排,到安全性、CI/CD 自動化與部署實務,其實圍繞著同一個核心觀念:把「怎麼跑」這件事從人的記憶裡,搬到可執行、可版控的程式碼裡。

    2026 年的軟體開發,變化速度只會更快。今天流行的工具,三年後可能被取代;今天的最佳實踐,明年可能被推翻。但「可重現」、「可隔離」、「可自動化」這三個原則不會變,而 Docker 目前仍是實踐這三個原則最廣泛、最成熟的工具。把基礎打好,未來要遷移到任何新的容器技術或編排平台,都會輕鬆很多。

    如果你還沒開始,建議的下一步很具體:挑一個你手上現有的小專案,寫一份 Dockerfile 把它打包起來,再用 Compose 加上一個資料庫與一個反向代理。過程中一定會踩坑,但每一個坑都會讓你對容器的理解更深一層。等到你能夠不看文件寫出一份生產級別的 compose.yaml,你就已經具備了現代後端工程的基本門票。

    容器化不是一次性的技能,而是一種持續精進的工程習慣。從今天開始,把每次的部署都當成一次可重複的實驗,你會發現,穩定交付其實沒有想像中那麼困難。

    🏠 返回首頁