安全性與效能
容器要安全、有效率地長期執行,重點在五件事:Image 要小、不要用 root 執行、密碼不要放進 Image、定期檢查漏洞、限制容器能用的資源。這些做法大多只要在 Dockerfile 或 Compose 檔多寫幾行,但能避免最常見的資安問題與「一個容器拖垮整台主機」的狀況。
讓 Image 變小
Image 越小,下載越快,裡面可能有漏洞的套件也越少。
| 做法 | 說明 |
|---|---|
| 選精簡版的基底映像檔 | 用 python:3.12-slim、node:22-alpine,而不是完整版的 python:3.12 |
| 使用多階段建置 | 建置工具留在第一階段,最終 Image 只放執行需要的東西,見 Dockerfile 入門 |
寫 .dockerignore |
不要把 .git、node_modules、測試資料放進 Image |
| 安裝完順便清除暫存 | 在同一個 RUN 裡刪除下載的暫存檔 |
最後一項的寫法:
RUN apt-get update \
&& apt-get install -y --no-install-recommends curl \
&& rm -rf /var/lib/apt/lists/*
一定要寫在同一個 RUN 裡。如果分成兩個 RUN,暫存檔已經存進前一層,後面再刪也不會讓 Image 變小。
想知道 Image 有多大,用 docker images;想知道每一層佔多少,用 docker history <Image名稱>。
不要用 root 執行
容器裡的程式預設以 root(最高權限)執行。萬一程式有漏洞被入侵,攻擊者就拿到了 root 權限。在 Dockerfile 加上兩行,改用一般使用者:
其他可以降低風險的做法:
- 不要使用
--privileged:這會讓容器幾乎擁有主機的全部權限。 - 唯讀檔案系統:
docker run --read-only --tmpfs /tmp ...,程式就無法修改容器裡的檔案。
密碼不要放進 Image
不要在 Dockerfile 裡用 ENV 或 COPY 放密碼、API 金鑰。任何拿到 Image 的人,都能用 docker history 或解開 Image 看到這些內容。
正確的做法是在執行時才把密碼交給容器:
| 情境 | 做法 |
|---|---|
| 本機開發、Compose | 寫在 .env 檔,並把 .env 加入 .gitignore |
| Docker Swarm | 使用 docker secret,見 Docker Swarm |
| 建置時需要密碼(例如下載私有套件) | 使用 BuildKit 的 RUN --mount=type=secret,密碼不會留在 Image 裡 |
檢查 Image 有沒有漏洞
Image 裡的套件會陸續被發現安全漏洞(稱為 CVE)。所以要定期掃描,並用更新過的基底映像檔重新建置。
Docker Scout(Docker Desktop 內建):
docker scout quickview myapp:1.0 # 快速摘要
docker scout cves myapp:1.0 # 列出所有漏洞
docker scout recommendations myapp:1.0 # 建議改用哪個基底映像檔
Trivy(免費開源,常用在自動化流程):
在 Docker Desktop 的 Images 頁面點選 Image,也能直接看到 Docker Scout 的掃描結果。
什麼是 SBOM?
SBOM(Software Bill of Materials,軟體物料清單)是一份列出 Image 裡所有套件與版本的清單,就像食品的成分表。當某個套件被發現漏洞時,可以快速查出哪些 Image 受到影響。用 docker scout sbom myapp:1.0 可以查看。
限制資源
沒有限制的容器如果出問題(例如記憶體洩漏),可能會吃光整台主機的資源,連帶讓其他服務一起當掉。
用 docker run 時:
用 Compose 時:
超過記憶體上限時,容器會被強制停止,不會影響到其他服務。用 docker stats 可以即時看到每個容器用了多少 CPU 和記憶體。
日誌與監控
日誌
程式把訊息印到畫面上(stdout),就能用 docker logs 查看。要注意的是,日誌預設會一直累積,時間久了可能塞滿硬碟。可以在 Docker 的設定檔 /etc/docker/daemon.json(Docker Desktop 在 Settings → Docker Engine)限制大小:
意思是每個日誌檔最大 10 MB、最多保留 3 個。重新啟動 Docker 後,對新建立的容器生效。
監控
想用圖表長期觀察容器的狀況,常見的免費組合是:cAdvisor 收集容器數據 → Prometheus 儲存 → Grafana 畫成圖表。
參考資料
推薦影音
What is a Software Bill of Materials (SBOM)
簡述:Docker 官方短片,說明 SBOM 是什麼、有什麼用途,對應本頁「什麼是 SBOM?」。(Docker 官方)
Why Docker Scout?
簡述:Docker 官方短片,說明 Docker Scout 如何找出 Image 裡的漏洞並提供修補建議,對應本頁「檢查 Image 有沒有漏洞」。(Docker 官方)
更多影片請見 影音教學。