跳轉至

建立 2025-08-18 更新 2026-09-28

安全性與效能

容器要安全、有效率地長期執行,重點在五件事: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 加上兩行,改用一般使用者:

RUN useradd --create-home appuser
USER appuser

其他可以降低風險的做法:

  • 不要使用 --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(免費開源,常用在自動化流程):

trivy image myapp:1.0

在 Docker Desktop 的 Images 頁面點選 Image,也能直接看到 Docker Scout 的掃描結果。

什麼是 SBOM?

SBOM(Software Bill of Materials,軟體物料清單)是一份列出 Image 裡所有套件與版本的清單,就像食品的成分表。當某個套件被發現漏洞時,可以快速查出哪些 Image 受到影響。用 docker scout sbom myapp:1.0 可以查看。

限制資源

沒有限制的容器如果出問題(例如記憶體洩漏),可能會吃光整台主機的資源,連帶讓其他服務一起當掉。

用 docker run 時:

docker run -d --cpus 1 --memory 512m myapp:1.0

用 Compose 時:

services:
  app:
    image: myapp:1.0
    deploy:
      resources:
        limits:
          cpus: "1.0"
          memory: 512M

超過記憶體上限時,容器會被強制停止,不會影響到其他服務。用 docker stats 可以即時看到每個容器用了多少 CPU 和記憶體。

日誌與監控

日誌

程式把訊息印到畫面上(stdout),就能用 docker logs 查看。要注意的是,日誌預設會一直累積,時間久了可能塞滿硬碟。可以在 Docker 的設定檔 /etc/docker/daemon.json(Docker Desktop 在 Settings → Docker Engine)限制大小:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

意思是每個日誌檔最大 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 官方)

更多影片請見 影音教學。