讀取守護行程日誌

Daemon 記錄檔可以幫助您診斷問題。根據作業系統設定和使用的記錄子系統,記錄檔可能會儲存在幾個不同的位置。

作業系統位置
Linux使用指令 journalctl -xu docker.service(或讀取 /var/log/syslog/var/log/messages,取決於您的 Linux 發行版本)
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 鍵,則將其設定為 infodebuginfo 是預設值,可能的值為 debuginfowarnerrorfatal

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

    $ sudo kill -SIGHUP $(pidof dockerd)
    

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

除了遵循此程序之外,您也可以停止 Docker Daemon 並使用除錯旗標 -D 手動重新啟動它。但是,這可能會導致 Docker 在與主機啟動指令碼建立的環境不同的環境中重新啟動,這可能會使除錯更加困難。

強制記錄堆疊追蹤

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

  • Linux:

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

    下載 docker-signal

    取得 dockerd 的處理序 ID: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 工作列圖示並選擇**疑難排解**將資訊傳送給 Docker。

在 Docker 記錄檔中尋找如下訊息

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

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