No internet connection inside Docker containers
Matthew Barrera
I cannot execute any command requiring internet connection inside any Docker container.
Works:
docker run ubuntu /bin/echo 'Hello world'Does not work:
docker run ubuntu apt-get update
Err:1 xenial InRelease Temporary failure resolving 'archive.ubuntu.com'
Err:2 xenial-updates InRelease Temporary failure resolving 'archive.ubuntu.com'
Err:3 xenial-security InRelease Temporary failure resolving 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch Temporary failure resolving 'archive.ubuntu.com'Similar with pip and ping.
I am on Ubuntu 16.04 and not using firewall or corporate proxy server and have tried to restart Docker.
Upd:
Update in interactive mode fails in the same fashion.
docker exec -ti angry_goodall /bin/bash
apt-get update
#fails
ping google.com
#fails with "unknown host" message
ping 8.8.8.8
# shows PING 8.8.8.8 (8.8.8.8): 56 data bytes
# and than hangs indefinetlysudo apt-get update runs successfully on host, i.e. on my computer outside docker.
Upd Docker version 1.12.1, build 23cf638
96 Answers
As suggested by creack on GitHub issue #866 for Docker:
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d"It will force docker to recreate the bridge and reinit all the network rules"
10There is a similar issue at StackOverflow where a different solution solves this issue with Docker 17.09 on Ubuntu 16.04:
Check the contents of resolv.conf:
$ cat /etc/resolv.confIf it includes a line like nameserver 127.0.1.1 it means the containers are obtaining an incorrect names server. To fix this edit the NetworkManager.conf file:
$ sudo pico /etc/NetworkManager/NetworkManager.confAnd comment out the line with dns=dnsmasq; the file should look like this:
[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq
[ifupdown]
managed=falseFinally, restart the network manager:
$ sudo systemctl restart network-managerTest again the container:
$ docker run ubuntu:16.04 apt-get update
Get:1 xenial InRelease [247 kB]
Get:2 xenial-updates InRelease [102 kB] 2 When you create container using docker run without specifying it's network explicitly (--network foo), docker connects it to default bridge network.
Default bridge network has been deprecated (can't find information, from which version of Docker Engine), should be considered an implementation detail and shouldn't be used.
But, more importantly, any container connected to default bridge network prohibited from networking with outside world - see "Differences between user-defined bridges and default bridge".
You can enable such networking to outside world, but I don't recommend to do so. It requires you to persist suggested host configuration changes, which can be not what you want.
Solution is simple: just create your own (user-defined) bridge network, name it, say, common, and use it explicitly with each one-off container created with docker run:
$ docker network create --driver bridge common
$ docker run -it --network common ubuntu:latest bash 4 I've already answered it here:
I'm copying the answer below:
2First thing to check is run
cat /etc/resolv.confin the docker container. If it has an invalid DNS server, such asnameserver 127.0.x.x, then the container will not be able to resolve the domain names into ip addresses, soping google.comwill fail.Second thing to check is run
cat /etc/resolv.confon the host machine. Docker basically copies the host's/etc/resolv.confto the container everytime a container is started. So if the host's/etc/resolv.confis wrong, then so will the docker container.If you have found that the host's
/etc/resolv.confis wrong, then you have 2 options:
Hardcode the DNS server in daemon.json. This is easy, but not ideal if you expect the DNS server to change.
Fix the hosts's
/etc/resolv.conf. This is a little trickier, but it is generated dynamically, and you are not hardcoding the DNS server.1. Hardcode DNS server in docker daemon.json
Edit
/etc/docker/daemon.json{ "dns": ["10.1.2.3", "8.8.8.8"] } * Restart the docker daemon for those changes to take effect: `sudo systemctl restart docker`Now when you run/start a container, docker will populate
/etc/resolv.confwith the values fromdaemon.json.2. Fix the hosts's
/etc/resolv.confA. Ubuntu 16.04 and earlier
For Ubuntu 16.04 and earlier,
/etc/resolv.confwas dynamically generated by NetworkManager.Comment out the line
dns=dnsmasq(with a#) in/etc/NetworkManager/NetworkManager.confRestart the NetworkManager to regenerate
/etc/resolv.conf:sudo systemctl restart network-managerVerify on the host:
cat /etc/resolv.confB. Ubuntu 18.04 and later
Ubuntu 18.04 changed to use
systemd-resolvedto generate/etc/resolv.conf. Now by default it uses a local DNS cache 127.0.0.53. That will not work inside a container, so Docker will default to Google's 8.8.8.8 DNS server, which may break for people behind a firewall.
/etc/resolv.confis actually a symlink (ls -l /etc/resolv.conf) which points to/run/systemd/resolve/stub-resolv.conf(127.0.0.53) by default in Ubuntu 18.04.Just change the symlink to point to
/run/systemd/resolve/resolv.conf, which lists the real DNS servers:sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.confVerify on the host:
cat /etc/resolv.confNow you should have a valid
/etc/resolv.confon the host for docker to copy into the containers.
For me, this seemed to do the trick:
systemctl stop docker
systemctl start docker
(probably systemctl restart docker would have also worked)
In my case I had docker installed via snap, after removing it and installing by following instructions from the official website it started to work normally.