web-dev-qa-db-ja.com

Dockerコンテナーからの名前解決を修正する正しい方法は何ですか?

クリーンな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(名前解決)を修正するには、どの設定を変更する必要がありますか?

ノート:

  1. DNSマスカレード(#dns=dnsmasq)の無効化について知っていますが、このオプションを使用したくありません。
  2. Docker.comからDocker-CEを使用しても同じ結果が得られました。
  3. Netinstall mini.isoからインストールされたシステムは、前述の問題の影響を受けません。 ifupdownを使用します。したがって、NetworkManagerがこの問題の原因です。
1
N0rbert

docker runのソリューションは非常に簡単です。--network Hostオプションを使用してホストネットワークを選択する必要があります。

docker run -it --network Host ubuntu:19.04 apt update

そして、問題は解決されます。


ただし、docker buildには--networkオプションのみが 18.04 LTSから のみで始まることにも注意してください。したがって、16.04 LTSでdocker build --network Hostが必要な場合は、docker.comのdocker-ceパッケージを使用する必要があります。

0
N0rbert