我已经安装了干净的 Ubuntu MATE 16.04.6 LTS。
我从这里的存储库安装了 Docker:
sudo apt-get install docker.io
并将我的用户添加到docker
组
sudo usermod -a -G docker $USER
然后我下载了 Ubuntu 19.04 容器
docker pull ubuntu:19.04
并试图跑apt update
进去
docker run -it ubuntu:19.04 apt update
但出现网络错误:
$ docker run -it ubuntu:19.04 apt update Err:1 http://archive.ubuntu.com/ubuntu disco InRelease Temporary failure resolving 'archive.ubuntu.com' Err:2 http://security.ubuntu.com/ubuntu disco-security InRelease Temporary failure resolving 'security.ubuntu.com' Err:3 http://archive.ubuntu.com/ubuntu disco-updates InRelease Temporary failure resolving 'archive.ubuntu.com' Err:4 http://archive.ubuntu.com/ubuntu disco-backports InRelease Temporary failure resolving 'archive.ubuntu.com' Reading package lists... Done Building dependency tree Reading state information... Done All packages are up to date. W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/disco/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/disco-updates/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/disco-backports/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/disco-security/InRelease Temporary failure resolving 'security.ubuntu.com' W: Some index files failed to download. They have been ignored, or old ones used instead.
内部/etc/resolv.conf
容器如下:
$ docker run -it ubuntu:19.04 cat /etc/resolv.conf # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 8.8.8.8 nameserver 8.8.4.4
主机系统有互联网,NetworkManager使用默认设置:
$ cat /etc/NetworkManager/NetworkManager.conf [main] plugins=ifupdown,keyfile,ofono dns=dnsmasq [ifupdown] managed=false
系统上的所有文件均保持不变 - 该debsums --changed --all --silent
命令未返回任何内容。
请求的输出iptables -S
如下:
$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
我应该更改哪些设置来修复 Docker 容器的 DNS(名称解析)?
笔记:
- 我知道如何禁用 DNS 伪装 (
#dns=dnsmasq
),但我不想使用此选项。 - 当我使用来自 docker.com 的 Docker-CE 时得到了相同的结果。
- 从 netinstall mini.iso 安装的系统不存在上述问题。它使用
ifupdown
。因此 NetworkManager 是此问题的根源。
答案1
解决方案docker run
非常简单 - 我们需要选择具有--network host
以下选项的主机网络:
docker run -it --network host ubuntu:19.04 apt update
那么问题就解决了。
但还应注意,docker build
只有--network
启动选项从 18.04 LTS 开始。因此,如果我们需要docker build --network host
16.04 LTS,我们需要使用docker-ce
来自 docker.com 的包。
答案2
在主机上,我运行sudo vim /etc/default/docker
并取消注释此行:
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
然后使用 重新启动 Docker sudo service docker restart
。
我是 Docker 的新手,不知道这些选项如何工作,但它似乎已经起到了作用!