Docker 使用基于守护进程的架构,其中 CLI 连接到在您的机器或远程主机上单独运行的长期运行的进程。CLI 命令将不起作用,如果守护程序停止,您的容器通常会脱机。
以下是如何检查 Docker 的守护进程是否已启动,以便您诊断容器和docker命令的问题。docker当守护进程未运行时,每次使用CLI时都会看到“无法连接到 Docker 守护进程”消息。
使用 Systemctl 检查
您可以在使用 Systemd进行服务管理systemctl的发行版上检查 Docker 的状态。这涵盖了大多数流行的操作系统,包括 Debian、Ubuntu、CentOS 和 Red Hat。
sudo systemctl status docker
检查“活动”下显示的内容。如果您看到active (running)绿色,则 Docker 守护程序正在运行,并且您的容器应该已启动。
活动状态inactive表示服务已停止。尝试通过运行来启动它sudo systemctl start docker。active (running)守护程序启动后状态应更改为。
如果您看到状态为failed红色,则守护程序由于错误而无法启动。您应该查看稍后在systemctl命令输出中显示的服务启动日志,因为这些日志通常包含让您找出问题所在的提示。
如果没有明显的可用解决方案,请在调试模式下手动启动守护程序以获取有关其启动例程的更多信息。
sudo dockerd --debug
重新启动主机或重新启动 Docker 服务systemctl restart docker也可以帮助缓解暂时性问题。
检查过程细节
检查正在运行的 Docker 守护程序的另一种方法是检查其进程 ID 文件。/var/run/docker.pid守护程序在每次启动时都会将其进程 ID 写入。当此文件存在时,Docker 应该正在运行并准备好进行 CLI 连接。
cat /var/run/docker.pid
您可以使用此技术创建检查守护程序是否处于活动状态的编程脚本。阅读该文件会为您提供 ID,您可以使用它来获取有关 Docker 进程的更多信息等工具:top
cat /var/run/docker.pid
# process id = 1000
top -p 1000
您还可以使用pidof命令获取进程 ID。这接受一个进程名称并返回第一个匹配的 ID:
pidof dockerd
# process id = 1000
# view information with top
top -p `pidof dockerd`
top如果与进程匹配,则您的机器上有一个活动的 Docker 守护dockerd程序。这可能比寻找更可靠docker.pid——如果守护进程崩溃,docker.pid可能会在进程消失后被遗忘。
处理卡住的进程文件
当存在 PID 文件时,守护程序将拒绝重新启动。如果文件实际上是上次运行的孤立文件,这可能会让您陷入重新启动循环。运行时您会看到此消息dockerd:
failed to start daemon: pid file found, ensure docker is not running or delete /var/run/docker.pid
用于pidof dockerd确保 Docker 实际停止。如果命令没有输出,则继续,确认没有正在运行的进程。
运行sudo rm /var/run/docker.pid以删除旧的进程 ID 文件。守护程序现在应该会在您下次运行时成功启动dockerd或service docker start.
当您对虚拟机进行快照然后从映像创建新实例时,通常会遇到 PID 文件问题。进程文件将包含在快照中,导致新 VM 中的 Docker 守护程序认为它已经在运行。
检查单个容器
通过docker ps命令访问各个容器的状态。这会发出一个表,其中包含所有当前正在运行的容器的详细信息。
docker ps
将docker ps命令与grep以轻松检查特定容器是否按 ID 或名称运行:
docker ps | grep my-container-name
现在将过滤输出以显示您选择的容器。如果容器未运行,则不会有任何记录。
停止的容器使用 显示docker ps -a。可以使用以下docker start命令启动已停止的容器:
docker start my-container
然后容器将进入常规docker ps输出。您可以使用 再次停止它docker stop my-container。
结论
当您想知道 Docker 是否正在运行时,您需要考虑几个选项。有您的操作系统的服务管理器、docker.pid文件和常规进程检查工具,例如top和pidof.
当涉及到单个容器时,docker ps提供当前在您的主机上运行的所有内容的列表。可以收集有关任何容器状态的更全面信息,docker inspect container-name这些信息以 JSON 格式提供网络配置、卷和标签的详细信息。