如何检查Docker主机是否处于Swarm模式?

23

执行此操作后;

eval $(docker-machine env mymachine)

如何检查 mymachine 上的 Docker 守护程序是否是一个集群管理器?

6个回答

39

要检查一般的群集成员身份,我推荐使用docker info的格式化输出。可能的值包括当前处于未激活、挂起、激活、锁定和错误状态

case "$(docker info --format '{{.Swarm.LocalNodeState}}')" in
  inactive)
    echo "Node is not in a swarm cluster";;
  pending)
    echo "Node is not in a swarm cluster";;
  active)
    echo "Node is in a swarm cluster";;
  locked)
    echo "Node is in a locked swarm cluster";;
  error)
    echo "Node is in an error state";;
  *)
    echo "Unknown state $(docker info --format '{{.Swarm.LocalNodeState}}')";;
esac

要检查是否为群集中的管理器而不仅仅是节点,则您需要使用字段.Swarm.ControlAvailable

docker info --format '{{.Swarm.ControlAvailable}}'

对于管理节点,这将输出“true”,对于任何工作节点或不在群集中的节点,将输出“false”。

要识别工作节点,您可以加入两个:

if [ "$(docker info --format '{{.Swarm.LocalNodeState}}')" = "active" \
     -a "$(docker info --format '{{.Swarm.ControlAvailable}}')" = "false" ]; then
  echo "node is a worker"
else
  echo "node is not a worker"
fi

这是一个很好的答案,也是最适合的解决方案。 - Carl Wainwright
这对我非常有效,但我将其放在引导脚本中,发现它有点慢,因此需要更有效的访问值的方法。我想到了 docker node inspect self --format '{{.Spec.Availability}}' - Adrian Günter

29
你也可以使用 docker info 命令查看 Swarm 属性的结果(inactiveactive)。例如:
function isSwarmNode(){
    if [ "$(docker info | grep Swarm | sed 's/Swarm: //g')" == "inactive" ]; then
        echo false;
    else
        echo true;
    fi
}

1
这是一个不错的函数。我认为你可以在“docker info”之后添加重定向2>/dev/null,以防止Docker警告与你的真/假响应混杂。 - Marvin
这是我正在编写的一些自动化工作中非常好的函数。 - joshmcode
10
似乎更加合理的解决方案是执行docker info --format '{{.Swarm.LocalNodeState}}'命令。 - x-yuri

9

目前我手头没有Swarm节点,但看起来您可以简单地运行docker node ls。当针对不在Swarm节点中的Docker守护程序进行操作时,结果如下:

Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.

当它返回非零退出代码时

$ echo $?
1

所以测试看起来应该是这样的:
if docker node ls > /dev/null 2>&1; then
  echo this is a swarm node
else
  echo this is a standalone node
fi

2
正如@MarcelloRomani所指出的那样,这个测试在工作节点中失败了。正如https://docs.docker.com/get-started/part4/中所写的那样,有两种群集节点:管理节点和工作节点。即使是群集节点,工作节点也无法执行“docker node”(以及其他一些与群集相关的)命令。因此,我建议查看“docker info”命令的输出。 - Shinbero

0

请确保您的 Docker 环境变量设置正确

$env | grep DOCKER_

将 URL 和端口值与输出进行比较:

$docker-machine ls

选择 Swarm 主机名称,您可以使用以下命令重置环境变量:

$eval $(docker-machine env your_master_machine_name)

一旦环境变量设置正确,您的命令

$docker info | egrep '^Swarm: ' | cut -d ' ' -f2

应该给出正确的结果。


0
除了larsks的回答之外,如果您在指向工作节点时运行docker node ls,您将收到以下消息:

来自守护程序的错误响应:此节点不是群集管理器。工作节点无法用于查看或修改群集状态。请在管理节点上运行此命令或将当前节点提升为管理器。

您可以使用此方法区分工作节点和根本不在群集中的节点。

0

使用bash从任何节点(工作节点或管理节点)获取管理器的IP地址,您可以执行以下操作:

read manager_ip _ <<<$(IFS=':'; echo $(docker info --format "{{ (index .Swarm.RemoteManagers 0).Addr }}"))
echo "${manager_ip}"

如上所述,识别当前节点是否为管理器的最直接方法是使用:
docker info --format '{{.Swarm.ControlAvailable}}'

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