如何检查 docker daemon 是不是正在运行?

Posted

技术标签:

【中文标题】如何检查 docker daemon 是不是正在运行?【英文标题】:How to check if docker daemon is running?如何检查 docker daemon 是否正在运行? 【发布时间】:2017-10-14 04:47:57 【问题描述】:

我正在尝试创建一个 bash 实用程序脚本来检查 docker 守护程序是否在我的服务器中运行。 除了运行这样的代码之外,还有更好的方法来检查 docker 守护进程是否在我的服务器中运行?

ps -ef | grep docker
root      1250     1  0 13:28 ?        00:00:04 /usr/bin/dockerd --selinux-enabled
root      1598  1250  0 13:28 ?        00:00:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime docker-runc
root     10997 10916  0 19:47 pts/0    00:00:00 grep --color=auto docker

我想创建一个 bash shell 脚本来检查我的 docker 守护进程是否正在运行。如果它正在运行,则什么也不做,如果没有,则启动 docker 守护进程。

我的伪代码是这样的。我正在考虑解析我的 ps -ef 的输出,但我只是想知道是否有更有效的方法来处理我的伪代码。

如果(docker 没有运行)

          run docker

结束

附: 我不是 linux 专家,我只需要在自己的环境中执行此实用程序。

【问题讨论】:

【参考方案1】:

我编写了一个小脚本 (Mac Osx),通过检查 docker stats 的退出代码来确保 Docker 正在运行。

#!/bin/bash
#Open Docker, only if is not running
if (! docker stats --no-stream ); then
  # On Mac OS this would be the terminal command to launch Docker
  open /Applications/Docker.app
 #Wait until Docker daemon is running and has completed initialisation
while (! docker stats --no-stream ); do
  # Docker takes a few seconds to initialize
  echo "Waiting for Docker to launch..."
  sleep 1
done
fi

#Start the Container..

【讨论】:

这太棒了 不错!我们可以使用(! docker stats --no-stream &> /dev/null) 在等待时将错误消息静音。【参考方案2】:

这适用于我在 Ubuntu 上

$ systemctl status docker

【讨论】:

【参考方案3】:

在几乎所有 Linux 系统上都有一个名为 pgrep 的实用程序。

你可以这样做:

pgrep -f docker > /dev/null || echo "starting docker"

用您的 docker 启动命令替换 echo 命令。

【讨论】:

我知道这个问题并不要求这个,但在 mac pgrep 总是找到一个进程,因为当 docker 没有运行时com.docker.vmne 仍然存在 对于@ScottAnderson 的观点,如果 MacOS 上的“Docker Desktop”没有运行,pgrep -f docker 将返回一个具有低(例如 3 位)pid 的值。在 MacOS 上运行“Docker Desktop”时,相同的命令将返回更高(5 位)pid 的列表。因此,对于特定于 MacOS 的用例,我认为 pgrep -f Docker.app 是您想要的。【参考方案4】:

如果安装了 git bash,以下内容适用于 macOS 和 Windows。在 macOS 上,open /Applications/Docker.app 将启动 docker 守护进程。但是在 Windows 上还没有看到类似的东西。

## check docker is running at all
## based on https://***.com/questions/22009364/is-there-a-try-catch-command-in-bash

  ## will throw an error if the docker daemon is not running and jump
  ## to the next code chunk     
  docker ps -q
 || 
  echo "Docker is not running. Please start docker on your computer"
  echo "When docker has finished starting up press [ENTER to continue"
  read

【讨论】:

天啊,我也发现了你对这个要点的评论!我真的很喜欢这个解决方案! gist.github.com/peterver/…【参考方案5】:

您也可以只检查/var/run/docker.pid 的存在。

【讨论】:

我认为这应该是 macOS 的/var/run/docker.sock 即使 docker 没有运行,这个符号链接似乎也存在:/【参考方案6】:

你可以简单地:

docker version > /dev/null 2>&1

该命令的退出代码将存储到$?,因此您可以检查它是否为0,然后docker正在运行。

docker versionexit 1 如果守护程序没有运行。如果遇到其他问题,比如 docker 根本没有安装,退出代码会有所不同。

但归根结底,如果安装了 docker 并且守护程序正在运行,则退出代码将为 0。

2>&1stderr 重定向到stdout> /dev/nullstdout 重定向到/dev/null 实际上使输出静音,无论执行结果如何。

【讨论】:

【参考方案7】:
if curl -s --unix-socket /var/run/docker.sock http/_ping 2>&1 >/dev/null
then
  echo "Running"
else
  echo "Not running"
fi

参考:Docker api v1.28

【讨论】:

【参考方案8】:

一个函数可能是这样的:

isRunning 
    `ps -ef | grep "[d]ocker" | awk 'print $2'`

我创建了一个脚本来启动、停止、重启一个 mongodb-server。 您只需要更改脚本中的一些路径,我也为您工作: Script

【讨论】:

ps -C docker -opid=【参考方案9】:

我确定你想启动 docker 守护进程,所以这里是在执行 Docker 运行语句之前启动它的代码:

sudo systemctl start docker

【讨论】:

以上是关于如何检查 docker daemon 是不是正在运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 docker 引擎和 docker 容器是不是正在运行?

如何让docker以daemon方式运行/bin/bash

无法连接到 unix:///var/run/docker.sock 上的 Docker 守护程序。 docker 守护进程是不是正在运行?带有自托管运行器的 Gitlab Cloud CI/CD 错误

Error response from daemon ... no space left on device docker启动容器服务报错

Ansible自动化运维实战在docker环境部署ansible管理平台awx

Docker pull拉取镜像报错“Error response from daemon: Get “https://registry-1.docker.io/v2”解决办法