You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Swarm节点获取overlay网络容器详情及跨节点全容器列表

嘿,刚好我之前在处理Docker Swarm集群的时候遇到过类似的需求,给你分享下具体的解决方法,分两部分来说:

1. 获取Overlay网络中所有容器的详情

不管是用命令行快速验证,还是通过API编程实现,核心思路都是先定位目标Overlay网络,再遍历所有Swarm节点抓取关联容器——因为Overlay网络的容器可能分布在集群的不同节点上,单节点的docker ps或/containers/json接口只能拿到本地容器。

命令行方式(快速验证)

  1. 先列出集群中所有的Overlay网络,找到你要查询的目标网络名称/ID:
    docker network ls --filter driver=overlay
    
  2. 遍历所有Swarm节点,查询每个节点上属于该Overlay网络的容器(前提是所有节点开启了远程API访问,端口默认2375):
    # 获取所有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
    
    执行后会逐个节点输出对应容器的ID、名称、状态和镜像信息。

API编程方式

如果要整合到代码里,可以按以下步骤来:

  1. 从Swarm管理节点调用/networks/<network-id>接口,获取该Overlay网络关联的所有容器ID(也可以直接跳过这步,直接按网络名称过滤容器)
  2. 调用管理节点的/nodes接口,获取集群所有节点的IP地址
  3. 对每个节点,调用其/containers/json接口,并加上网络过滤参数,抓取容器详情:
    # 示例:用curl调用单个节点的API,过滤指定Overlay网络
    curl "http://<node-ip>:2375/containers/json?filters={\"network\":[\"my-overlay-network\"]}"
    
    你可以用Python、Go等语言封装这个逻辑,把所有节点的容器结果合并成一个列表,还可以给每个容器加上所属节点的标识(比如节点名称、IP)。
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:56:20