I had it working allright but now it stopped. I tried the following commands with no avail:
docker run -dns 8.8.8.8 base ping google.com
docker run base ping google.com
sysctl -w net.ipv4.ip_forward=1
- both on the host and on the container
All I get is unknown host google.com
. Docker version 0.7.0
Any ideas?
P.S. ufw
disabled as well
Docker creates a virtual network called bridge by default, and connects your containers to it. In the network, containers are assigned an IP address, which they can use to address each other.
The main challenge here is that to introduce a Docker image from the Docker Hub, you have to be connected to the Internet. Usually, you would install Docker using apt-get, but it's impossible without the Internet.
First thing to check is run cat /etc/resolv.conf
in the docker container. If it has an invalid DNS server, such as nameserver 127.0.x.x
, then the container will not be able to resolve the domain names into ip addresses, so ping 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 from daemon.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.
Fixed by following this advice:
[...] can you try to reset everything?
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
https://github.com/dotcloud/docker/issues/866#issuecomment-19218300
Seems the interface was 'hung' somehow.
Update for more recent versions of docker:
The above answer might still get the job done for you but it has been quite a long time since this answer was posted and docker is more polished now so make sure you try these first before going into mangling with iptables
and all.
sudo service docker restart
or (if you are in a linux distro that does not use upstart) sudo systemctl restart docker
The intended way to restart docker is not to do it manually but use the service
or systemctl
command:
service docker restart
or
systemctl restart docker
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With