如何检查泊坞主机是否处于群集模式?

时间:2017-03-27 17:38:02

标签: docker docker-machine

执行此操作后;

eval $(docker-machine env mymachine)

如何检查mymachine上的docker守护程序是否为群组管理器?

6 个答案:

答案 0 :(得分:11)

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

例如:

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

答案 1 :(得分:6)

我目前没有方便的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 :(得分:4)

要检查常规群组成员资格,我首选的方法是使用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

答案 3 :(得分:0)

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

  

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

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

答案 4 :(得分:0)

确保正确设置了docker环境变量

$ env | grep DOCKER _

将url和端口值与来自的输出进行比较

$ docker-machine ls

选择集群主计算机名称,然后可以使用重置环境变量

$ eval $(docker-machine env your_master_machine_name)

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

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

应该给出正确的结果

答案 5 :(得分:0)

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

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

如上所述,确定当前节点是否为管理者的最直接方法是使用:

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