读取守护程序日志
守护程序日志可以帮助你诊断问题。根据操作系统配置和使用的日志子系统,日志可能保存在以下几个位置之一:
| 操作系统 | 位置 |
|---|---|
| Linux | 使用命令 journalctl -xu docker.service(或读取 /var/log/syslog 或 /var/log/messages,具体取决于你的 Linux 发行版) |
| macOS (Docker Desktop) | ~/Library/Containers/com.docker.docker/Data/log/vm/init.log |
| Windows (WSL2) | %LOCALAPPDATA%\Docker\log\vm\init.log |
| Windows (Windows 容器) | 日志位于 Windows 事件日志中 |
在 macOS 和 Windows (WSL2) 上,Docker Desktop 将守护程序日志(dockerd、containerd 以及其他 VM 服务)写入单个采用 JSON 格式的多路复用 init.log 文件。每一行都包含一个标识该服务的 "component" 字段。要跟踪日志,请打开终端并使用带有 -f 标志的 tail 命令。日志会一直打印,直到你使用 CTRL+c 终止命令:
$ tail -f ~/Library/Containers/com.docker.docker/Data/log/vm/init.log
{"component":"dockerd","level":"debug","msg":"attach: stdout: begin","time":"2021-07-28T10:21:21.497642089Z"}
{"component":"dockerd","level":"debug","msg":"attach: stderr: begin","time":"2021-07-28T10:21:21.497714291Z"}
...
^C
要仅筛选 dockerd 的输出:
$ grep '"component":"dockerd"' ~/Library/Containers/com.docker.docker/Data/log/vm/init.log
启用调试
有两种方法可以启用调试。推荐的方法是在 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信号以使其重新加载配置。在 Linux 主机上,使用以下命令。$ sudo kill -SIGHUP $(pidof dockerd)在 Windows 主机上,重启 Docker。
除了遵循此过程之外,你也可以停止 Docker 守护程序并使用调试标志 -D 手动重启它。但是,这可能导致 Docker 以不同于主机启动脚本创建的环境重启,这可能会使调试更加困难。
强制记录堆栈跟踪
如果守护程序无响应,你可以通过向守护程序发送 SIGUSR1 信号来强制记录完整的堆栈跟踪。
-
Linux:
$ sudo kill -SIGUSR1 $(pidof dockerd) -
Windows Server:
下载 docker-signal。
获取 dockerd 的进程 ID:
Get-Process dockerd。使用标志
--pid=<守护程序的 PID>运行可执行文件。
这会强制记录堆栈跟踪,但不会停止守护程序。守护程序日志会显示堆栈跟踪,或者如果堆栈跟踪已记录到文件,则显示包含堆栈跟踪的文件的路径。
守护程序在处理 SIGUSR1 信号并将堆栈跟踪转储到日志后会继续运行。堆栈跟踪可用于确定守护程序内所有 goroutine 和线程的状态。
查看堆栈跟踪
可以通过以下方法之一查看 Docker 守护程序日志:
- 在使用
systemctl的 Linux 系统上运行journalctl -u docker.service - 在较旧的 Linux 系统上查看
/var/log/messages、/var/log/daemon.log或/var/log/docker.log
Note无法在 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 保存这些堆栈跟踪和转储的位置取决于你的操作系统和配置。有时你可以直接从堆栈跟踪和转储中获取有用的诊断信息。否则,你可以将此信息提供给 Docker 以帮助诊断问题。