如何命令查找docker集群实例关键字?

Bash

1 前言

一个问题,一篇文章,一出故事。
笔者定位某个IP地址在集群中的位置,于是笔者想到使用循环去遍历集群中的物理主机,然后使用docker命令查询出信息并搜索,于是产生本文。

2 最佳实践

2.1 集群的主机列表

cat /etc/hosts

命令现实如下,

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.168.0.24 hd01.cmdschool.org
10.168.0.25 hd02.cmdschool.org
10.168.0.26 hd03.cmdschool.org
10.168.0.27 hd04.cmdschool.org
10.168.0.28 hd05.cmdschool.org
#....

注:“#….”表示省略的主机名称

2.2 配置公钥认证

此步骤需要你配置公钥认证允许运行脚本的主机通过无需密码的方式登录上一个步骤配置在列表中的主机,详细如下,

如何部署公钥认证?

2.3 创建搜索脚本

mkdir -p ~/scripts/
vim ~/scripts/docker-search.sh

加入如下脚本,

#!/bin/bash

searchKeywork="10.168.2.250"
hostKeyWork="hd"

hosts=`cat /etc/hosts | awk -F' ' '{print $2}' | grep -i "$hostKeyWork"`
for i in $hosts; do
        host="$i"
        dockerInstall=`ssh "$host" whereis docker | grep /usr/bin/docker | wc -l`
        if [ "$dockerInstall" == "0" ]; then
                continue
        fi
        containers=`ssh "$host" docker container ls | awk -F' ' '{print $1}' | grep -v "CONTAINER"`
        for j in $containers; do
                container="$j"
                echo "$host:$container,"
                ssh "$host" docker container inspect "$container" | grep -i "$searchKeywork"
        done

        networks=`ssh "$host" docker network ls | awk -F' ' '{print $1}' | grep -v "NETWORK"`
        for k in $networks; do
                network="$k"
                echo "$host:$network,"
                ssh "$host" docker network inspect "$network" | grep -i "$searchKeywork"
        done
done

脚本解析,
– 变量“searchKeywork”定义需要搜索关键字
– 变量“hostKeyWork”定义筛选出容器物理主机的关键字
– 变量“hosts”定义筛选出容器物理主机列表的命令,,即变量存储物理机的列表
– 循环“for”即第一个循环迭代找到的每一台容器物理主机
– 命令“if”判断变量“dockerInstall”的计数如果等于零则跳过循环(没有安装docker,直接跳过)
– 变量“containers”定义筛选出容器虚拟机的ID列表的命令,即变量存储当前物理机的容器列表
– 循环“for”即第二个循环迭代当前物理主机上的每个“container”
– 循环“for”即第二个循环的“echo”命令输出当前主机和容器“container”
– 循环“for”即第二个循环的“ssh”命令连接到当前主机并执行命令“docker container inspect”
– 循环“for”即第二个循环的“docker container inspect”查询容器“container”的实例详细信息
– 循环“for”即第二个循环的“grep”使用变量“searchKeywork”定义的关键字过滤“container”实例的详细信息
– 循环“for”即第三个循环类似第二个循环,不同的是搜索对象为“container”的“network”信息

2.3 测试脚本

sh ~/scripts/docker-search.sh
没有评论

发表回复

Bash
如何用Tigase监控postfix smtp服务?

1 前言 一个问题,一篇文章,一出故事。 笔者生产中的smtp服务器最近因为负载均衡器的路由故障而导 …

Bash
如何用Tigase监控Elasticsearch集群?

1 前言 一个问题,一篇文章,一出故事。 笔者生产中有一套Elasticsearch集群,笔者为了能 …

Bash
如何用Base Shell获取ES集群状态?

1 前言 一个问题,一篇文章,一出故事。 笔者想要通过Base Shell获取Elasticsear …