如何获取Docker网络的所有IP地址?含Swarm集群容器内查询场景
最直接的方式是通过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。
因为你的容器分散在不同docker-machine节点上,且通过overlay网络互联,我分两种场景给你解决方案:
场景1:在Swarm管理节点上操作(推荐,安全又便捷)
管理节点有权限查看整个集群的网络和服务信息,不需要在容器内做额外配置:
直接查询overlay网络的容器信息,同时提取容器名、IP和关联服务:
docker network inspect <overlay网络名称> -f '{{range .Containers}}{{.Name}}: {{.IPv4Address}}{{"\n"}}{{end}}' | cut -d'/' -f1Swarm里的容器名称格式一般是
服务名.序号.随机字符串(比如my-web.1.abcdef1234),从名称里就能直接看出对应的服务名。要是想更精准地关联服务、容器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,步骤如下:
部署服务时,挂载宿主机的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管理权限,存在安全风险,仅限信任的场景使用。
进入容器后,就可以执行和管理节点一样的
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




