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
ウー、問題を解決する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
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つのオプションがあります。
Daemon.jsonにDNSサーバーをハードコーディングします。これは簡単ですが、DNSサーバーの変更が予想される場合は理想的ではありません。
ホストの/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.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
がホスト上にあるはずです。
私も経験した問題に付加価値を加えようとして、別の答えで:
私のネットワークはオフィス関連であり、コンテナーが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アドレスを指定できます。Sudo service network-manager restart
。Sudo service docker restart
を使用してdockerサービスを再起動します。コンテナを実行すると、たとえばapt-get update/upgrade
を実行できるようになります。
Docker official doc は、Dockerが使用するDNSサーバーを構成するための手段を提供します
編集するために/etc/default/docker
ファイルを開きます。
Sudo nano /etc/default/docker
Dockerの設定を追加します。
DOCKER_OPTS="--dns 8.8.8.8"
8.8.8.8
を192.168.1.1
などのローカルDNSサーバーに置き換えます。複数のDNSサーバーを指定することもできます。それらをスペースで区切ります。例:
--dns 8.8.8.8 --dns 192.168.1.1
警告:さまざまなネットワークに接続するラップトップでこれを行う場合は、パブリックDNSサーバーを選択してください。
PS:nm-tool
を使用してローカルホストDNSサーバーを確認できます
ファイルを保存して閉じます。
Dockerデーモンを再起動します。
Sudo service docker restart
あなたのエラーはここにあります:
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に責任があるわけではないということです。
Boot2dockerを使用しているときにここに来た他の読者のために、ここに私が修正した方法があります。実際、上記の答えは私に正しい方向を示しました。
基本的に、何らかの理由でboot2docker内のコンテナーがホスト名を解決できませんでした。
そのため、私はboot2dockerを再起動してコンテナーを開始しました。ホスト名が再び適切に解決できるようになりました。
ホスト上のネットワークが接続されているときにboot2dockerを起動するときに問題が発生したため、boot2dockerが起動して非稼働状態になったと思います。
Debian9でDockerデーモンを再起動します
service docker restart
接続とネットワークは正常に機能します
Windowsでも同じ問題が発生しました。このコマンドでうまくいきました:docker-machine restart