有什么方法可以冲洗docker DNS缓存(内部)?

时间:2018-07-13 22:52:32

标签: docker docker-networking

我正在使用Docker 18.03.1-ce,如果我创建了一个容器,请先删除它,然后重新创建它,内部DNS会保留旧地址(除了新地址外)。

有什么方法可以清除或刷新旧条目?如果我删除并重新创建网络,则会刷新该网络,但我不想每次都这样做。

我创建了网络:

docker network create -d overlay --attachable --subnet 10.0.0.0/24 --gateway 10.0.0.1 --scope swarm -o parent=ens224 overlay1

然后创建一个容器(此示例为SQL)

docker container run -d --rm --network overlay1 --name sql -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Some_SA_Passw0rd' -p 1433:1433 microsoft/mssql-server-linux 

如果在同一网络上创建Alpine容器,则可以按名称nslookup sql解析为10.0.0.6。没问题,到目前为止还不错。

现在,如果我删除SQL容器并重新创建它,那么nslookup sql将显示10.0.0.610.0.0.810.0.0.6是旧地址,不再存在,但仍会解析。

我的容器使用的名称服务器是127.0.0.11,这对于用户创建的网络来说是典型的,但是我找不到任何可以清除其缓存的内容。

也许我遗漏了一些东西,但是我假设只要删除容器,DNS条目就会被删除。

任何见识当然都值得赞赏!

2 个答案:

答案 0 :(得分:1)

我刚刚通过在Docker Swarm中运行容器解决了相同的问题。似乎Swarm可以使DNS条目保持最新状态。我尝试使用 docker rm 手动删除我的应用程序容器,并按比例放大/缩小-在每种情况下,其主机名仅正确解析为现有IP地址。

如果您不能使用Swarm,我想另一种解决方案是运行一个独立的服务发现工具(也许在另一个容器中),并配置其他容器以将其用作DNS服务器而不是内置服务器。 / p>

答案 1 :(得分:0)

像Daniele一样,我在Swarm模式(堆栈)中也遇到了DNS问题。我杀死了在1个节点上运行的服务(注意其他实例正在其他节点上运行),然后swarm开始重新创建它们。但是与此同时,DNS为我提供了错误的服务名称IP。更重要的是,我希望DNS解析每次都能为我提供不同的IP,但事实并非如此,在一定时间范围内(几秒钟),对于给定的服务,无论IP是否有效,DNS都会返回相同的IP。

Daniele,您是否填写了错误报告?