Docker Swarm如何通过DNS获取服务的所有容器IP?
如何获取Docker Swarm服务的所有容器IP地址
嗨,这个问题我之前折腾过好一会儿!Docker默认的内置DNS为了实现客户端侧的负载均衡,每次查询服务名只会返回单个IP,但要拿到某个服务所有副本的IP,还是有几个实用的办法的:
方案1:查询Docker SRV记录
Docker Swarm的服务发现会自动生成对应的SRV记录,你可以用dig命令来查询这些记录,从而获取所有副本的IP:
docker run --rm --network micro alpine dig service-a SRV
执行后你会看到包含每个service-a副本的主机名、IP和端口的输出,从中就能提取出所有目标IP地址。
方案2:直接通过Docker命令提取IP
如果你的服务运行在Docker Swarm集群里,直接用Docker引擎的命令就能精准获取所有副本的IP,步骤如下:
- 先获取service-a所有任务的ID:
docker service ps -q service-a
- 接着把这些ID传入
docker inspect命令,提取对应容器在micro网络中的IP:
docker service ps -q service-a | xargs docker inspect --format '{{.NetworkSettings.Networks.micro.IPAddress}}'
这个命令会直接输出service-a所有副本的IP地址列表,非常直观。
补充说明:为什么nslookup只返回一个IP?
Docker内置的DNS组件(比如coredns或者旧版的docker-dns)默认采用轮询策略,每次查询服务名时只会返回一个IP,这样客户端每次请求都会打到不同的副本上,实现简单的负载均衡。所以你多次执行nslookup service-a可能会得到不同的IP,但一次查询不会返回全部。
内容的提问来源于stack exchange,提问作者XGHeaven
相关产品推荐
相关产品推荐

