讀取守護程式日誌
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 平台。
編輯
daemon.json檔案,它通常位於/etc/docker/。如果該檔案不存在,您可能需要手動建立。在 macOS 或 Windows 上,請勿直接編輯此檔案,應透過 Docker Desktop 設定進行編輯。如果檔案是空的,請加入以下內容
{ "debug": true }如果檔案中已有 JSON 內容,請直接加入
"debug": true鍵值。請注意,如果這不是最後一行,請確保在行尾加上逗號。同時確認若已設定log-level鍵,其值應為info或debug。預設值為info,可選值包含debug、info、warn、error、fatal。傳送
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.logDocker 儲存這些堆疊追蹤與傾印(dumps)的位置,取決於您的作業系統與配置。有時您可以直接從堆疊追蹤與傾印中取得有用的診斷資訊。否則,您可以將這些資訊提供給 Docker,以協助診斷問題。