web-dev-qa-db-ja.com

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

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はホスト上、すなわちdockerの外にある私のコンピュータ上で正常に実行されます。

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

18
Sashko Lykhenko

Docker用のGitHub issue#866への 作成によって示唆されたように

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

「これにより、dockerはブリッジを再作成し、すべてのネットワークルールを再起動する必要があります」

7
adampski

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]
11
Luís de Sousa

最初に確認することは、 docker container 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.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がホスト上にあるはずです。

5
wisbucky