阅读守护程序日志

守护程序日志可以帮助您诊断问题。日志可能会保存在几个位置,具体取决于操作系统配置和使用的日志记录子系统

操作系统位置
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. 向守护程序发送 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 of daemon> 运行可执行文件。

这会强制记录堆栈跟踪,但不会停止守护程序。守护程序日志显示堆栈跟踪或如果将其记录到文件,则显示包含堆栈跟踪的文件的路径。

守护程序在处理 SIGUSR1 信号并将堆栈跟踪转储到日志后继续运行。堆栈跟踪可用于确定守护程序中所有 goroutine 和线程的状态。

查看堆栈跟踪

可以通过以下方法之一查看 Docker 守护程序日志

  • 在使用 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,以帮助诊断问题。