Configure and troubleshoot the Docker daemon

预计阅读时间:11分钟

成功安装并启动 Docker 后, dockerd守护程序以其默认配置运行. 本主题介绍如何自定义配置、手动启动守护程序以及在遇到问题时对守护程序进行故障排除和调试.

Start the daemon using operating system utilities

在典型安装中,Docker 守护程序由系统实用程序启动,而不是由用户手动启动. 这使得在机器重新启动时自动启动 Docker 变得更加容易.

启动 Docker 的命令取决于您的操作系统. 检查Install Docker下的正确页面. 要将 Docker 配置为在系统启动时自动启动,请参阅配置 Docker 以在启动时启动.

Start the daemon manually

如果您不想使用系统实用程序来管理 Docker 守护程序,或者只是想测试一下,您可以使用dockerd命令手动运行它. 您可能需要使用sudo ,具体取决于您的操作系统配置.

当您以这种方式启动 Docker 时,它会在前台运行并将其日志直接发送到您的终端.

$ dockerd

INFO[0000] +job init_networkdriver()
INFO[0000] +job serveapi(unix:///var/run/docker.sock)
INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)

要在手动启动 Docker 时停止它,请在终端中发出Ctrl+C .

Configure the Docker daemon

有两种方式来配置 Docker 守护进程:

  • 使用 JSON 配置文件. 这是首选选项,因为它将所有配置保存在一个地方.
  • 启动dockerd时使用标志.

只要您没有在标志和 JSON 文件中指定相同的选项,就可以同时使用这两个选项. 如果发生这种情况,Docker 守护程序将不会启动并打印一条错误消息.

要使用 JSON 文件配置 Docker 守护程序,请在 Linux 系统上的/etc/docker/daemon.json或 Windows 上的C:\ProgramData\docker\config\daemon.json中创建一个文件. 在 MacOS 上,转到任务栏中的鲸鱼 > 首选项 > 守护程序 > 高级.

下面是配置文件的样子:

{
  "debug": true,
  "tls": true,
  "tlscert": "/var/docker/server.pem",
  "tlskey": "/var/docker/serverkey.pem",
  "hosts": ["tcp://192.168.59.3:2376"]
}

使用此配置,Docker 守护程序在调试模式下运行,使用 TLS,并在端口2376上侦听路由到192.168.59.3的流量. 您可以在dockerd 参考文档中了解哪些配置选项可用

您还可以手动启动 Docker 守护程序并使用标志对其进行配置. 这对于解决问题很有用.

下面是一个如何手动启动 Docker 守护进程的示例,使用与上述相同的配置:

$ dockerd --debug \
  --tls=true \
  --tlscert=/var/docker/server.pem \
  --tlskey=/var/docker/serverkey.pem \
  --host tcp://192.168.59.3:2376

您可以在dockerd 参考文档中了解哪些配置选项可用,或者通过运行:

$ dockerd --help

Docker 文档中讨论了许多特定的配置选项. 接下来要去的地方包括:

Docker daemon directory

Docker 守护进程将所有数据保存在一个目录中. 这会跟踪与 Docker 相关的所有内容,包括容器、图像、卷、服务定义和机密.

默认情况下,此目录为:

  • /var/lib/docker在 Linux 上.
  • C:\ProgramData\docker在 Windows 上.

您可以使用data-root配置选项将 Docker 守护程序配置为使用不同的目录.

由于 Docker 守护程序的状态保存在此目录中,因此请确保为每个守护程序使用专用目录. 如果两个守护程序共享同一个目录,例如 NFS 共享,您将遇到难以排除的错误.

Troubleshoot the daemon

您可以在守护程序上启用调试以了解守护程序的运行时活动并帮助进行故障排除. 如果守护进程完全没有响应,您还可以通过向 Docker 守护进程发送SIGUSR信号来强制将所有线程的完整堆栈跟踪添加到守护进程日志中.

Troubleshoot conflicts between the daemon.json and startup scripts

如果您使用daemon.json文件并手动或使用启动脚本将选项传递给dockerd命令,并且这些选项冲突,则 Docker 无法启动并出现以下错误:

unable to configure the Docker daemon with file /etc/docker/daemon.json:
the following directives are specified both as a flag and in the configuration
file: hosts: (from flag: [unix:///var/run/docker.sock], from file: [tcp://127.0.0.1:2376])

如果您看到与此类似的错误并且您正在使用标志手动启动守护程序,您可能需要调整您的标志或daemon.json以消除冲突.

注意:如果您看到此特定错误,请继续下一部分以获取解决方法.

如果您使用操作系统的初始化脚本启动 Docker,您可能需要以特定于操作系统的方式覆盖这些脚本中的默认值.

Use the hosts key in daemon.json with systemd

难以解决的配置冲突的一个显着示例是当您想要指定与默认值不同的守护程序地址时. Docker 默认监听一个套接字. 在使用systemd的 Debian 和 Ubuntu 系统上,这意味着在启动dockerd时始终使用主机标志-H . 如果您在daemon.json中指定hosts条目,这会导致配置冲突(如上述消息中所示)并且 Docker 无法启动.

要解决此问题,请使用以下内容创建一个新文件/etc/systemd/system/docker.service.d/docker.conf ,以删除默认启动守护程序时使用的-H参数.

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

有时您可能需要使用 Docker 配置systemd ,例如配置 HTTP 或 HTTPS 代理.

注意:如果您覆盖此选项,然后在手动启动 Docker 时未在daemon.json中指定hosts条目或-H标志,则 Docker 无法启动.

在尝试启动 Docker 之前运行sudo systemctl daemon-reload . 如果 Docker 成功启动,它现在正在侦听daemon.jsonhosts键中指定的 IP 地址,而不是套接字.

重要提示:Docker Desktop for Windows 或 Docker Desktop for Mac 不支持在daemon.json中设置hosts .

Out Of Memory Exceptions (OOME)

如果您的容器尝试使用比系统可用内存更多的内存,您可能会遇到内存不足异常 (OOME),并且容器或 Docker 守护程序可能会被内核 OOM 杀手杀死. 为防止这种情况发生,请确保您的应用程序在具有足够内存的主机上运行,​​并参阅了解内存不足的风险.

Read the logs

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

操作系统 Location
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日志) AppData\Roaming\Docker\log\vm\dockerd.log
Windows (WSL2)( containerd日志) AppData\Roaming\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

Enable debugging

有两种方法可以启用调试. 推荐的方法是在daemon.json文件中将debug键设置为true . 此方法适用于每个 Docker 平台.

  1. 编辑daemon.json文件,该文件通常位于/etc/docker/中. 如果此文件尚不存在,您可能需要创建它. 在 macOS 或 Windows 上,请勿直接编辑文件. 相反,请转到Preferences / Daemon / Advanced .

  2. 如果文件为空,请添加以下内容:

    {
      "debug": true
    }
    

    如果文件已经包含 JSON,只需添加键"debug": true ,如果它不是右括号之前的最后一行,请注意在行尾添加逗号. 还要验证是否设置了log-level键,它设置为infodebug . info是默认值,可能的值为debuginfowarnerrorfatal .

  3. 向守护程序发送HUP信号以使其重新加载其配置. 在 Linux 主机上,使用以下命令.

    $ sudo kill -SIGHUP $(pidof dockerd)
    

    在 Windows 主机上,重新启动 Docker.

除了遵循此过程之外,您还可以停止 Docker 守护程序并使用调试标志-D手动重新启动它. 但是,这可能会导致 Docker 使用与主机启动脚本创建的环境不同的环境重新启动,这可能会使调试更加困难.

Force a stack trace to be logged

如果守护程序没有响应,您可以通过向守护程序发送SIGUSR1信号来强制记录完整的堆栈跟踪.

  • Linux:

    $ sudo kill -SIGUSR1 $(pidof dockerd)
    
  • 视窗服务器:

    Download docker-signal.

    获取 dockerd 的进程 ID Get-Process dockerd .

    使用标志--pid=<PID of daemon>运行可执行文件.

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

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

View stack traces

The Docker daemon log can be viewed by using one of the following methods:

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

Note

无法在 Docker Desktop for Mac 或 Docker Desktop for Windows 上手动生成堆栈跟踪. 但是,如果遇到问题,您可以单击 Docker 任务栏图标并选择疑难解答以向 Docker 发送信息.

在 Docker 日志中查看如下消息:

...goroutine stacks written to /var/run/docker/goroutine-stacks-2017-06-02T193336z.log
...daemon datastructure dump written to /var/run/docker/daemon-data-2017-06-02T193336z.log

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

Check whether Docker is running

检查 Docker 是否正在运行的独立于操作系统的方法是使用docker info命令询问 Docker.

您还可以使用操作系统实用程序,例如sudo systemctl is-active dockersudo status dockersudo service docker status ,或使用 Windows 实用程序检查服务状态.

最后,您可以使用pstop等命令检查dockerd进程的进程列表.

docker, daemon, configuration, troubleshooting

by  icopy.site