读取守护进程日志
守护程序日志可以帮助您诊断问题。日志可能保存在几个位置之一,具体取决于操作系统配置和使用的日志子系统:
操作系统 | 地点 |
---|---|
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 事件日志中 |
要dockerd
在 macOS 上查看日志,请打开终端窗口,然后使用tail
带有-f
标志的命令来“跟踪”日志。将打印日志,直到您使用以下命令终止命令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
启用调试
有两种方法可以启用调试。推荐的方法是将
debug
密钥设置在文件true
中daemon.json
。此方法适用于每个 Docker 平台。
编辑该
daemon.json
文件,该文件通常位于/etc/docker/
.如果该文件尚不存在,您可能需要创建它。在 macOS 或 Windows 上,请勿直接编辑文件。相反,请通过 Docker 桌面设置编辑该文件。如果文件为空,请添加以下内容:
{ "debug": true }
如果文件已包含 JSON,则只需添加 key
"debug": true
,如果不是右括号之前的最后一行,请小心在行尾添加逗号。还要验证是否log-level
设置了该键,将其设置为info
或debug
。info
是默认值,可能的值为debug
,info
,warn
,error
,fatal
。向守护进程发送
HUP
信号以使其重新加载其配置。在 Linux 主机上,使用以下命令。$ sudo kill -SIGHUP $(pidof dockerd)
在 Windows 主机上,重新启动 Docker。
您还可以停止 Docker 守护程序并使用 debug 标志手动重新启动它,而不是遵循此过程-D
。但是,这可能会导致 Docker 使用与主机启动脚本创建的环境不同的环境重新启动,这可能会使调试更加困难。
强制记录堆栈跟踪
SIGUSR1
如果守护程序没有响应,您可以通过向守护程序发送信号来强制记录完整的堆栈跟踪。
Linux:
$ sudo kill -SIGUSR1 $(pidof dockerd)
Windows 服务器:
下载 docker-signal。
获取 dockerd 的进程 ID
Get-Process dockerd
。使用标志运行可执行文件
--pid=<PID of daemon>
。
这会强制记录堆栈跟踪,但不会停止守护进程。守护程序日志显示堆栈跟踪或包含堆栈跟踪的文件的路径(如果已记录到文件)。
守护进程在处理SIGUSR1
信号并将堆栈跟踪转储到日志后继续运行。堆栈跟踪可用于确定守护进程中所有 goroutine 和线程的状态。
查看堆栈跟踪
可以使用以下方法之一查看 Docker 守护进程日志:
journalctl -u docker.service
通过在 Linux 系统上运行使用systemctl
/var/log/messages
、/var/log/daemon.log
、 或/var/log/docker.log
在较旧的 Linux 系统上
笔记
无法在 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 提供此信息以帮助诊断问题。