Docker - 日誌記錄



Docker 日誌對於維護和排查在容器中執行的應用程式至關重要。它們提供對容器行為和效能的即時洞察,有助於識別問題並最佳化效能。它們捕獲的資訊範圍廣泛,涵蓋應用程式和 Docker 引擎可能產生的錯誤、警告和資訊性訊息。這些資料對除錯非常有用:開發人員可以使用這些資料來追蹤導致特定問題的事件,瞭解上下文並應用修復。

此外,Docker 日誌在監控和審計中具有重要意義。應收集並持續分析日誌,以確保應用程式平穩安全地執行。它可以檢測異常和未授權訪問等安全威脅的發生,以便可以快速響應潛在的漏洞。

Docker 日誌使系統能夠獲得必要的可見性和控制能力,以便對系統進行適當的管理,以維持生產環境中系統(其中正常執行時間和可靠性至關重要)的彈性和穩健性。

在本章中,讓我們進一步瞭解 Docker 日誌和日誌驅動程式。

Docker 日誌有何不同?

由於 Docker 的容器化特性,Docker 日誌與傳統日誌有所不同。讓我們看看基本區別。

集中和聚合

傳統日誌記錄通常涉及從單個伺服器或應用程式收集日誌,隨著伺服器和應用程式數量的增加,這種方式往往難以擴充套件,並會變得越來越麻煩。相比之下,Docker 日誌記錄通常涉及集中和聚合來自在各種主機上執行的多個容器的日誌。

在集中式方法中,這將簡化日誌管理,並使即使在複雜和分散式環境中也能輕鬆地從單點監視或分析日誌。

日誌驅動程式和外掛

Docker 提供廣泛的日誌驅動程式和外掛,用於定製收集、儲存和處理日誌的方式。這些日誌驅動程式允許將日誌傳送到不同的儲存位置——JSON 檔案、Syslog、Fluentd、AWS CloudWatch 等。這樣,可以提供多種選項來調整日誌設定以滿足特定的需求和偏好,並與現有的日誌記錄和監控工具無縫整合。

容器的短暫性

容器是短暫的;它們旨在具有較短的生命週期,並可以暫停、停止或刪除。這種短暫的特性似乎是傳統日誌記錄方法的瓶頸,傳統方法主要依賴於主機系統的持久本地儲存。Docker 透過在容器生命週期之外儲存日誌來解決這個問題。

永續性對於維護完整的事件歷史記錄至關重要,即使在刪除或替換容器後,也可以訪問這些關鍵診斷資訊。這些細微的差異突顯了一點:Docker 日誌記錄專為與容器化環境相關的動態和可擴充套件特性而設計。它體現在圍繞集中式日誌管理的解決方案中,從而使日誌資料可用。

Docker 日誌記錄策略和最佳實踐

主動日誌記錄是管理或支援 Docker 化應用程式的重要流程。日誌條目提供了對應用程式行為、效能和問題的寶貴洞察,從而允許主動管理和快速故障排除。

Docker 提供了幾種管理日誌記錄的方法,每種方法都有其優點和合適的用例。讓我們逐一討論它們。

透過應用程式進行日誌記錄

從 Docker 化應用程式進行日誌記錄最簡單的方法實際上是透過應用程式本身。這可以透過將其設定為使用標準輸出 (stdout) 和標準錯誤 (stderr) 來進行日誌記錄來實現。Docker 收集這些輸出,因此您可以使用 docker logs 命令輕鬆檢索日誌。

透過應用程式進行日誌記錄的優點

  • 易於實現 - 易於執行,無需額外配置。
  • 可移植性 - 可以透過 Docker 的日誌記錄本地輕鬆訪問日誌。
  • 相容性 - 與可以配置為將日誌輸出到 stdout 和 stderr 的任何應用程式都很好地配合使用。

最佳實踐

  • 結構化日誌記錄 - 由於採用結構化格式(即 JSON 日誌),因此可以更好地解析和分析日誌。
  • 日誌輪換 - 透過應用程式使用日誌輪換來限制日誌檔案膨脹。
  • 日誌級別 - 設定適當的日誌級別(例如,除錯、資訊、警告、錯誤)以指定日誌的詳細程度。

資料卷日誌記錄

另一種方法是使用 Docker 資料捲來儲存日誌。如果您將卷附加到容器內部寫入日誌的目錄,則可以確信它將能夠承受容器的刪除或重新啟動。

資料卷日誌記錄的優點

  • 永續性 - 日誌不會因容器的銷燬和重新建立而丟失。
  • 關注點分離 - 將日誌儲存與容器化應用程式分開。
  • 靈活性 - 外部日誌管理工具可以直接從卷訪問和處理日誌。

最佳實踐

  • 卷管理 - 監控和管理日誌卷大小,以確保磁碟空間不是問題。
  • 備份和保留 - 實施組織的日誌備份策略及其保留策略。
  • 訪問控制 - 保護日誌卷免受未授權訪問。

使用 Docker 日誌驅動程式進行日誌記錄

Docker 包含許多內建的日誌驅動程式,這些驅動程式提供了靈活的選項,用於將容器日誌傳送到各種目標:syslog、journald、Fluentd 和 AWS CloudWatch 等。它可以在守護程式和容器級別進行配置。

使用 Docker 日誌驅動程式進行日誌記錄的優點

  • 集中式日誌記錄 - 輕鬆收集來自多個主機和容器的日誌。
  • CI/CD 整合 - 包括與現有的日誌記錄基礎設施和工具的整合。
  • 可擴充套件性 - 它支援多個日誌儲存後端和服務。

最佳實踐

  • 選擇驅動程式 - 選擇與您的日誌記錄基礎設施和需求相匹配的日誌記錄驅動程式。
  • 配置 - 配置日誌驅動程式以確保交付的效能和可靠性達到最佳狀態。
  • 監控 - 持續監控驅動程式是否存在日誌記錄錯誤或問題。

使用特定日誌記錄容器進行日誌記錄

日誌記錄容器是專用的,這意味著它可以從主機上的所有其他容器收集日誌。這通常意味著容器執行日誌代理(如 Fluentd 或 Logstash),並聚合並將日誌傳送到中央日誌系統。

優點

  • 隔離 - 日誌記錄問題與其上下文隔離,與應用程式容器分開。
  • 可擴充套件性 - 它獨立於應用程式容器。
  • 靈活性 - 支援複雜的日誌處理和轉發配置。

最佳實踐

  • 資源分配 - 為日誌記錄容器分配足夠的資源以處理日誌量。
  • 網路配置 - 設定網路以實現容器之間安全有效的日誌傳輸。
  • 冗餘 - 為日誌記錄容器引入冗餘和故障轉移功能。

透過 Sidecar 方法進行日誌記錄

Sidecar 容器與 Kubernetes 或 Docker 設定中的同一 pod 中的主應用程式容器一起執行。Sidecar 容器的職責包括收集、處理和轉發應用程式日誌。

優點

  • 接近性 - 由於主容器靠近應用程式,因此它確保以低延遲收集日誌。
  • 模組化 - 日誌記錄功能可以獨立擴充套件和管理。
  • 一致性 - 在所有環境中都具有相同的日誌記錄配置。

最佳實踐

主容器和 Sidecar 容器之間應進行正確的同步。

  • 資源分配 - 為 Sidecar 容器分配足夠的資源進行日誌處理。
  • 可觀察性 - 觀察和監控主容器和 Sidecar 容器的執行狀況和功能。

如何使用 Docker Logs 命令使用 Docker 容器日誌?

管理和訪問日誌是使用 Docker 容器的重要組成部分。docker logs 命令提供了一種方便的方法來訪問和檢視正在執行的容器日誌。因此,本指南將引導您學習如何使用 docker logs 命令以及實際示例和最佳實踐。

Docker Logs 命令的基本用法

docker logs 命令用於獲取容器的日誌。語法很簡單,例如:

$ docker logs [OPTIONS] CONTAINER

這裡,CONTAINER 代表您要檢視其日誌的容器的名稱或 ID。

檢視日誌

要檢視容器的日誌,我們必須使用 docker logs 命令,然後是容器的名稱或 ID。例如:

$ docker logs my-container

以下命令將顯示容器 my-container 生成的所有日誌。

即時日誌流

-f--follow 標誌將允許您檢視正在執行的日誌,這就像在類 Unix 系統中對日誌執行“tail -f”一樣。它會立即顯示您的日誌:

$ docker logs -f my-container

尾部日誌

如果您只想檢視最新的日誌記錄,請使用 --tail 選項:這在管理大量日誌檔案時非常方便。

$ docker logs --tail 100 my-container

此命令將獲取 my-container 的最後 100 行日誌。

帶時間戳的日誌

對帶時間戳的日誌使用 -t--timestamps 選項。此選項會在每個日誌條目中引入時間戳,以便更容易關聯事件:

$ docker logs -t my-container

組合選項

然後可以組合多個選項來建立自定義日誌檢視。例如,如果您想檢視包含時間戳且限制為最後 50 個條目的日誌條目,可以使用 −

$ docker logs -f -t --tail 50 my-container

按日期過濾日誌

雖然 docker logs 命令不支援從日誌中過濾日期,但這可以使用 Unix grep 命令來實現。以下是一個演示示例 −

$ docker logs my-container | grep "2024-06-01"

此命令過濾 my-container 的日誌,只顯示包含 2024-06-01 日期的內容。

將日誌儲存到檔案

您還可以將這些日誌儲存到檔案中,以便後續分析或存檔 −

$ docker logs my-container > my-container-logs.txt

此命令將 my-container 的所有日誌記錄到名為 my-container-logs.txt 的檔案中。

日誌輪轉

Docker 本身並不執行日誌輪轉。因此,日誌檔案的大小可能會變得非常大。Docker 日誌驅動程式選項可以配置日誌輪轉。例如,日誌檔案的限制大小和日誌檔案的數量:在您的 `docker-compose.yml` 檔案或 `daemon.json` 中新增以下內容 −

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

它將每個日誌檔案的大小限制為 10 MB,最多保留三個日誌檔案。

什麼是日誌驅動程式?

Docker 日誌驅動程式是將來自 Docker 容器的日誌訊息定向到特定位置並以特定方式進行的一種手段。預設情況下,Docker 會捕獲每個容器的標準輸出 (stdout) 和標準錯誤 (stderr) 流中的日誌。

日誌驅動程式指定將這些日誌定向到哪裡:本地檔案、遠端伺服器,或者可能是與實際日誌系統外部的服務的掛鉤。Docker 還支援多個日誌驅動程式,以提供可擴充套件和靈活的日誌管理解決方案。

如何配置 Docker 日誌驅動程式?

您可以在 Docker 守護程式級別和每個容器的基礎上配置日誌驅動程式。

配置 Docker 守護程式的日誌驅動程式

要設定預設值,從而控制在 Docker 守護程式上管理的所有容器,可以使用 daemon.json 配置檔案。通常,此檔案位於 Linux 系統上的 /etc/docker/daemon.json。例如,以下是如何將其設定為記錄到 'JSON-file' 驅動程式 −

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

然後,要應用更改,必須透過執行以下命令重新啟動 Docker 守護程式 −

$ sudo systemctl restart docker

為單個容器使用日誌驅動程式

在啟動容器時使用 --logdriver 選項可以覆蓋預設日誌驅動程式。例如,要使用 syslog 日誌驅動程式,可以新增以下行 −

$ docker run --log-driver=syslog my-container

還可以指定以下內容以選擇更多日誌選項 −

$ docker run --log-driver=syslog --log-opt syslog-address=udp://:514 my-container

Docker 日誌預設儲存在哪裡?

預設情況下,Docker 使用日誌驅動程式:json-file。這種格式的日誌檔案將被放到主機上的 /var/lib/docker/containers// 目錄中。每個容器都將擁有其中一個目錄。日誌寫入名為 -json.log 的檔案中。

交付模式是什麼?

交付模式僅定義如何在 Docker 中將日誌訊息傳遞到其最終目的地。日誌驅動程式支援兩種主要的交付模式 −

阻塞模式(預設)

在阻塞模式下,訊息是同步交付的。容器內的傳送程序將暫停,直到日誌驅動程式確認已處理到日誌的訊息。就訊息從容器中轉出而言,它是可靠的。但是,如果日誌後端速度慢或不可用,這可能會影響效能。

非阻塞模式

在非阻塞交付中,容器程序不會等待日誌驅動程式處理日誌訊息,這提高了效能,但代價是,如果日誌驅動程式或其後端無法處理資料速率,則可能會丟失日誌。啟用非阻塞模式的一種方法是使用 mode 日誌選項。

設定非阻塞模式的示例 −

$ docker run --log-driver=json-file --log-opt mode=non-blocking my-container

Docker 日誌驅動程式選項/標誌

Docker 日誌驅動程式提供了許多選項或標誌,可以使用它們根據自己的需要進行配置。以下是一些常見可能性和常用日誌驅動程式 −

json-file

  • max-size − 日誌檔案在輪轉之前的最大大小。
  • max-file − 要保留的最大日誌檔案數量。
$ docker run --log-driver=json-file --log-opt max-size=10m 
   --log-opt max-file=3 my-container

syslog

  • syslog-address − 將傳送 syslog 訊息的伺服器地址。
  • syslog-facility − 要使用的 syslog 設施(例如,daemon、user)。
  • syslog-tls-ca-cert − 機器上 TLS 的 CA 證書的路徑。
$ docker run --log-driver=syslog --log-opt syslog-address=udp://:514 
   --log-opt syslog-facility=daemon my-container

Fluentd

  • fluentd-address − Fluentd 伺服器地址。
  • fluentd-async-connect − 非同步連線到 Fluentd。
  • fluentd-buffer-limit − 設定 Fluentd 的緩衝區限制。
$ docker run --log-driver=fluentd --log-opt fluentd-address=localhost:24224 
   --log-opt fluentd-async-connect=true my-container

AWS-Logs

  • awslogs-region − AWS 的區域。
  • awslogs-group − CloudWatch Logs 組的名稱。
  • awslogs-stream − CloudWatch Logs 流的名稱。
$ docker run --log-driver=awslogs --log-opt awslogs-region=us-east-1 
   --log-opt awslogs-group=my-log-group 
   --log-opt awslogs-stream=my-log-stream my-container

結論

透過使用 Docker 提出的多種日誌記錄方法,從應用程式級日誌記錄和資料捲到高階日誌驅動程式和流行的 sidecar,開發人員和系統管理員可以根據他們面臨的需求和操作要求調整日誌記錄設定。它們各自具有優點——從簡單易擴充套件到與外部日誌系統整合,從而在異構環境中提供全面的日誌管理。

常見問題

問題 1. Docker 中的預設日誌驅動程式是什麼,它是如何工作的?

在 Docker 中,json-file 驅動程式充當預設日誌記錄機制。此驅動程式捕獲容器生成的日誌,並將它們儲存為 JSON 物件,每個容器都有其專用日誌檔案。這種結構化格式便於解析和分析日誌資料,但如果這些檔案沒有得到有效管理,則需要注意潛在的儲存問題。

問題 2. 我可以自定義 Docker 處理日誌的方式嗎?

當然!Docker 提供各種日誌驅動程式供選擇,每個驅動程式都具有獨特的特性和行為。您可以選擇將日誌傳送到 Syslog 或 Fluentd 等集中式日誌服務的驅動程式,以便進行簡化的管理和分析。如果現有的驅動程式都不完全符合您的需求,您甚至可以選擇建立適合您特定要求的自定義日誌驅動程式。

問題 3. 如何檢視正在執行的 Docker 容器的日誌?

檢視正在執行的容器的日誌是一項簡單的任務。您可以使用 docker logs 命令,後跟容器的名稱或 ID 來顯示日誌。要即時監控日誌,請包含 --follow 選項。如果您只想檢視最新的條目,請使用 --tail 選項來限制輸出。對於更高階的過濾或分析,您可能需要探索專門為 Docker 設計的第三方日誌記錄工具。

問題 4. Docker 日誌記錄的一些最佳實踐是什麼?

Docker 中有效的日誌記錄涉及幾個關鍵實踐。首先,將多個容器的日誌集中到一個統一的位置可以大大簡化管理和分析。根據您的基礎架構和特定要求選擇合適的日誌驅動程式也至關重要。這包括平衡效能和驅動程式所需的特性等因素。

使用 JSON 等結構化格式可以簡化日誌解析和查詢,而設定日誌輪轉策略或使用自動管理日誌大小的驅動程式可以防止儲存問題。最後,主動監控您的日誌可以幫助您及時發現問題、安全威脅或效能瓶頸。

問題 5. 如何排除 Docker 中常見的日誌記錄問題?

在遇到 Docker 中的日誌記錄問題時,首先檢查您選擇的日誌驅動程式及其配置設定。確保日誌檔案正在寫入正確的位置,並且許可權已正確配置。如果您正在使用遠端日誌驅動程式,請確認網路連線已建立。

在某些情況下,只需重新啟動容器或 Docker 守護程式即可解決問題。如果問題仍然存在,請參考您特定日誌驅動程式的文件或尋求 Docker 社群論壇的幫助。

廣告