容器內不要用 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,本系列後續不會深入,但了解這兩個名詞,有助於你規劃學習路線。