如何检查Docker引擎和Docker容器是否正在运行?

216
在脚本中,我需要检查:
a)Docker 引擎是否正在运行?
b)给定容器名称,该 Docker 容器是否正在运行?

5
任何 Docker 命令(除了 docker -v),比如 docker ps。 - Glen Pierce
5
或者尝试运行 docker ps 命令。 - Mattia Dinosaur
3
sudo systemctl status docker - Duk
3
这条命令只会显示正在运行的容器。 - Suhaib
docker ps -a 将显示所有容器的状态。希望能有所帮助。 - Hemant Kumar
显示剩余2条评论
20个回答

212
如果您正在寻找特定的容器,可以运行以下命令:
if [ "$( docker container inspect -f '{{.State.Running}}' $container_name )" = "true" ]; then ...

为了避免在容器处于崩溃循环并不断重启的情况下显示其已运行,可以通过检查Status字段来改进上述问题:
if [ "$( docker container inspect -f '{{.State.Status}}' $container_name )" = "running" ]; then ...

如果您想知道 dockerd 是否正在本地机器上运行,并且已经安装了 systemd,则可以运行以下命令:
systemctl show --property ActiveState docker

您也可以使用docker infodocker version连接到Docker,如果守护程序不可用,它们将报错。

21
如果 [ $(docker inspect -f '{{.State.Running}}' $container_name) = "true" ]; 那么就打印“yup”,否则打印“nope”。 - BMitch
2
我使用 docker inspect -f '{{.State.Restarting}}' $container_name 命令来启动我的容器,并设置了重启策略,但是这里要避免的是 "true"。 - stav meir
7
当容器没有运行时,无论是bash还是docker,都会对上述“if”语句进行投诉。这将隐藏假情况下的不必要的输出:“如果[ "$(docker inspect -f '{{.State.Running}}' ${container_name} 2>/dev/null)" = "true" ],则echo yup; else echo nope; fi”。 - Trevor
1
systemctl : The term 'systemctl' is not recognized as the name of a cmdlet, function, script file, or operable program - Marco Lackovic
2
@MarcoLackovic 听起来你错过了上面提到的“你已经安装了systemd”的部分。 - BMitch
显示剩余4条评论

136
我最终使用了。
docker info

使用Bash脚本检查Docker引擎是否正在运行。

编辑:可以使用以下方式使您的脚本在Docker未运行时失败:

#!/usr/bin/env bash
if ! docker info > /dev/null 2>&1; then
  echo "This script uses docker, and it isn't running - please start docker and try again!"
  exit 1
fi

15
这个回答被低估了。它是跨平台的,并且可以快速通过/失败。 - Andy Fleming
7
如果您不需要输出结果,可以将命令docker info > /dev/null 2>&1用于此。 - buggymcbugfix

35

列出所有容器:

docker container ls -a

ls = 列表
-a = 所有

检查"状态"一栏


1
这正是我所需要的,因为它可以在所有平台上运行!! - Rolljee
简单易懂...成功了。 - RMati

32

您可以使用以下命令检查Docker状态:systemctl is-active docker

➜  ~  systemctl is-active docker
active
你可以这样使用它:
➜  ~  if [ "$(systemctl is-active docker)" = "active" ]; then echo "is alive :)" ; fi
is alive :)

➜  ~  sudo systemctl stop docker

➜  ~  if [ "$(systemctl is-active docker)" = "active" ]; then echo "is alive :)" ; fi
 * empty response *

这并没有回答问题。"检查容器名称" - jens.klose
是的,看起来这个问题有歧义。要检查容器是否正在运行,您应该使用 docker ps --filter name=pattern 命令,然后可以使用 --format {{.Status}} 标志格式化输出以仅检查状态。 - Hernan Garcia
1
这将告诉您systemctl是否认为docker正在运行,但它实际上不会检查docker是否真的在运行。因此,我认为上面的docker info命令是更好的选择。 - James Stevens

26

对于OS X用户(Mojave 10.14.3)

这是我在Bash脚本中使用的代码,用于测试Docker是否正在运行

# Check if docker is running
if ! docker info >/dev/null 2>&1; then
    echo "Docker does not seem to be running, run it first and retry"
    exit 1
fi

1
我重构了这个代码,以消除if [[ $? -ne 0 ]]反模式。 - tripleee

15

有时您不知道完整的容器名称,在这种情况下,以下是适用于我的方法:

if docker ps | grep -q keyword
then 
    echo "Running!"
else
    echo "Not running!"
    exit 1
fi
我们列出所有正在运行的容器进程(docker ps -a会显示我们不需要的未运行的容器),我们搜索特定的单词(grep 部分),如果我们没有找到至少一个包含关键字的正在运行的容器名称,则简单地失败。

重构以消除大量的Shell编程反模式集合。 - tripleee

15

除了docker -v命令,任何Docker命令(如docker ps)都会得到一些有效响应,如果Docker正在运行,则会得到一些有效响应,否则您将收到一个消息,其中包含“你的Docker守护进程是否在运行?”

您还可以检查您的任务管理器。


有趣的是,docker -v 不会检查 Docker 是否正在运行,但 docker version 会!哈哈 - James Stevens

13

容器状态:真/假

# docker inspect --format '{{json .State.Running}}' container-name
true
#

3
好的,我会尽我所能来进行翻译。接下来是需要翻译的内容,请提供原文,并告知需要翻译成何种语言。 - Nico Haase
对于其他遵循此过程的人,如果您正在寻找容器的健康检查,这很好。如果它正在工作,它将返回true。 - Craig
2
这似乎不再起作用了。 "State" 不是返回的 JSON 中的键之一。也没有看到任何关于运行或健康的信息。但它已经启动,并且我正在收到一个 JSON 响应。 - Joe Flack
无故障运行 - Omar Omeiri

9

您可以使用以下命令systemctl status docker来检查docker的状态。 如果要启动,可以使用systemctl start docker命令。除了systemctl命令外,您还可以尝试使用service, service docker status以及service docker start


5
假设最终用户正在使用systemd作为他们的init系统。 - Rafael
systemctl status docker 正确显示 Docker 服务是否正在运行。谢谢。 - Mr. Unnormalized Posterior

9

docker ps -a

该命令可查看所有Docker容器的状态,无论其是否正在运行。


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