Docker 基礎入門

第七章:進階操作與最佳實務

容器內不要用 root 執行程式

Dockerfile 預設以 root 執行容器內的程式,建議建立一般使用者並切換:

FROM node:20-alpine
RUN addgroup -S app && adduser -S app -G app
WORKDIR /app
COPY --chown=app:app . .
USER app
CMD ["node", "server.js"]

即使容器被攻破,攻擊者在容器內也只是一般使用者,能造成的破壞有限。

資源限制

docker run -d \
  --memory=512m \
  --cpus=1.0 \
  --name myapp myimage

避免單一容器吃光主機的 CPU 與記憶體,影響其他服務。

Healthcheck:自動健康檢查

HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost/ || exit 1
docker ps    # STATUS 欄位會顯示 healthy / unhealthy

日誌管理

預設 docker logs 會把容器的輸出全部存在主機磁碟上,長時間執行的服務可能佔用大量空間。可以設定日誌驅動與大小限制:

docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  --name myapp myimage

標籤(Tag)管理

  • 避免只用 latest,明確的版本號(如 myapp:1.2.0)能確保每次部署的版本一致
  • 可以同時打多個標籤:docker tag myapp:1.2.0 myapp:latest

掃描映像檔安全性

docker scout quickview myapp:1.0   # 檢查映像檔的已知漏洞(依版本而定的工具)

定期檢查基礎映像檔與相依套件是否有已知漏洞,並養成更新基礎映像檔版本的習慣,是維運上很重要的一環。

邁向叢集:Docker Swarm 與 Kubernetes

當服務需要跑在多台主機上、需要自動擴展與容錯時,Docker 內建的 Swarm 提供了簡單的叢集管理;而業界更主流的選擇是 Kubernetes,本系列後續不會深入,但了解這兩個名詞,有助於你規劃學習路線。