2026 年 Docker 實戰:容器化部署完整指南
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 與最小基底映像
安全性要從建置階段就開始。三個基本動作:
latest。用 nginx:1.27-alpine 這種明確版本,甚至加上 digest 鎖定。docker scout cves myapp:1.0.0。把掃描接進 CI,讓高風險漏洞直接擋下部署。另外建議產生 SBOM(軟體物料清單),記錄映像中包含的所有套件與版本。這在合規稽核與漏洞爆發時(例如某個套件突然被揭露重大漏洞),能讓你快速判斷哪些映像受影響。
8-2 執行期安全:非 root、權限限制與 Rootless Docker
映像層面的安全只是第一步,執行期才是真正的戰場。基本原則:
USER,建立專屬使用者。read_only: true,需要寫入的目錄另外掛 Volume 或 tmpfs。cap_drop: [ALL] 再視需要加回特定能力。security_opt: ["no-new-privileges:true"] 幾乎沒有副作用,建議一律加上。8-3 效能調校與資源限制
幾個實際有感的調校方向:
--mount=type=cache 對套件管理器效果顯著,重複建置時間常能減少一半以上。local 或 json-file 搭配輪替設定,避免 I/O 成為瓶頸。deploy.resources.limits 設定上限,避免單一容器影響其他服務。RUN 指令合併,減少層數與映像大小。8-4 日誌、監控與備份
沒有監控的容器化部署,等於在黑盒子裡開車。最低限度要有的配置:
docker logs。pg_dump 等原生工具定期匯出,Volume 本身也要做快照。記得:備份沒驗證過就等於沒有備份。九、常見問題與疑難排解
9-1 十大常見錯誤與解法
-g "daemon off;" 之類的參數。docker inspect 的 Mounts 區段。映像太大。檢查是否忘記多階段建置或 .dockerignore。
COPY . . 提前會讓快取完全失效。埠被佔用。本機已有服務佔用該埠,或另一個容器映射了相同埠。
--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,你就已經具備了現代後端工程的基本門票。
容器化不是一次性的技能,而是一種持續精進的工程習慣。從今天開始,把每次的部署都當成一次可重複的實驗,你會發現,穩定交付其實沒有想像中那麼困難。