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:強大的圖形化管理界面,包含完整的監控功能。
總結與最佳實務
- 務必設定 max-size:這是新手最容易踩的坑,千萬別讓日誌燒掉伺服器的硬碟。
- stdout 是王道:你的應用程式應該將日誌輸出到標準輸出,而不是自己去寫
.log檔案。這樣 Docker 才能統一收集。 - 宣告健康檢查:讓 Docker 知道你的程式是否真的準備好了,這對穩定性有巨大幫助。
- 定期清理:除了日誌,別忘了定期執行
docker system prune清理不再使用的資源。