如何查看 Docker 安裝的事件歷史記錄

已發表: 2022-08-11

碼頭工人標誌

每當守護進程執行重要操作時,Docker 引擎都會記錄一個事件。 您可以訪問事件日誌以識別操作發生的時間並跟踪對象隨時間的變化。

在本文中,我們將解釋作為事件捕獲的內容以及您可能希望在何時查看它們。 然後,我們將展示如何使用 Docker CLI 和 REST API 實時監控事件。

什麼是 Docker 事件?

Docker 事件描述了 Docker 守護進程所執行的活動。 大多數與容器、圖像、捲和網絡等對象的交互都會記錄一個事件,創建一個日誌,您可以使用它來檢查過去的更改。

有許多不同類型的事件可以識別環境中的特定變化:

  • 創建和刪除容器
  • 容器健康檢查狀態
  • 使用docker exec在容器內執行的命令
  • 拉取和推送圖像
  • 創建、銷毀、掛載和卸載卷
  • 啟用和禁用 Docker 守護程序插件

您可以在 Docker 的文檔中查看完整列表。

每個記錄的事件都包含一個時間戳和受影響對象的 ID。 您可以使用此信息來收集環境更改的歷史記錄,無論您是否觀察到它們的原始觸發器。

存儲的事件還可以幫助診斷問題,例如意外的容器故障。 查看日誌可讓您確定容器停止的準確時間,並提供可以與其他日誌關聯的數據點。 事件可以確定容器的健康檢查何時開始失敗,從而縮小您需要檢查外部服務以確定問題根本原因的時間。

使用 Docker CLI 流式處理 Docker 事件

docker events CLI 命令將事件從 Docker 守護程序流式傳輸到終端窗口。 事件將實時顯示,直到您通過按 Ctrl+C 鍵盤組合終止進程。

運行不帶參數的命令將不會顯示任何輸出。 僅顯示新活動,因此輸出保持為空,直到事件發生。 您可以通過在不同的 shell 中啟動一個新容器來激發一個:

 $ docker run --rm hello-world

現在,運行docker events命令的終端窗口中應該出現幾個事件:

 2022-05-31T15:20:00.267970018+01:00 圖像拉 hello-world:latest (name=hello-world)
2022-05-31T15:20:00.347054862+01:00 容器創建 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378(圖像=hello-world,名稱=nifty_morse)
2022-05-31T15:20:00.347805277+01:00 容器附加 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378(圖像=hello-world,名稱=nifty_morse)
2022-05-31T15:20:00.621070053+01:00 容器啟動 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378(圖像=hello-world,名稱=nifty_morse)
...

每個事件都顯示在自己的行上。 首先顯示事件時間戳,然後是受影響對象的類型(例如imagecontainer ),然後是執行的操作(例如createattachstart )。 消息的其餘部分包含有關對象的有用元數據。 上面的示例顯示hello-world:latest圖像已被拉取,並從中創建了一個容器。

格式化輸出

原始事件列表通常很笨重。 您可以使用接受 Go 模板字符串的--format標誌重新格式化輸出:

 $ docker events --format '{{ .Time }} {{ .Action }} {{ .Type}} {{ .ID }}'

運行此示例將產生如下所示的輸出:

 1654006800 拉圖像 hello-world:latest
1654006800 創建容器 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 附加容器 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 啟動容器 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378

您可以使用{{ json . }} {{ json . }}作為您的模板字符串:

 $ docker events --format '{{ json . }}' | jq
{
  “狀態”:“創建”,
  “id”:“4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378”,
  “來自”:“你好世界”,
  “類型”:“容器”,
  “行動”:“創造”,
  “演員”:{
    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    “屬性”: {
      “圖像”:“你好世界”,
      “名稱”:“nifty_morse”
    }
  },
  “範圍”:“本地”,
  “時間”:1654006800,
  “時間納米”:1654006800347054800
}

這裡原始 JSON 正在通過jq傳遞,因此它可以很好地打印在您的終端中。 這使信息更易於瀏覽。

創建自定義格式字符串時,可以使用 JSON 輸出中的屬性作為受支持佔位符的參考。 在大多數情況下,您需要將每個屬性的第一個字母大寫,例如time to {{ .Time }}

過濾事件

繁忙的 Docker 守護進程的事件日誌很快就會變得嘈雜。 您可以使用--filter標誌將事件縮小到特定的操作、對像或對像類型:

  • docker events --filter type=container – 獲取與容器相關的所有事件。
  • docker events --filter event=create – 獲取容器創建事件。
  • docker events --filter container=demo-container – 獲取為名為demo-container的容器保存的所有事件(您可以引用容器的 ID 或名稱)。

除了container之外,您還可以按所有受支持的對像類型名稱進行過濾,例如imagenetworkvolume

重複--filter標誌時支持多個過濾器。 不同的過濾器被解釋為邏輯條件; 同一過濾器的多次使用成為OR子句。 這是一個為app-containerapi-container容器顯示create事件的示例:

 $碼頭事件\
    --filter 容器=應用程序容器
    --filter 容器=api-容器
    --過濾事件=創建

訪問歷史事件

docker events默認只顯示自命令運行以來存儲的事件。 您可以通過添加--since標誌來包含歷史事件。 這接受人類可讀的時間表達式或絕對時間戳:

 $ docker events --since 1h
$ docker events --since '2021-05-01T16:00:00'

在給定時間之後記錄的事件將立即顯示在您的終端中。 新事件將在記錄時繼續實時顯示。

您可以使用--until標誌在特定時間之後排除事件。 它的工作原理類似於--since 。 使用--until將禁用新事件的實時流,因為它們會超出請求的時間範圍。

從守護進程 REST API 流式處理 Docker 事件

訪問存儲事件的另一種方法是通過 Docker 守護程序 REST API。 在 Docker 主機上啟用 API 後,您可以使用/events端點實時流式傳輸事件。 事件將以 JSON 格式返回:

 $ 捲曲 http://127.0.0.1:2375/v1.41/events
{
  “類型”:“容器”,
  “行動”:“創造”,
  “演員”:{
    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    “屬性”: {
      “圖像”:“你好世界”,
      “名稱”:“nifty_morse”
    }
  },
  “範圍”:“本地”,
  “時間”:1654006800,
  “時間納米”:1654006800347054800
}

API 端點支持與 CLI 對應項具有相同行為的filtersinceuntil參數。 以下是檢索過去一小時內記錄的所有容器創建事件的方法:

 $ curl http://127.0.0.1:2375/v1.41/events?since=1h&filters={'type':'container','action':'create'}

向外部服務發送事件

Docker 缺乏將事件發送到外部服務的內置方式。 如果您希望所有容器創建都記錄在現有的監控或審計平台中,這可能會很有用。

您可以通過創建持續運行docker events的系統服務來設置自己的解決方案。 它應該將每一行新的輸出發送到您的外部系統。

首先編寫一個實現所需功能的 Bash 腳本:

 #!/bin/bash
docker events --format '{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}' | 讀取事件時
做
    捲曲\
        -X 發布\
        -H“內容類型:應用程序/json”\
        -d'{“事件”:“$事件”}'\
        https://example.com/events
完畢

現在在/etc/systemd/system/docker-events.service創建一個新的systemd服務單元:

 [單元]
描述=自定義 Docker 事件監控服務

[服務]
類型=分叉
ExecStart=/usr/local/bin/docker-events.sh

[安裝]
WantedBy=多用戶.target

最後重新加載systemd以加載您的服務,然後啟動並啟用該單元:

 $ sudo systemctl 守護進程重載
$ sudo systemctl 啟動泊塢窗事件
$ sudo systemctl 啟用泊塢窗事件

您的服務現在會將每個新事件流式傳輸到您的監控平台。 啟用該服務會將其配置為在您的主機每次重新啟動時自動啟動。

概括

每當守護程序修改環境中的對象時,都會創建 Docker 事件。 流式傳輸事件日誌可讓您實時監控守護程序活動。 這可以幫助您調試問題、審核更改並確保合規性。

由於事件是直接從 Docker 服務器檢索的,因此如果您將來需要檢索信息,則不應依賴它們。 僅滾動保留 1,000 個條目,您無法通過 Docker 主機的文件系統訪問事件。 該機制最適合您正在尋找與最近活動相關的特定信息的快速臨時任務。 對於長期保留,您應該使用自己的系統服務將事件發送到外部存儲庫。