You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何获取Docker网络的所有IP地址?含Swarm集群容器内查询场景

问题1:如何获取某一Docker网络上的所有IP地址?

最直接的方式是通过docker inspect命令查询目标网络的详细信息,从中提取容器的IP地址,这里给你两种实用的写法:

  • 如果你只需要纯IP列表,可以执行:

    docker inspect -f '{{range .Containers}}{{.IPv4Address}}{{"\n"}}{{end}}' <你的网络名称>
    

    输出会带子网掩码(比如172.18.0.2/16),如果只想保留纯IP,再加个字符串处理即可:

    docker inspect -f '{{range .Containers}}{{.IPv4Address}}{{"\n"}}{{end}}' <你的网络名称> | cut -d'/' -f1
    
  • 要是想同时看到容器名称和对应IP,让结果更直观,用这个命令:

    docker inspect -f '{{range .Containers}}{{.Name}}: {{.IPv4Address}}{{"\n"}}{{end}}' <你的网络名称> | cut -d'/' -f1
    

    输出会类似/my-app-container: 172.18.0.3,一眼就能对应上容器和它的IP。


问题2:Swarm服务栈中,从overlay网络内的容器获取已用IP并关联服务/容器名

因为你的容器分散在不同docker-machine节点上,且通过overlay网络互联,我分两种场景给你解决方案:

场景1:在Swarm管理节点上操作(推荐,安全又便捷)

管理节点有权限查看整个集群的网络和服务信息,不需要在容器内做额外配置:

  1. 直接查询overlay网络的容器信息,同时提取容器名、IP和关联服务:

    docker network inspect <overlay网络名称> -f '{{range .Containers}}{{.Name}}: {{.IPv4Address}}{{"\n"}}{{end}}' | cut -d'/' -f1
    

    Swarm里的容器名称格式一般是服务名.序号.随机字符串(比如my-web.1.abcdef1234),从名称里就能直接看出对应的服务名。

  2. 要是想更精准地关联服务、容器ID和IP,结合docker service ps命令来实现:

    # 遍历服务栈下的所有任务,关联服务名、容器ID和IP
    docker service ps --format "{{.Service}}: {{.ID}}" <你的服务栈名称> | while read line; do
      SERVICE=$(echo $line | cut -d':' -f1)
      TASK_ID=$(echo $line | cut -d':' -f2 | xargs)
      IP=$(docker inspect $TASK_ID -f '{{.NetworkSettings.Networks.<overlay网络名称>.IPAddress}}')
      echo "$SERVICE - 容器ID:$TASK_ID - IP:$IP"
    done
    

    把命令里的占位符替换成你实际的服务栈和网络名称就行,输出会给出完整的关联信息。

场景2:在overlay网络内的容器中操作(需额外配置)

如果必须从容器内部获取这些信息,需要让容器能访问Docker API,步骤如下:

  1. 部署服务时,挂载宿主机的Docker socket到容器内,同时安装Docker CLI工具(以Alpine镜像为例),在你的docker-compose.yml中添加:

    services:
      your-service:
        image: alpine:latest
        command: sh -c "apk add --no-cache docker-cli && tail -f /dev/null"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        networks:
          - your-overlay-network
    

    ⚠️ 注意:挂载Docker socket会让容器获得宿主机的Docker管理权限,存在安全风险,仅限信任的场景使用。

  2. 进入容器后,就可以执行和管理节点一样的docker network inspect命令获取信息了:

    docker network inspect <overlay网络名称> -f '{{range .Containers}}{{.Name}}: {{.IPv4Address}}{{"\n"}}{{end}}' | cut -d'/' -f1
    

另外,如果你只需要查询某个服务对应的所有容器IP,也可以用容器内的DNS工具(比如nslookup)直接查询服务名:

nslookup <你的服务名>

这个方法能快速拿到服务对应的所有容器IP,但只能关联到服务名,无法获取具体容器名称。


内容的提问来源于stack exchange,提问作者Paul Soubrane

火山引擎 最新活动