讀取守護程式日誌

Daemon 記錄檔有助於您診斷問題。根據作業系統配置與所使用的記錄子系統,記錄檔可能儲存在以下幾個位置之一:

作業系統位置
Linux使用指令 journalctl -xu docker.service(或依據您的 Linux 發行版,讀取 /var/log/syslog/var/log/messages
macOS (dockerd 記錄檔)~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
macOS (containerd 記錄檔)~/Library/Containers/com.docker.docker/Data/log/vm/containerd.log
Windows (WSL2) (dockerd 記錄檔)%LOCALAPPDATA%\Docker\log\vm\dockerd.log
Windows (WSL2) (containerd 記錄檔)%LOCALAPPDATA%\Docker\log\vm\containerd.log
Windows (Windows 容器)記錄檔位於 Windows 事件檢視器中

若要檢視 macOS 上的 dockerd 記錄檔,請開啟終端機視窗,並使用帶有 -f 旗標的 tail 指令來「追蹤」記錄檔。記錄內容會持續顯示,直到您使用 CTRL+c 終止指令為止。

$ tail -f ~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
2021-07-28T10:21:21Z dockerd time="2021-07-28T10:21:21.497642089Z" level=debug msg="attach: stdout: begin"
2021-07-28T10:21:21Z dockerd time="2021-07-28T10:21:21.497714291Z" level=debug msg="attach: stderr: begin"
2021-07-28T10:21:21Z dockerd time="2021-07-28T10:21:21.499798390Z" level=debug msg="Calling POST /v1.41/containers/35fc5ec0ffe1ad492d0a4fbf51fd6286a087b89d4dd66367fa3b7aec70b46a40/wait?condition=removed"
2021-07-28T10:21:21Z dockerd time="2021-07-28T10:21:21.518403686Z" level=debug msg="Calling GET /v1.41/containers/35fc5ec0ffe1ad492d0a4fbf51fd6286a087b89d4dd66367fa3b7aec70b46a40/json"
2021-07-28T10:21:21Z dockerd time="2021-07-28T10:21:21.527074928Z" level=debug msg="Calling POST /v1.41/containers/35fc5ec0ffe1ad492d0a4fbf51fd6286a087b89d4dd66367fa3b7aec70b46a40/start"
2021-07-28T10:21:21Z dockerd time="2021-07-28T10:21:21.528203579Z" level=debug msg="container mounted via layerStore: &{/var/lib/docker/overlay2/6e76ffecede030507fcaa576404e141e5f87fc4d7e1760e9ce5b52acb24
...
^C

啟用除錯模式

啟用除錯有兩種方式。建議的方法是在 daemon.json 檔案中將 debug 鍵設為 true。此方法適用於所有 Docker 平台。

  1. 編輯 daemon.json 檔案,它通常位於 /etc/docker/。如果該檔案不存在,您可能需要手動建立。在 macOS 或 Windows 上,請勿直接編輯此檔案,應透過 Docker Desktop 設定進行編輯。

  2. 如果檔案是空的,請加入以下內容

    {
      "debug": true
    }

    如果檔案中已有 JSON 內容,請直接加入 "debug": true 鍵值。請注意,如果這不是最後一行,請確保在行尾加上逗號。同時確認若已設定 log-level 鍵,其值應為 infodebug。預設值為 info,可選值包含 debuginfowarnerrorfatal

  3. 傳送 HUP 訊號給 daemon 以重新載入設定。在 Linux 主機上,請使用以下指令。

    $ sudo kill -SIGHUP $(pidof dockerd)
    

    在 Windows 主機上,請重新啟動 Docker。

除了上述步驟,您也可以停止 Docker daemon 並手動以除錯旗標 -D 重新啟動。但請注意,這可能會導致 Docker 啟動時的環境與主機開機腳本建立的環境不同,進而增加除錯的困難度。

強制記錄堆疊追蹤(Stack trace)

如果 daemon 沒有回應,您可以透過傳送 SIGUSR1 訊號給 daemon,強制記錄完整的堆疊追蹤。

  • Linux:

    $ sudo kill -SIGUSR1 $(pidof dockerd)
    
  • Windows Server:

    下載 docker-signal

    取得 dockerd 的處理程序 ID (PID):Get-Process dockerd

    使用 --pid=<daemon 的 PID> 旗標執行該執行檔。

這會強制記錄堆疊追蹤,但不會停止 daemon。Daemon 記錄檔會顯示堆疊追蹤內容,若已記錄至檔案,則會顯示該檔案的路徑。

Daemon 在處理完 SIGUSR1 訊號並將堆疊追蹤傾印至記錄檔後,會繼續運作。這些堆疊追蹤可用於判斷 daemon 內所有 goroutine 與執行緒的狀態。

檢視堆疊追蹤

Docker daemon 記錄檔可透過以下方法之一檢視:

  • 在執行 systemctl 的 Linux 系統上,執行 journalctl -u docker.service
  • 在較舊的 Linux 系統上,可檢視 /var/log/messages/var/log/daemon.log/var/log/docker.log
注意

在 Docker Desktop for Mac 或 Docker Desktop for Windows 上,無法手動產生堆疊追蹤。然而,若遇到問題,您可以點選 Docker 工作列圖示並選擇 Troubleshoot(疑難排解)來將資訊傳送給 Docker。

請在 Docker 記錄檔中尋找類似以下的訊息

...goroutine stacks written to /var/run/docker/goroutine-stacks-2017-06-02T193336z.log

Docker 儲存這些堆疊追蹤與傾印(dumps)的位置,取決於您的作業系統與配置。有時您可以直接從堆疊追蹤與傾印中取得有用的診斷資訊。否則,您可以將這些資訊提供給 Docker,以協助診斷問題。

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.