DockerコンテナーはUbuntu 14.04デスクトップホスト上のDNSを解決できません


48

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

ホストマシンでIPv6を無効にし、それでもすべてのイメージを削除し、ベースの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の更新が失敗します。

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  

私にとっては、再起動後に機能しました。
ssi-anik

回答:


63

うーん、私の問題を解決したgithubの投稿を見つけました。

それが実際にはDNSの問題ではなく、接続の問題であるとSteve K.が指摘した後、この問題を修正する方法を説明した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

1
画像を作り直す必要はありません。resolv.confは、新しいコンテナを実行するたびに生成されます。そのため、古いコンテナを削除して別のコンテナを起動する必要があります。昨日この問題に悩まされました。また、企業イントラネットにいる場合、-dns --dnsフラグの近くにあるDOCKER_OPTS env変数の/ etc / default / dockerのdockerデーモンに--dns-search = your.company.domainを渡すことができます。
Alexander.Iljushkin

これにより、ドッカーの問題も修正されました。
BobMcGee

3
Arch Linux ip link set down docker0では、の代わりにifconfig docker0 downとのsystemctl restart docker代わりに必要でしたservice docker start。すべての画像を削除するには、私はなかったdocker rmi $(docker images -q)
網細工の

それは私にとって初めて働いた。その後、再起動すると問題が再発しました。これらの手順を再現しても問題は解決しませんでした。これが何なのか分かりません。
user626921

1
私docker0インターフェイスがダウンしていただけで見たと、私は実行/etc/init.d/docker restartし、それがビジネスに背中
lolesque

14

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

最初に確認するのcat /etc/resolv.confは、Dockerコンテナで実行することです。のような無効なDNSサーバーがある場合nameserver 127.0.x.x、コンテナはドメイン名を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.confからの値が読み込まれますdaemon.json


2.ホストの修正 /etc/resolv.conf

A. Ubuntu 16.04およびそれ以前

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

  • の行を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ではデフォルトで(127.0.0.53)ls -l /etc/resolv.confを指すシンボリックリンク()/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

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


ありがとう 18.04の/etc/resolv.confを修正してくれました!
ジョージパパス

オプションBは私のために働いた
.-- codeSetter

確かに2Bはsystemdパッケージの更新に耐えられません...
Auspex

13

私も経験した問題に価値を追加しようと試みました。別の答え:

私のネットワークはオフィス関連であり、コンテナがドメイン名ではなくIPアドレスに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サーバーの詳細の何らかの種類のマスキングを行っているためです。

残念ながら、ドッカーのマニュアルによると、ドッカーはコンテナーのresolv.confを構築する際にローカルホストのIPアドレスをフィルターで除外し、GoogleのDNS IPに置き換えます。私の場合、これによりドメイン名が立ち入り禁止になりました。

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

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

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


3
これは実際に私のために働いた。そして、私は会社のイントラネットの背後にいた
ダニエルアンドレイミンカ

1
このソリューションは、Ubuntu 16.04以前に最適です。Ubuntuの18.04以降では、参照serverfault.com/a/918568
wisbucky

ありがとう!これは機能しましたが、受け入れられた答えは機能しませんでした。:)
デボラス

8

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

 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にヒットするのは不運でした。)

miredoインストールして修正するか、IPv4ミラーがヒットするまで再試行する必要があります。

繰り返しますが、ここで気づく重要なことは、独自のpingテストでわかるように、DNSのせいではないということです。


1
迅速な返信と、それが実際にはDNSの問題ではないことを明確にしていただき、ありがとうございます。miredoをインストールしました。また、apt-get update -o Acquire :: ForceIPv4 = trueを実行したときに、apt-get updateがまだ失敗した場合、元の投稿をその返信で更新したことにも注意してください。私はUFWを無効にしてみましたが、それは事実であり、まだ運がなかったと考えています。
トーマスV. 14年

奇妙な-pingが成功するため、IPv4接続があることがわかります。ただし、奇妙なルーティング/ネットワークの問題があることを示唆しているにもかかわらず、ミラーに接続することはできません(ここに投稿している理由だと思います!)

8

Docker公式ドキュメントは、Dockerが使用するDNSサーバーを設定するための手段を提供します

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

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

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

    --dns 8.8.8.8 --dns 192.168.1.1
    

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

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

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

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

    sudo service docker restart
    

これはDocker UpstartおよびSysVinitの古い構成ファイルであることに注意してください。systemdの現在の方法(Ubuntu 16.04以降)は、dnsなどの/etc/docker/daemon.jsondockerデーモン設定に使用することです
ウィスバッキー

0

boot2dockerの使用中にここに来た他の読者のために、ここで修正しました。実際、上記の答えは私を正しい方向に向けさせました。

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

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

ホスト上のネットワークが接続されている間に問題がboot2dockerを開始していたため、boot2dockerが起動し、非動作状態になったと思われます。


0

Windowsでも同じ問題が発生しました。このコマンドは私のためにそれを機能させました:docker-machine restart


0

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

service docker restart

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


-1

同様の問題がありましたが、ユーザー定義ネットワーク内のコンテナー間の名前解決も少し不安定でした。あなたのようなものを解決できなかった人もいました。

問題は、/ var / lib / dockerの移動です。スペース上の理由から、nfs経由でマウントされました。ローカルファイルシステムを追加し、そこにファイルを移動すると、問題が解決します。


質問が同様の質問の回答で回答できると思われる場合は、その質問の複製としてマークしてください。それができない場合は、個別の回答にするのではなく、コメントを残す必要があります。
ジェニーDは、モニカを復活させる
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.