Dockerコンテナー内にインターネット接続なし


24

Dockerコンテナー内でインターネット接続を必要とするコマンドを実行できません。

作品:

docker run ubuntu /bin/echo 'Hello world'

動作しません:

docker run ubuntu apt-get update

Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-security/InRelease  Temporary failure resolving 'archive.ubuntu.com'

pipおよびと同様pingです。

Ubuntu 16.04を使用していますが、ファイアウォールや企業のプロキシサーバーを使用していないため、Dockerを再起動しようとしました。

更新:

対話モードでの更新も同じ方法で失敗します。

docker exec -ti angry_goodall /bin/bash
apt-get update
#fails
ping google.com
#fails with "unknown host" message
ping 8.8.8.8 
# shows PING 8.8.8.8 (8.8.8.8): 56 data bytes
# and than hangs indefinetly

sudo apt-get update ホスト、つまり、ドッカーの外部のコンピューターで正常に実行されます。

Upd Dockerバージョン1.12.1、ビルド23cf638


ホストからドメインにpingを実行できますか?apt-get updateDockerでインタラクティブモードで実行できますか?
adampski

出力には次のエラーが表示されます。「archive.ubuntu.com」を解決する一時的なエラー... try .. ping www.google.com ..同じ応答が返されるかどうかを確認してください.. try ... ping 8.8.8.8 .. 。IPが機能し、ホスト名が機能しない場合、DNSが破損しています(使用されているDNSサーバーを確認するために/etc/resolv.confを追加してください)
TG2

@adampski、私はあなたの提案に基づいて質問を更新しました。
サシコリケンコ16年

@ TG2、私もあなたの提案に基づいて質問を更新しました。
サシコリケンコ16年

どのバージョンのdocker engineを実行していますか?
adampski

回答:


13

DockerのGitHub issue#866のきしみで示唆されているように

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

「Dockerにブリッジを再作成させ、すべてのネットワークルールを再初期化させる」


1
私はそれを試してみましたが、これは私のコンピューター全体のネットワークを殺します。
ペテルソーン

これは役に立ち、問題を解決しました。ありがとうございました。
ラオ

10
-dフラグは終了しません。
ルイスデスーサ

2
こんにちは@LuísdeSousaこれはあなたがこれに反対票を投じたのは残念ですが、新しいリリースではおそらくいくつかのスイッチが削除または変更される可能性を考慮してください。特に1年以上前からです。
adampski

3
コマンドをコピー/
ペースト

12

StackOverflowには Ubuntu 16.04のDocker 17.09で別のソリューションがこの問題を解決する同様の問題があります。

の内容を確認してくださいresolv.conf

$ cat /etc/resolv.conf

このような行が含まれているnameserver 127.0.1.1場合は、コンテナが誤ったネームサーバーを取得していることを意味します。これを修正するには、NetworkManager.confファイルを編集します。

$ sudo pico /etc/NetworkManager/NetworkManager.conf

そして、行をコメントアウトしdns=dnsmasqます; ファイルは次のようになります。

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

[ifupdown]
managed=false

最後に、ネットワークマネージャーを再起動します。

$ sudo systemctl restart network-manager

コンテナを再度テストします。

$ docker run ubuntu:16.04 apt-get update
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]

私のインストールは説明と一致し、上記のアプローチは問題を解決しました。
krcools

Ubuntu 18.04の更新された回答:superuser.com/a/1335054
wisbucky

7

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

2番目に確認するのは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がコンテナーにコピーするための有効なホストが必要になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.