Docker Swarm服务重建后同网络服务无法解析的解决咨询
解决Docker Swarm重建服务后现有服务无法解析的问题
这种情况本质上是Docker Swarm内部DNS缓存搞的鬼:你删除再重建company_service后,Swarm会给新服务分配全新的虚拟IP(VIP)和容器IP,但user_service的旧容器还缓存着之前解析出来的旧IP,自然连不上新服务。
下面是几个实用的解决方法,按推荐程度排序:
1. 强制滚动更新现有服务(最直接有效)
直接让user_service的容器全部重建一遍,新容器会重新解析company_service的最新地址,而且Swarm的滚动更新不会中断服务:
docker service update --force user_service
这个命令会触发服务的滚动更新,逐个替换掉旧的容器,新容器加入网络后会自动获取最新的DNS记录,问题立马解决。
2. 缩短容器DNS缓存时间(预防未来出现类似问题)
如果不想每次都重启服务,可以调整容器的DNS参数,让它更快地刷新DNS缓存。你可以在创建服务时就加上这些参数,或者更新已有服务:
# 更新现有user_service的DNS配置 docker service update \ --dns-opt ndots:0 \ --dns-opt timeout:1 \ --dns-opt attempts:1 \ user_service
这些参数会让容器的DNS客户端更快地放弃旧缓存,重新解析域名,不过这个方法需要等现有缓存过期后才会生效,不如重启容器来得直接。
3. 应用层增加重试机制(长期优化方案)
在你的应用代码里给请求加上重试逻辑,比如连接失败时自动重试几次,同时设置较短的连接超时。这样即使遇到DNS缓存过期的间隙,应用也能自动恢复,不用手动干预服务。
补充:为什么会出现这个问题?
当你删除
company_service时,Swarm会回收它的VIP和容器IP;重建后,新服务会拿到完全不同的IP地址。而user_service的容器会把之前解析到的company_serviceIP缓存起来(不同基础镜像的缓存时长不一样,有些默认是几分钟甚至更久),缓存没过期前,容器只会用旧IP去连接,自然会被拒绝。
内容的提问来源于stack exchange,提问作者Mr.D
相关产品推荐
相关产品推荐

