【发布时间】:2017-03-27 17:38:02
【问题描述】:
执行此操作后;
eval $(docker-machine env mymachine)
如何检查mymachine 上的 docker 守护进程是否为 swarm manager?
【问题讨论】:
标签: docker docker-machine
执行此操作后;
eval $(docker-machine env mymachine)
如何检查mymachine 上的 docker 守护进程是否为 swarm manager?
【问题讨论】:
标签: docker docker-machine
要检查一般的 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
【讨论】:
您也可以使用docker info 查看Swarm 属性(inactive 或active)的结果。
例如:
function isSwarmNode(){
if [ "$(docker info | grep Swarm | sed 's/Swarm: //g')" == "inactive" ]; then
echo false;
else
echo true;
fi
}
【讨论】:
目前我手边没有 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
【讨论】:
除了 larsks 的回答,如果你在指向工作节点时运行docker node ls,你会得到以下消息:
来自守护进程的错误响应:此节点不是集群管理器。工作节点不能用于查看或修改集群状态。请在管理节点上运行此命令或将当前节点提升为管理节点。
您可以使用它来区分工作节点和根本不在集群中的节点。
【讨论】:
确保您的 docker 环境变量设置正确
$env | grep DOCKER_
将 url 和端口值与来自的输出进行比较
$docker-machine ls
选择swarm master机器名称,你可以使用重置环境变量
$eval $(docker-machine env 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}"
如上所述,识别当前节点是否为管理器的最直接方法是使用:
docker info --format '{{.Swarm.ControlAvailable}}'
【讨论】: