web-dev-qa-db-ja.com

DockerコンテナがUbuntu 14.04デスクトップホストでDNSを解決できない

Ubuntu 14.04 LTSのDockerコンテナーで問題が発生しています。 Dockerが2日間問題なく動作した後、突然、コンテナー内のすべてのネットワーク接続が失われました。以下のエラー出力は、apt-getがIPv6を介してDNSを解決しようとしているためであると最初に思った。

ホストマシンでIPv6を無効にしましたが、それでもすべてのイメージを削除し、base ubuntuをプルしましたが、それでも問題が発生しました。

/etc/resolve.confネームサーバーをローカルDNSサーバーからGoogleのパブリックDNSサーバー(8.8.8.8および8.8.4.4)に変更しましたが、まだうまくいきません。/etc/default/dockerのDOCKER_OPTSでDNSをGoogleに設定し、dockerを再起動しました。

また、coreosをプルしてみましたが、yumはDNSも解決できませんでした。

DNSは機能しませんが、apt-getで解決できない同じ更新サーバーにpingを実行すると、まだ応答が返されるので奇妙です。

私はプロキシの背後にいるのではなく、非常に標準的なローカルネットワークを使用しています。このバージョンのUbuntuは最新であり、最新のものです(2日前にインストールしてdockerに近づけました)。

私は、stackoverflowとgithubの問題に関する他の投稿を通じてこれを徹底的に調査しましたが、解決策は見つかりませんでした。私はこの問題を解決する方法についてアイデアがありません、誰か助けてもらえますか?

エラーメッセージ

➜  arthouse git:(docker) ✗ docker build --no-cache .
Sending build context to Docker daemon 51.03 MB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:14.04
 ---> 5506de2b643b
Step 1 : RUN apt-get update
 ---> Running in 845ae6abd1e0
Err http://archive.ubuntu.com trusty InRelease
Err http://archive.ubuntu.com trusty-updates InRelease
Err http://archive.ubuntu.com trusty-security InRelease   
Err http://archive.ubuntu.com trusty-proposed InRelease  
Err http://archive.ubuntu.com trusty Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Some index files failed to download. They have been ignored, or old ones used instead.

コンテナIFCONFIG/PING

➜  code  docker run -it ubuntu /bin/bash
root@7bc182bf87bb:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:04  
          inet addr:172.17.0.4  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:4/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:738 (738.0 B)  TX bytes:648 (648.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@7bc182bf87bb:/# ping google.com
PING google.com (74.125.226.0) 56(84) bytes of data.
64 bytes from lga15s42-in-f0.1e100.net (74.125.226.0): icmp_seq=1 ttl=56 time=12.3 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 12.367/12.367/12.367/0.000 ms
root@7bc182bf87bb:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=21.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=21.7 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=21.7 ms

また、IPv4を強制するとapt-get updateが失敗します。

root@6d925cdf84ad:/# Sudo apt-get update -o Acquire::ForceIPv4=true
Err http://archive.ubuntu.com trusty InRelease

Err http://archive.ubuntu.com trusty-updates InRelease

Err http://archive.ubuntu.com trusty-security InRelease

Err http://archive.ubuntu.com trusty-proposed InRelease

Err http://archive.ubuntu.com trusty Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Reading package lists... Done
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  
51
Thomas V.

ウー、問題を解決するgithubの投稿を見つけました。

Steve K.が実際にはDNSの問題ではなく接続の問題であると指摘した後、この問題の修正方法を説明する githubへの投稿 を見つけることができました。

どうやらdocker0ネットワークブリッジがハングアップしました。 bridge-utilsをインストールして以下を実行すると、Dockerが正常に機能します。

apt-get install bridge-utils
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
service docker restart
66
Thomas V.

DNSリゾルバーの問題である場合、解決策は次のとおりです。

最初に確認することは、dockerコンテナcat /etc/resolv.confを実行することです。 nameserver 127.0.x.xなどの無効なDNSサーバーがある場合、コンテナはドメイン名をIPアドレスに解決できないため、ping google.comは失敗します。

次に確認することは、ホストマシンcat /etc/resolv.confを実行することです。 Dockerは基本的に、コンテナーが起動されるたびにホストの/etc/resolv.confをコンテナーにコピーします。したがって、ホストの/etc/resolv.confが間違っている場合、Dockerコンテナも間違っています。

ホストの/etc/resolv.confが間違っていることがわかった場合、2つのオプションがあります。

  1. Daemon.jsonにDNSサーバーをハードコーディングします。これは簡単ですが、DNSサーバーの変更が予想される場合は理想的ではありません。

  2. ホストの/etc/resolv.confを修正します。これは少しトリッキーですが、動的に生成され、DNSサーバーをハードコーディングしていません。


1。 docker daemon.jsonのDNSサーバーをハードコードする

  • 編集/etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • これらの変更を有効にするには、Dockerデーモンを再起動します。
    Sudo systemctl restart docker

  • コンテナを実行/開始すると、Dockerは/etc/resolv.confdaemon.jsonの値を入力します。


2。ホストの/etc/resolv.confを修正します

A。 Ubuntu 16.04以前

  • Ubuntu 16.04以前の場合、/etc/resolv.confはNetworkManagerによって動的に生成されました。

  • dns=dnsmasqの行#/etc/NetworkManager/NetworkManager.conf付き)をコメント化します。

  • NetworkManagerを再起動して/etc/resolv.confを再生成します。
    Sudo systemctl restart network-manager

  • ホストで確認:cat /etc/resolv.conf

B。 Ubuntu 18.04以降

  • Ubuntu 18.04は、 systemd-resolvedを使用して/etc/resolv.conf を生成するように変更されました。現在、デフォルトでローカルDNSキャッシュ127.0.0.53を使用しています。これはコンテナ内では機能しないため、DockerはデフォルトでGoogleの8.8.8.8 DNSサーバーを使用します。これは、ファイアウォールの背後にいる人々のために機能しなくなる可能性があります。

  • /etc/resolv.confは、Ubuntu 18.04ではデフォルトでls -l /etc/resolv.conf(127.0.0.53)を指すシンボリックリンク(/run/systemd/resolve/stub-resolv.conf)です。

  • シンボリックリンクを/run/systemd/resolve/resolv.confを指すように変更するだけで、実際のDNSサーバーが一覧表示されます。
    Sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • ホストで確認:cat /etc/resolv.conf

これで、Dockerがコンテナーにコピーするための有効な/etc/resolv.confがホスト上にあるはずです。

16
wisbucky

私も経験した問題に付加価値を加えようとして、別の答えで:

私のネットワークはオフィス関連であり、コンテナーがIPアドレスをpingできるがドメイン名はpingできないように、Google DNS設定がブロックされました。

私のホストの/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 127.0.1.1
search companyDomain.co.za

これは、Network ManagerがDNSサーバー詳細のある種のマスキングを行っているためです。

残念ながら docker manuals によれば、dockerはコンテナーのresolv.confを構築するときにlocalhost IPアドレスを除外し、GoogleのDNS IPで置き換えます。私の場合、ドメイン名が立入禁止になりました。

そうしなければならなかった:

  • /etc/default/dockerをデフォルトにリセットして、コンテナがホストのresolv.confコンテンツを代わりに使用するようにします。
  • /etc/NetworkManager/NetworManager.confを編集して、行dns=dnsmasqをコメント化します。 NMは、127.0.0.1の代わりに実際のDNS IPアドレスを指定できます。
  • 再起動NM with Sudo service network-manager restart
  • Sudo service docker restartを使用してdockerサービスを再起動します。

コンテナを実行すると、たとえばapt-get update/upgradeを実行できるようになります。

Docker official doc は、Dockerが使用するDNSサーバーを構成するための手段を提供します

  1. 編集するために/etc/default/dockerファイルを開きます。

    Sudo nano /etc/default/docker
    
  2. Dockerの設定を追加します。

    DOCKER_OPTS="--dns 8.8.8.8"
    
  3. 8.8.8.8192.168.1.1などのローカルDNSサーバーに置き換えます。複数のDNSサーバーを指定することもできます。それらをスペースで区切ります。例:

    --dns 8.8.8.8 --dns 192.168.1.1
    

    警告:さまざまなネットワークに接続するラップトップでこれを行う場合は、パブリックDNSサーバーを選択してください。

    PS:nm-toolを使用してローカルホストDNSサーバーを確認できます

  4. ファイルを保存して閉じます。

  5. Dockerデーモンを再起動します。

    Sudo service docker restart
    
8
tryer3000

あなたのエラーはここにあります:

 Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19).
 connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]

これはDNSのエラーではなく、システムがIPv6ホストに接続しようとして失敗しています。おそらくあなたはあなたのホストにIPv6アクセスを持っていないからです。 IPv6アドレスの実際の検索は成功します。 (ubuntuミラー/アーカイブはIPv6とIPv4の両方で使用できます。システムが機能するはずであるとシステムが信じているため、IPv6にヒットするのは不運でした。)

installing miredo で修正するか、IPv4ミラーに到達するまで再試行する必要があります。

繰り返しになりますが、ここで理解しておくべき重要なことは、独自のpingテストでわかるように、DNSに責任があるわけではないということです。

8
user9565

Boot2dockerを使用しているときにここに来た他の読者のために、ここに私が修正した方法があります。実際、上記の答えは私に正しい方向を示しました。

基本的に、何らかの理由でboot2docker内のコンテナーがホスト名を解決できませんでした。

そのため、私はboot2dockerを再起動してコンテナーを開始しました。ホスト名が再び適切に解決できるようになりました。

ホスト上のネットワークが接続されているときにboot2dockerを起動するときに問題が発生したため、boot2dockerが起動して非稼働状態になったと思います。

0
Eye

Debian9でDockerデーモンを再起動します

service docker restart

接続とネットワークは正常に機能します

0
Nolwennig

Windowsでも同じ問題が発生しました。このコマンドでうまくいきました:docker-machine restart

0
speedplane