Can somebody help me get apt-get working in my docker container? Whenever I try running any apt-get command in my docker container, the command fails. I'm running Docker version 1.1.1, build bd609d2 on ubuntu 12.04.
When I do
$ sudo docker run -i -t ubuntu:14.04 /bin/bash
# apt-get update
I get errors saying
Could not resolve 'archive.ubuntu.com'
I tried uncommenting the line below in /etc/default/docker
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
but I still can't ping google.com
ping: unknown host
I confirmed that the container is using the dns servers 8.8.8.8 and 8.8.4.4
root@0baa87fc6322:/# cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
and I'm able to ping both servers so I'm pretty sure that a firewall isn't just dropping my packets.
Any help with this would be appreciated!
Thanks!
Thanks for all your help! I found out it was a dns problem and that it was because of a firewall. After searching some more I found this question that I wasn't able to find while searching 'docker apt-get fail'
Docker - Network calls fail during image build on corporate network
His problem was similar to mine and the solution helped me get it working.
I've copied over his solution for anybody that finds this question in the future.
Those Google servers weren't accessible from behind our firewall, which is why we couldn't resolve any URLs.
The fix is to tell Docker which DNS servers to use. This fix depends on how you installed Docker:
Ubuntu Package
If you have the Ubuntu package installed, edit /etc/default/docker and add the following line:
DOCKER_OPTS="--dns <your_dns_server_1> --dns <your_dns_server_2>"
You can add as many DNS servers as you want to this config. Once you've edited this file you'll want to restart your Docker service:
sudo service docker restart
Binaries
If you've installed Docker via the binaries method (i.e. no package), then you set the DNS servers when you start the Docker daemon:
sudo docker -d -D --dns --dns &
If you see an error like Could not resolve ...
, it is likely a DNS configuration.
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.
First check if you have connection, ping directly to ip 91.189.92.201
that archive.ubuntu.com
is pointed to:
ping 91.189.92.201
If you still can't reach the host it's not a dns problem.
Also if you have internet connection, you can make a hack. Just put a row into /etc/hosts
file and problem solved:
91.189.92.201 archive.ubuntu.com
I encounter the issue in two different case and the resolution was different...
First one with Win7 + virtualbox(Xubuntu 16.04)
This comment did the job:https://stackoverflow.com/a/29659783/2260796
I modify the file /etc/default/docker:
DOCKER-OPTS="--ip-masq=true --dns my_ip_dns_win --dns 8.8.8.8 --dns
8.8.4.4"
And run
sudo service docker restart
Second one on a Xubuntu OS (ubuntu 16.04)
The precedent resolution was not enough.
This comment did the job: https://github.com/docker/docker/issues/1809
I had to comment one line in file /etc/NetworkManager/NetworkManager.conf:
dns=dnsmasq
Then run
sudo restart network-manager
I am using the version of Mint and after installing Docker and try to create an image of Ubuntu to do the apt-get update command does not recognize, to remedy the problem, I did step down
docker run -it -p 8080:80 ubuntu /bin/bash
echo "91.189.92.201 archive.ubuntu.com" >> /etc/hosts
cat /etc/hosts
apt-get update
I faced the same problem with docker-compose
. I solve that by adding ENV http_proxy 'proxy.com'
entry into Dockerfile.