执行此操作后;
eval $(docker-machine env mymachine)
如何检查 mymachine
上的 Docker 守护程序是否是一个集群管理器?
执行此操作后;
eval $(docker-machine env mymachine)
如何检查 mymachine
上的 Docker 守护程序是否是一个集群管理器?
要检查一般的群集成员身份,我推荐使用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
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节点中的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
请确保您的 Docker 环境变量设置正确
$env | grep DOCKER_
将 URL 和端口值与输出进行比较:
$docker-machine ls
选择 Swarm 主机名称,您可以使用以下命令重置环境变量:
$eval $(docker-machine env your_master_machine_name)
一旦环境变量设置正确,您的命令
$docker info | egrep '^Swarm: ' | cut -d ' ' -f2
应该给出正确的结果。
docker node ls
,您将收到以下消息:
您可以使用此方法区分工作节点和根本不在群集中的节点。来自守护程序的错误响应:此节点不是群集管理器。工作节点无法用于查看或修改群集状态。请在管理节点上运行此命令或将当前节点提升为管理器。
使用bash从任何节点(工作节点或管理节点)获取管理器的IP地址,您可以执行以下操作:
read manager_ip _ <<<$(IFS=':'; echo $(docker info --format "{{ (index .Swarm.RemoteManagers 0).Addr }}"))
echo "${manager_ip}"
docker info --format '{{.Swarm.ControlAvailable}}'
docker node inspect self --format '{{.Spec.Availability}}'
。 - Adrian Günter