如何检查 docker 主机是否处于群模式?

How do I check that a docker host is in swarm mode?

执行完后;

eval $(docker-machine env mymachine)

如何检查 mymachine 上的 docker 守护进程是否是 swarm 管理器?

我现在手边没有 swarm 节点,但看起来你可以简单地 运行 类似 docker node ls 的东西。当目标 docker 守护进程在 swarm 节点中是 not 时,结果是:

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.

它 returns 一个非零退出代码

$ 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

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

Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.

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

您还可以使用 docker info 查看 Swarm 属性(inactiveactive)的结果。

例如:

function isSwarmNode(){
    if [ "$(docker info | grep Swarm | sed 's/Swarm: //g')" == "inactive" ]; then
        echo false;
    else
        echo true;
    fi
}

要检查一般群成员,我的首选方法是使用 docker info 的格式化输出。可能的值为 currently inactive, pending, active, locked, and error:

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

确保您的 docker 环境变量设置正确

$环境 | grep DOCKER_

将 url 和端口值与

的输出进行比较

$docker-机器 ls

Select swarm master 机器名,你可以使用

重置环境变量

$eval $(docker-机器环境 your_master_machine_name)

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

$docker 信息 | egrep '^Swarm:' |剪切-d ' ' -f2

应该给出正确的结果

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

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

如上所述,最直接的判断当前节点是否为manager的方式是:

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