No internet connection inside Docker containers
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Hypnotic Puzzle3
--
Chapters
00:00 No Internet Connection Inside Docker Containers
01:09 Accepted Answer Score 28
01:26 Answer 2 Score 12
02:18 Answer 3 Score 9
04:51 Answer 4 Score 18
05:43 Thank you
--
Full question
https://superuser.com/questions/1130898/...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#networking #ubuntu #docker
#avk47
ACCEPTED ANSWER
Score 28
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"
ANSWER 2
Score 18
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
ANSWER 3
Score 12
There 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.conf
If 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.conf
And comment out the line with dns=dnsmasq
; the file should look like this:
[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq
[ifupdown]
managed=false
Finally, restart the network manager:
$ sudo systemctl restart network-manager
Test again the container:
$ docker run ubuntu:16.04 apt-get update
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]
ANSWER 4
Score 9
I've already answered it here: https://stackoverflow.com/a/45644890/
I'm copying the answer below:
First thing to check is run
cat /etc/resolv.conf
in 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.com
will fail.Second thing to check is run
cat /etc/resolv.conf
on the host machine. Docker basically copies the host's/etc/resolv.conf
to the container everytime a container is started. So if the host's/etc/resolv.conf
is wrong, then so will the docker container.If you have found that the host's
/etc/resolv.conf
is 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.conf
with the values fromdaemon.json
.
2. Fix the hosts's
/etc/resolv.conf
A. Ubuntu 16.04 and earlier
For Ubuntu 16.04 and earlier,
/etc/resolv.conf
was dynamically generated by NetworkManager.Comment out the line
dns=dnsmasq
(with a#
) in/etc/NetworkManager/NetworkManager.conf
Restart the NetworkManager to regenerate
/etc/resolv.conf
:sudo systemctl restart network-manager
Verify on the host:
cat /etc/resolv.conf
B. Ubuntu 18.04 and later
Ubuntu 18.04 changed to use
systemd-resolved
to 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.conf
is 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.conf
Verify on the host:
cat /etc/resolv.conf
Now you should have a valid
/etc/resolv.conf
on the host for docker to copy into the containers.