如何检查Docker守护进程是否正在运行?

51

我正在尝试创建一个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 专家,只需要在自己的环境中完成这个实用程序。

end

10个回答

61

我写了一个小脚本(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..

2
这太棒了。 - Obed Parlapiano
6
好的!我们可以使用 (! docker stats --no-stream &> /dev/null) 来让它等待时消除错误信息。 - Maximilian
当我这样做时,错误没有被消除 @Maximilian - jackdewinter

30

这对于我在Ubuntu上工作有效

$ systemctl status docker

输入图片说明


这在 Redhat 8 上也可以工作。 - Yeasin Ar Rahman

21
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


1
这应该得到更多的赞。 - D3strukt0r
我想知道如何使用wget做同样的事情? - Enissay
@Enissay wget 不太适合这种情况,更不用说它不像 curl 一样是操作系统(如 MacOS)默认安装的工具,而 curl 则可以直接使用,无需额外步骤。 - Gongora

19

几乎所有的Linux系统都配备了一个名为pgrep的实用工具。

你可以直接执行以下命令:

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

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


7
我知道这个问题并没有提及,但在 Mac 上使用 pgrep 命令时,它会总是找到一个名为 com.docker.vmne 的进程,即使 Docker 没有在运行。请注意,这并非本题所问。 - Scott Anderson
6
针对 @ScottAnderson 的观点,如果 MacOS 上的 Docker Desktop 没有运行,“pgrep -f docker” 将返回一个低 pid(例如 3 位数)的单一值。当 MacOS 上的 Docker Desktop 正在运行时,相同的命令将返回一组更高的 pid(5 位数)。因此,对于特定于 MacOS 的情况,我认为您需要使用 pgrep -f Docker.app - bcdady

8
您可以简单地执行以下操作:
docker version > /dev/null 2>&1

那个命令的退出码将会被存储在$?中,这样你就可以检查是否为0,如果是,则docker正在运行。
如果守护程序未运行,docker version将会退出1。如果遇到其他问题,例如根本未安装docker,则退出码会有所不同。
但归根结底,如果已安装docker且守护程序正在运行,则退出码将为0。 2>&1将把stderr重定向到stdout,而> /dev/null将把stdout重定向到/dev/null,无论执行结果如何,都会实际上使输出静音。

2
不错!简短而精炼。我喜欢在脚本中使用这种快速失败的健全性检查:如果 ! docker version > /dev/null 2>&1; then echo "Docker 没有运行。"; exit 1; fi - jgreve

6
以下内容适用于macOS系统,如果已安装git bash,则也适用于Windows系统。在macOS上,输入open /Applications/Docker.app即可启动docker守护进程。但是,我没有在Windows系统上看到类似的命令。
## check docker is running at all
## based on https://dev59.com/cmEh5IYBdhLWcg3wyGHy
{
  ## 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
}

哇,我也在这个代码片段的评论中找到了你的留言!我真的很喜欢这个解决方案!https://gist.github.com/peterver/ca2d60abc015d334e1054302265b27d9#gistcomment-2642238 - Andrew

5

您也可以检查是否存在/var/run/docker.pid文件。


我认为在 macOS 上应该是 /var/run/docker.sock - Andrew
2
这个符号链接似乎存在,即使docker没有运行:/ - Andrew

4

在跟随@madsonic之后,我尝试了以下方法:

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

-1

我相信你想要启动Docker守护进程,这里是在执行Docker运行语句之前启动它的代码:

sudo systemctl start docker

-1
一个函数可能看起来像这样:
isRunning {
    `ps -ef | grep "[d]ocker" | awk {'print $2'}`
}

我创建了一个脚本来启动、停止、重启mongodb服务器。 你只需要在脚本中更改一些路径,它也可以为你工作: 脚本

2
ps -C docker -opid= - Roman Kiselenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接