Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there any way to flush the docker DNS cache (internal)?

I'm using Docker 18.03.1-ce and if I create a container, remove it and then re-create it, the internal DNS retains the old address (in addition to the new).

Is there any way to clear or flush the old entries? If I delete and re-create the network then that flushes it but I don't want to have to do that every time.

I create the network:

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

Then create a container (SQL for this example)

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 

If I create an Alpine container on the same network I can nslookup sql by name and it resolves to 10.0.0.6. No problems, so far-so-good.

Now, if I remove the SQL container and re-create it then nslookup sql shows 10.0.0.6 and 10.0.0.8. The 10.0.0.6 is the old address and no longer alive but still resolves.

The nameserver my containers are using is 127.0.0.11 which is typical for a user-created network but I haven't been able to find anything that will let me clear its cache.

Maybe I'm missing something but I had assumed the DNS entries would be torn down whenever the containers get removed.

Any insight is certainly appreciated!

like image 411
Brian Mitchell Avatar asked Jul 13 '18 22:07

Brian Mitchell


People also ask

How do I flush DNS in Linux?

The easiest way to flush the DNS on Linux, if you are using systemd-resolved, is to use the “systemd-resolve” command followed by “–flush-caches”. Alternatively, you can use the “resolvectl” command followed by the “flush-caches” option.

How do docker containers resolve DNS?

Docker containers take DNS IPs from the host machine, which is managed by systemd-resolve . Those IPs themselves are the cloud provider's DNS.

How do I change my docker DNS?

You can just add a new -dns x.x.x.x for every DNS server you wish to use to resolve. When you docker run a new container, it will have those DNS servers set. This will obviously restart a container. Moreover this won't change container settings, they stick when container is created.

How do I find my docker DNS?

Run docker network ls to get the running networks names, and then docker network inspect NETWORK_NAME to see the containers in it. Look for the "Containers" keyword in the JSON, it is a list of connected devices. Look for the instance with the "IPv4Address": "127.0. 0.11/24" entry, the "Name" key is the DNS name.


1 Answers

I have just fixed the same problem by running containers in Docker Swarm. Seems like Swarm does something to keep DNS entries up to date. I tried to remove my application container manually using docker rm, scaled it up/down - in every case it's hostname was correctly resolved to existing IP addresses only.

If you can't use Swarm, I guess another solution would be to run a standalone service discovery tool (maybe in another container) and configure your other containers to use it as DNS server instead of a build-in one.

like image 195
Vladimir Vasilyev Avatar answered Nov 15 '22 06:11

Vladimir Vasilyev