Docker Logs 日誌管理與狀態監測

當你的容器在背景執行時,發生錯誤要如何查看?日誌 (Logs) 檔案會不會塞爆硬碟?本章將介紹 Docker 完整的日誌機制以及如何監控容器的健康狀態。

基礎指令速查

最基礎的指令是 docker logs。它會捕捉容器內程式輸出到 stdout (標準輸出) 和 stderr (標準錯誤) 的所有內容。

# 查看目前的日誌
docker logs my-app

# 即時更新 (-f) 並顯示時間戳記 (-t)
docker logs -ft my-app

# 只看最後 50 行
docker logs --tail 50 my-app

進階時間過濾

當日誌量很大時,你可以使用時間參數來縮小範圍:

# 查看過去 30 分鐘內的日誌
docker logs --since 30m my-app

# 查看特定日期範圍
docker logs --since "2024-01-01" --until "2024-01-02" my-app

日誌驅動 (Logging Drivers)

Docker 預設使用的是 json-file 驅動,它會將日誌存儲為本地的 JSON 檔案。但如果沒有限制,這些檔案會無限增長,最終導致磁碟爆滿。

防止日誌塞爆磁碟的配置

在生產環境中,你有兩種方式來限制日誌大小:

方法 A:針對單一容器 (Compose)

docker-compose.yaml 中設定:

services:
  app:
    image: my-app
    logging:
      driver: 'json-file'
      options:
        max-size: '10m' # 每個檔案最大 10MB
        max-file: '3' # 最多保留 3 個檔案

方法 B:全域設定 (daemon.json)

如果你希望「所有」新建立的容器都自動套用此限制,可以修改 /etc/docker/daemon.json

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

設定完成後需重啟 Docker 服務:sudo systemctl restart docker

其他常見驅動:

  • syslog:將日誌傳送到主機的 syslog 服務。
  • journald:傳送到 Linux 的 systemd journal。
  • awslogs / fluentd / gelf:將日誌傳送到雲端或集中化日誌平台 (如 ELK Stack)。

狀態監測與偵錯

docker stats:即時資源使用率

這就像是 Docker 版本的 top 指令。

docker stats

你可以看到每個容器的:

  • CPU %:CPU 使用率。
  • MEM USAGE / LIMIT:記憶體使用量與上限。
  • NET I/O:網路傳輸量。
  • BLOCK I/O:磁碟讀寫量。

docker top:查看內部進程

想知道容器內部到底在跑什麼?

docker top my-app

docker inspect:詳細配置資訊

查看容器的 IP 位址、掛載路徑、環境變數等所有底層細節。

# 取得單一資訊 (例如 IP)
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-app

容器健康檢查 (Health Check)

僅僅「運行中 (Running)」並不代表程式「正常」。例如 Java 程式可能還在啟動中,或是資料庫連線已斷開。

在 Dockerfile 中定義

# 每 30 秒檢查一次,超時 3 秒,連續失敗 3 次標記為 Unhealthy
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost/health || exit 1

在 Docker Compose 中定義

services:
  web:
    image: my-nginx
    healthcheck:
      test: ['CMD', 'curl', '-f', 'http://localhost']
      interval: 1m
      timeout: 10s
      retries: 3

使用 docker ps 時,你會看到狀態顯示為 (healthy)(unhealthy),這對於自動化運維(如 Swarm 滾動更新)至關重要。

即時事件監控:docker events

如果你想追蹤 Docker 引擎發生了什麼事(例如誰刪除了容器、哪個容器當機了),可以使用:

# 監控所有容器與映像檔的即時事件
docker events

# 只看特定容器的事件
docker events --filter container=my-app

進階工具推薦

除了內建指令,這些開源工具能讓你事半功倍:

  • ctop:終端機裡的容器狀態看板(類似 top,但專為容器設計)。
  • Dozzle:輕量級的 Web 版日誌查看器,不用進 SSH 就能看日誌。
  • Portainer:強大的圖形化管理界面,包含完整的監控功能。

總結與最佳實務

  1. 務必設定 max-size:這是新手最容易踩的坑,千萬別讓日誌燒掉伺服器的硬碟。
  2. stdout 是王道:你的應用程式應該將日誌輸出到標準輸出,而不是自己去寫 .log 檔案。這樣 Docker 才能統一收集。
  3. 宣告健康檢查:讓 Docker 知道你的程式是否真的準備好了,這對穩定性有巨大幫助。
  4. 定期清理:除了日誌,別忘了定期執行 docker system prune 清理不再使用的資源。