Docker 守护进程故障排除

本页介绍了在遇到问题时如何对守护程序进行故障排除和调试。

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

解决 daemon.json 和启动脚本之间的冲突

如果您使用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消除冲突。

笔记

如果您看到此特定错误,请继续阅读 下一部分 以获取解决方法。

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

将 daemon.json 中的主机密钥与 systemd 一起使用

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

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

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

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

笔记

如果在手动启动 Docker 时覆盖此选项而不hostsdaemon.json-H标志中指定条目,则 Docker 将无法启动。

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

重要的

Docker Desktop for Windows 或 Docker Desktop for Mac 不支持hosts中的设置。daemon.json

内存不足问题

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

检查Docker是否正在运行

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

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

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