从 Docker 容器修复名称解析的正确方法是什么?

N0r*_*ert 3 networking dns container docker 16.04

我安装了干净的 Ubuntu MATE 16.04.6 LTS。
我从这里的存储库安装了 Docker:

sudo apt-get install docker.io
Run Code Online (Sandbox Code Playgroud)

并将我的用户添加到docker

sudo usermod -a -G docker $USER
Run Code Online (Sandbox Code Playgroud)

然后我下载了 Ubuntu 19.04 容器

docker pull ubuntu:19.04
Run Code Online (Sandbox Code Playgroud)

并试图在apt update里面跑

docker run -it ubuntu:19.04 apt update
Run Code Online (Sandbox Code Playgroud)

但遇到网络错误:

$ 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.
Run Code Online (Sandbox Code Playgroud)

/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
Run Code Online (Sandbox Code Playgroud)

主机系统有互联网,NetworkManager 使用默认设置:

$ cat /etc/NetworkManager/NetworkManager.conf 
[main]
plugins=ifupdown,keyfile,ofono
dns=dnsmasq

[ifupdown]
managed=false
Run Code Online (Sandbox Code Playgroud)

系统上的所有文件都保持不变 - 该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
Run Code Online (Sandbox Code Playgroud)

我应该更改哪些设置以从 Docker 容器修复 DNS(名称解析)?

笔记:

  1. 我知道禁用 DNS 伪装 ( #dns=dnsmasq),但我不想使用此选项。
  2. 我在 docker.com 上使用 Docker-CE 时得到了相同的结果。
  3. 从 netinstall mini.iso 安装的系统不会遇到上述问题。它使用ifupdown. 所以 NetworkManager 是这个问题的根源。

N0r*_*ert 5

的解决方案docker run非常简单 - 我们需要选择带有--network host选项的主机网络:

docker run -it --network host ubuntu:19.04 apt update
Run Code Online (Sandbox Code Playgroud)

然后问题就解决了。


但同时也应该注意到,docker build--network选项仅只是开始,从18.04 LTS。所以如果我们需要docker build --network host16.04 LTS,我们需要使用docker-ce来自 docker.com 的包。

  • 虽然这确实有效,但您不需要_需要_绑定到主机的网络才能执行 DNS 查找。 (2认同)