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
Docker用のGitHub issue#866への 作成によって示唆されたように :
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d
「これにより、dockerはブリッジを再作成し、すべてのネットワークルールを再起動する必要があります」
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]
最初に確認することは、 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つの選択肢があります。
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
がホスト上にあるはずです。