读取守护进程日志

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

Operating systemLocation
LinuxUse the command journalctl -xu docker.service (or read /var/log/syslog or /var/log/messages, depending on your Linux Distribution)
macOS (dockerd logs)~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
macOS (containerd logs)~/Library/Containers/com.docker.docker/Data/log/vm/containerd.log
Windows (WSL2) (dockerd logs)%LOCALAPPDATA%\Docker\log\vm\dockerd.log
Windows (WSL2) (containerd logs)%LOCALAPPDATA%\Docker\log\vm\containerd.log
Windows (Windows containers)Logs are in the Windows Event Log

要在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>运行可执行文件。

这会强制记录堆栈跟踪,但不会停止守护进程。守护进程日志会显示堆栈跟踪或包含堆栈跟踪的文件路径(如果已记录到文件中)。

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

查看堆栈跟踪

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

  • 通过在Linux系统上运行journalctl -u docker.service使用systemctl
  • /var/log/messages, /var/log/daemon.log, 或 /var/log/docker.log 在较旧的 Linux 系统上

注意

在Mac或Windows的Docker Desktop上无法手动生成堆栈跟踪。但是,如果您遇到问题,可以点击Docker任务栏图标并选择故障排除以向Docker发送信息。

在Docker日志中查找类似以下内容的消息:

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

Docker保存这些堆栈跟踪和转储的位置取决于您的操作系统和配置。有时您可以直接从堆栈跟踪和转储中获取有用的诊断信息。否则,您可以向Docker提供此信息以帮助诊断问题。