如何检查船坞发动机和船坞容器是否正在运行?

在一个脚本中,我需要检查:

A)码头发动机是否运转正常?
B)给定一个集装箱名称,该码头集装箱是否正在运行?

[这个问题最初的措辞是模棱两可的,一些人将其解释为“ check docker engine”,而另一些人则将其解释为“ check docker Container”]

390834 次浏览

任何 docker 命令(除了 docker -v) ,如 docker ps 如果 Docker 正在运行,您将得到一些有效的响应,否则将得到一条消息,其中包括“您的 Docker 守护进程是否已启动并运行?”

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

如果您正在寻找一个特定的容器,您可以运行:

if [ "$( docker container inspect -f '\{\{.State.Running}}' $container_name )" == "true" ]; then ...

为了避免处于崩溃循环中的容器出现问题,并且不断重新启动以显示它已经启动,可以通过检查 Status字段来改进以上内容:

if [ "$( docker container inspect -f '\{\{.State.Status}}' $container_name )" == "running" ]; then ...

如果您想知道 docker 是否正在本地计算机上运行,并且您已经安装了 systemd,那么可以运行:

systemctl show --property ActiveState docker

您还可以使用 docker infodocker version连接到 docker,如果守护进程不可用,它们将出错。

您可以使用 systemctl is-active docker检查 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 *

列出所有容器:

docker container ls -a

ls = list
-a = 所有

检查“状态”一栏

在 Mac 电脑上,你可能会看到这样的图像:

enter image description here

如果你右键点击 docker 图标,你会看到:

enter image description here

或者:

docker ps

还有

docker run hello-world

您可以使用这个命令 systemctl status docker检查,它将显示码头的状态。如果你想开始你可以使用 systemctl start docker而不是 systemctl你也可以尝试与 serviceservice docker statusservice docker start分别。

您还可以使用以下命令检查某个特定的 Docker 容器是否正在运行:

docker inspect postgres | grep "Running"

这个命令将检查例如我的 postgres 容器是否正在运行,并将输出作为 “奔跑”: 没错返回

希望这个能帮上忙。

我最后吸毒了

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

适用于 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

如果基本目标是“当 Docker 启动时,我如何启动容器?”

我们可以用 Docker 的 重新启动政策

向现有容器添加重新启动策略:

Docker: 向已创建的容器添加重启策略

例如:

docker update --restart=always <container>

跑步:

docker version

如果码头 正在逃跑你会看到:

Client: Docker Engine - Community
Version:           ...
[omitted]


Server: Docker Engine - Community
Engine:
Version:          ...
[omitted]

如果码头 不是逃跑你会看到:

Client: Docker Engine - Community
Version:           ...
[omitted]


Error response from daemon: Bad response from Docker engine

有时你不知道完整的容器名称,在这种情况下,这是什么工作为我:

if docker ps | grep -q keyword
then
echo "Running!"
else
echo "Not running!"
exit 1
fi

我们列出所有正在运行的容器进程(docker ps -a会显示我们也没有在运行的进程,但这不是我需要的) ,我们搜索一个特定的单词(grep部分) ,如果我们没有找到至少一个名称包含我们的关键字的运行的容器,那么就会失败。

如何检入 SSH 运行:

systemctl

如果响应: 未能获得 D 总线连接: 操作不允许

它是一个 docker 或 WSL 容器。

docker ps -a

你可以看到所有的码头集装箱,无论它是活的还是死的。

在终端运行这个命令:

docker ps

如果 Docker 没有运行,您将收到以下信息:

来自 daemon 的错误响应: 拨打 unix docker.raw.sock: connect: connect 拒绝

关于你的第一个问题的答案请参考这个答案 -https://stackoverflow.com/a/65447848/4691279

对于您的第二个问题-您可以使用像 docker ps --filter "name=<<<YOUR_CONTAINER_NAME>>>"这样的命令来检查某个特定容器是否正在运行。

  • 如果 Docker 和 Container 都在运行,那么您将得到如下输出:

    $ docker ps --filter "name=nostalgic_stallman"
    
    
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    9b6247364a03        busybox             "top"               2 minutes ago       Up 2 minutes                            nostalgic_stallman
    
  • 如果 Docker 没有运行,那么您将收到一条错误消息,指出 Docker 守护进程没有运行。

  • 如果 Docker 运行但 Container 没有运行,那么您将无法在此命令的输出中获得容器名称。

容器状态: true/false

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

我有一个更加充实的例子,可以在 Gitea 容器的上下文中使用上面的一些工作,但是它可以很容易地根据名称转换为另一个容器。另外,您可以使用 docker ps --filter功能在较新的系统或者没有 docker 的系统中设置 $GITEA _ CONTAINER。

# Set to name or ID of the container to be watched.
GITEA_CONTAINER=$(./bin/docker-compose ps |grep git|cut -f1 -d' ')


# Set timeout to the number of seconds you are willing to wait.
timeout=500; counter=0
# This first echo is important for keeping the output clean and not overwriting the previous line of output.
echo "Waiting for $GITEA_CONTAINER to be ready (${counter}/${timeout})"
#This says that until docker inspect reports the container is in a running state, keep looping.
until [[ $(docker inspect --format '\{\{json .State.Running}}' $GITEA_CONTAINER) == true ]]; do


# If we've reached the timeout period, report that and exit to prevent running an infinite loop.
if [[ $timeout -lt $counter ]]; then
echo "ERROR: Timed out waiting for $GITEA_CONTAINER to come up."
exit 1
fi


# Every 5 seconds update the status
if (( $counter % 5 == 0 )); then
echo -e "\e[1A\e[KWaiting for $GITEA_CONTAINER to be ready (${counter}/${timeout})"
fi


# Wait a second and increment the counter
sleep 1s
((counter++))


done

正在查。国务院。报告情况。国务院。运行等会告诉您它是否正在运行,但是最好确保您的容器的 健康。下面是一个脚本,您可以运行它来确保两个容器在执行第二个容器中的命令之前都处于良好状态。如果已经达到等待时间/尝试阈值,它将打印出 docker 日志。

取自 Npm sql-mdb的例子。

#!/bin/bash
# Wait for two docker healthchecks to be in a "healthy" state before executing a "docker exec -it $2 bash $3"
##############################################################################################################################
# $1 Docker container name that will wait for a "healthy" healthcheck (required)
# $2 Docker container name that will wait for a "healthy" healthcheck and will be used to run the execution command (required)
# $3 The actual execution command that will be ran (required). When "npm_deploy", all tokens will be included in execution of
#     "npm run jsdoc-deploy" and "npm publish"
attempt=0
health1=checking
health2=checking
while [ $attempt -le 79 ]; do
attempt=$(( $attempt + 1 ))
echo "Waiting for docker healthcheck on services $1 ($health1) and $2 ($health2): attempt: $attempt..."
if [[ health1 != "healthy" ]]; then
health1=$(docker inspect -f \{\{.State.Health.Status}} $1)
fi
if [[ $health2 != "healthy" ]]; then
health2=$(docker inspect -f \{\{.State.Health.Status}} $2)
fi
if [[ $health1 == "healthy" && $health2 == "healthy"  ]]; then
echo "Docker healthcheck on services $1 ($health1) and $2 ($health2) - executing: $3"
docker exec -it $2 bash -c "$3"
[[ $? != 0 ]] && { echo "Failed to execute \"$3\" in docker container \"$2\"" >&2; exit 1; }
break
fi
sleep 2
done
if [[ $health1 != "healthy" || $health2 != "healthy"  ]]; then
echo "Failed to wait for docker healthcheck on services $1 ($health1) and $2 ($health2) after $attempt attempts"
docker logs --details $1
docker logs --details $2
exit 1
fi