【问题标题】:How do I check that a docker host is in swarm mode?如何检查 docker 主机是否处于 swarm 模式?
【发布时间】:2017-03-27 17:38:02
【问题描述】:

执行此操作后;

eval $(docker-machine env mymachine)

如何检查mymachine 上的 docker 守护进程是否为 swarm manager?

【问题讨论】:

    标签: docker docker-machine


    【解决方案1】:

    要检查一般的 swarm 成员资格,我首选的方法是使用来自 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
    

    【讨论】:

    • 这是一个很好的答案,也是最适合的解决方案。
    【解决方案2】:

    您也可以使用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”之后添加重定向 2>/dev/null,以防止 docker 警告与您的真/假响应堆积在一起
    • 对于我正在编写的一些自动化来说,这是一个很棒的功能。
    • docker info --format '{{.Swarm.LocalNodeState}}' 解决方案似乎更有序。
    【解决方案3】:

    目前我手边没有 swarm 节点,但看起来你可以简单地运行类似 docker node ls 的东西。当针对 swarm 节点中 not 的 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
    

    【讨论】:

    • 正如@MarcelloRomani 指出的那样,此测试在工作节点中失败。如docs.docker.com/get-started/part4 中所写,swarm 节点有 2 种类型;管理节点和工作节点。并且工作节点无法执行“docker node”(以及其他一些与集群相关的)命令,即使它是集群节点。所以,我建议查看“docker info”命令输出。
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      $env | grep DOCKER_

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

      $docker-machine ls

      选择swarm master机器名称,你可以使用重置环境变量

      $eval $(docker-machine env your_master_machine_name)

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

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

      应该给出正确的结果

      【讨论】:

        【解决方案6】:

        要使用 bash 从任何节点(工作者或管理器)获取管理器的 IP 地址,您可以这样做:

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

        如上所述,识别当前节点是否为管理器的最直接方法是使用:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-20
          • 2014-01-29
          • 1970-01-01
          • 1970-01-01
          • 2018-08-21
          • 2020-03-04
          • 2017-11-11
          相关资源
          最近更新 更多