如何从Swarm节点获取overlay网络容器详情及跨节点全容器列表
嘿,刚好我之前在处理Docker Swarm集群的时候遇到过类似的需求,给你分享下具体的解决方法,分两部分来说:
1. 获取Overlay网络中所有容器的详情
不管是用命令行快速验证,还是通过API编程实现,核心思路都是先定位目标Overlay网络,再遍历所有Swarm节点抓取关联容器——因为Overlay网络的容器可能分布在集群的不同节点上,单节点的docker ps或/containers/json接口只能拿到本地容器。
命令行方式(快速验证)
- 先列出集群中所有的Overlay网络,找到你要查询的目标网络名称/ID:
docker network ls --filter driver=overlay - 遍历所有Swarm节点,查询每个节点上属于该Overlay网络的容器(前提是所有节点开启了远程API访问,端口默认2375):
执行后会逐个节点输出对应容器的ID、名称、状态和镜像信息。# 获取所有Swarm节点的主机名 NODES=$(docker node ls --format "{{.Hostname}}") # 替换成你的目标Overlay网络名称 TARGET_NETWORK="my-overlay-network" for NODE in $NODES; do echo "===== 节点 $NODE 上的Overlay网络容器 =====" docker -H $NODE:2375 ps -a --filter network=$TARGET_NETWORK --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Image}}" done
API编程方式
如果要整合到代码里,可以按以下步骤来:
- 从Swarm管理节点调用
/networks/<network-id>接口,获取该Overlay网络关联的所有容器ID(也可以直接跳过这步,直接按网络名称过滤容器) - 调用管理节点的
/nodes接口,获取集群所有节点的IP地址 - 对每个节点,调用其
/containers/json接口,并加上网络过滤参数,抓取容器详情:
你可以用Python、Go等语言封装这个逻辑,把所有节点的容器结果合并成一个列表,还可以给每个容器加上所属节点的标识(比如节点名称、IP)。# 示例:用curl调用单个节点的API,过滤指定Overlay网络 curl "http://<node-ip>:2375/containers/json?filters={\"network\":[\"my-overlay-network\"]}"
2. 通过Docker API获取所有Swarm节点的容器列表
默认情况下,Docker API的/containers/json接口只能返回当前节点的容器,要拿到全集群的容器,必须遍历所有Swarm节点,分别调用每个节点的API,具体步骤如下:
前提准备
确保所有Swarm节点都开启了远程API访问:
- 修改每个节点的
/etc/docker/daemon.json,添加配置:{ "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"] } - 重启Docker服务:
systemctl restart docker - 注意:生产环境一定要启用TLS加密,避免未授权的API访问,不要直接用明文的2375端口!
编程实现示例(Python)
下面是一个简单的Python脚本,用来抓取全集群的容器列表:
import requests # 替换成你的Swarm管理节点API地址 MANAGER_API_URL = "http://your-manager-ip:2375" def get_all_swarm_containers(): # 第一步:获取所有Swarm节点的信息 nodes_resp = requests.get(f"{MANAGER_API_URL}/nodes") nodes_resp.raise_for_status() nodes = nodes_resp.json() all_containers = [] for node in nodes: node_ip = node["Status"]["Addr"] node_name = node["Description"]["Hostname"] print(f"正在抓取节点 {node_name} ({node_ip}) 的容器...") # 第二步:调用当前节点的容器列表API containers_resp = requests.get(f"http://{node_ip}:2375/containers/json?all=1") containers_resp.raise_for_status() containers = containers_resp.json() # 给容器添加所属节点的标识 for container in containers: container["node_info"] = { "name": node_name, "ip": node_ip } all_containers.append(container) return all_containers if __name__ == "__main__": containers = get_all_swarm_containers() print(f"集群中共有 {len(containers)} 个容器") # 可以在这里处理容器数据,比如输出、存储到数据库等
这个脚本会从管理节点获取所有集群节点,然后逐个节点抓取容器,最后返回包含所有节点容器的列表,每个容器还附带了所属节点的信息。
内容的提问来源于stack exchange,提问作者ashish
相关产品推荐
相关产品推荐

