回答:
コメント解除DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
に/etc/default/docker
とマット・キャリアがなかった提案しないで私のために働きます。私の会社のDNSサーバーをそのファイルに入れることもしませんでした。しかし、別の方法があります(以下をお読みください)。
まず、問題を確認しましょう。
$ docker run --rm busybox nslookup google.com # takes a long time
nslookup: can't resolve 'google.com' # <--- appears after a long time
Server: 8.8.8.8
Address 1: 8.8.8.8
コマンドがハングしているように見えても、最終的に「 'google.com'を解決できません」というエラーが表示される場合は、私と同じ問題があります。
nslookup
コマンドは、IPアドレスに「google.com」のテキストアドレスを有効にするために、DNSサーバ8.8.8.8を照会します。皮肉なことに、8.8.8.8はGoogleのパブリックDNSサーバーです。場合はnslookup
失敗し、8.8.8.8などのパブリックDNSサーバーは、あなたの会社によってブロックされる可能性があります(私はセキュリティ上の理由であると仮定します)。
会社のDNSサーバーをDOCKER_OPTS
inに追加するとうまくいくと思います/etc/default/docker
が、なんらかの理由で私にはうまくいきませんでした。以下で、私にとって何が効果的かを説明します。
ソリューション:
ホスト(Ubuntu 16.04を使用しています)で、プライマリおよびセカンダリDNSサーバーのアドレスを確認します。
$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]: 10.0.0.2
IP4.DNS[2]: 10.0.0.3
これらのアドレスを使用して、ファイルを作成します/etc/docker/daemon.json
。
$ sudo su root
# cd /etc/docker
# touch daemon.json
これを入れてください/etc/docker/daemon.json
:
{
"dns": ["10.0.0.2", "10.0.0.3"]
}
ルートを終了:
# exit
Dockerを再起動します。
$ sudo service docker restart
検証:
次に、/etc/docker/daemon.json
ファイルを追加して、「google.com」をIPアドレスに解決できることを確認します。
$ docker run --rm busybox nslookup google.com
Server: 10.0.0.2
Address 1: 10.0.0.2
Name: google.com
Address 1: 2a00:1450:4009:811::200e lhr26s02-in-x200e.1e100.net
Address 2: 216.58.198.174 lhr25s10-in-f14.1e100.net
参照:
私は私のソリューションをRobin Winslowの記事に基づいています。ありがとう、ロビン!
「DockerのネットワークDNS構成を修正してください。」ロビン・ウィンスロー。2016年11月9日取得。https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/
nslookup google.com 8.8.8.8
私の場合はそうですので私はこのエラーをconnection timed out; no servers could be reached
/etc/default/docker
一部の人にとってうまくいかなかった理由は(ファイルからのコメントを引用して)いると思います# THIS FILE DOES NOT APPLY TO SYSTEMD
多くの頭痛の後、私は答えを見つけました。Could not resolve 'archive.ubuntu.com'
次の変更を行うことで修正できます。
次の行のコメントを外します /etc/default/docker
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
Dockerサービスを再起動します
sudo service docker restart
無効なDNS設定をキャッシュした画像をすべて削除します。
クレジットはAndrew SBに送られます
docker build --no-cache=true ...
docker build --no-cache=true -t docker-whale .
が何も変わっていないようだ。
同じ問題が発生しましたが、/ etc / default / docker dnsエントリのコメントを外さないようにするか、ビルドコンテナの/etc/resolv.confを編集しないと、/ etc / docker / daemon.jsonが役立ちます。
しかし、オプション--network = hostでビルドした後、解決は再びうまくいきました。
docker build --network=host -t my-own-ubuntu-like-image .
多分これは誰かを再び助けるでしょう。
Matt Carrierの答えがこの問題の正しい解決策であると思います。しかし、それを実装した後も、同じ動作が観察されました。could not resolve 'archive.ubuntu.com'
。
その結果、私が接続していたネットワークがパブリックDNSをブロックしていることがわかりました。この問題の解決策は、私のホスト(Dockerを実行していたマシン)が使用していたのと同じネームサーバーを使用するようにDockerコンテナーを構成することでした。
私がトリアージした方法:
docker run -it docker/whalesay bash
ping 172.217.4.238
:(google.com)ping google.com
私の場合、最初のping
結果は応答になり、2番目は応答しませんでした。
修正方法:
DNSがコンテナー内で機能していないことがわかったら、同じ動作をホストで再現できることを確認しました。nslookup google.com
ホスト上でうまく解決しました。しかし、nslookup google.com 8.8.8.8
またはnsloookup google.com 8.8.4.4
タイムアウトしました。
次に、nm-tool
(Ubuntu 14.04で)を実行して、ホストが使用していたネームサーバーを見つけました。高速フィードバックの流れで、サンプルイメージを再度起動し、ネームサーバーのIPアドレスをコンテナのresolv.confファイルに追加しましたsudo vi /etc/resolv.conf
。保存したら、もう一度pingを試行(ping google.com
)し、今回は正常に機能しました。
コンテナのresolv.confに加えられた変更は永続的ではなく、コンテナを再起動すると失われることに注意してください。私の場合、より適切な解決策は、ネットワークのネームサーバーのIPアドレスをホストの/etc/default/docker
ファイルに追加することでした。
nmcli device show <interfacename> | grep IP4.DNS
(Ubuntu> = 15)およびnmcli dev list iface <interfacename> | grep IP4
(Ubuntu <15)。クレジット:Marty Fried。
ローカルのDNS IPをデフォルトのDockerファイルに追加した後、動作し始めました...以下の手順を見つけてください...
$ nm-tool # (will give you the dns IP)
DNS:172.168.7.2
$ vim /etc/default/docker # (uncomment the DOCKER_OPTS and add DNS IP)
DOCKER_OPTS="--dns 172.168.7.2 --dns 8.8.8.8 --dns 8.8.4.4"
$ rm `docker ps --no-trunc -aq` # (remove all the containers to avoid DNS cache)
$ docker rmi $(docker images -q) # (remove all the images)
$ service docker restart #(restart the docker to pick up dns setting)
次に、Dockerをビルドします... :)
この問題も抱えている人のために、私は編集して私の問題を解決しました /etc/default/docker
他の回答や質問で提案されているようにファイルを。しかし、どのIPをDNSとして使用するのか私にはわかりませんでした。
しばらくifconfig docker
して、DockerネットワークインターフェイスのIPを表示するためにホストで実行する必要があることがわかりました。
docker0 Link encap:Ethernet Endereço de HW 02:42:69:ba:b4:07
inet end.: 172.17.0.1 Bcast:0.0.0.0 Masc:255.255.0.0
endereço inet6: fe80::42:69ff:feba:b407/64 Escopo:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1
pacotes RX:8433 erros:0 descartados:0 excesso:0 quadro:0
Pacotes TX:9876 erros:0 descartados:0 excesso:0 portadora:0
colisões:0 txqueuelen:0
RX bytes:484195 (484.1 KB) TX bytes:24564528 (24.5 MB)
それは172.17.0.1
私の場合でした。これがこの問題を抱えている人を助けることを願っています。
ifconfig docker0
私はいくつかのグーグルの後でこの答えを見つけました。私はWindowsを使用しているため、上記の回答の一部がファイルシステムに適用されませんでした。
基本的に実行します:
docker-machine ssh default
echo "nameserver 8.8.8.8" > /etc/resolv.conf
8.8.8.8
私が使用している既存のネームサーバーを上書きするだけだと思います。それは私のために働いた!
いくつかのコメントに基づいて、あなたはrootになる必要があるかもしれません。そのためには、を発行しsudo -i
ます。
ssh
機能しませんでした。存在しないためです。
sudo -i
あなたがしている一度
私は、検索エンジンからこの問題に遭遇した人のために遅い応答を追加したかっただけです。
これを行わないでください:以前は/ etc / default / dockerにsetのオプションがありましたiptables=false
。これはufwが機能しなかったため(3つのポートしか許可されていなくてもすべてが開かれていた)、私はこの質問への答えを盲目的に追跡しました:DockerとこれにリンクされているDockerを使用すると、Uncomplicated Firewall(UFW)は何もブロックしていませんコメント
一般にiptablesのルール、NAT、ルーティングに関する理解が低いため、なぜ不合理なことをしたのでしょうか。
私はおそらくそれを誤って設定し、私のコンテナー内のDNS解決を強制終了したことがわかります。インタラクティブなコンテナターミナルを実行したとき:docker run -i -t ubuntu:14.04 /bin/bash
私はこれらの結果を得ました:
root@6b0d832700db:/# ping google.com
ping: unknown host google.com
root@6b0d832700db:/# cat /etc/resolv.conf
search online.net
nameserver 8.8.8.8
nameserver 8.8.4.4
root@6b0d832700db:/# 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=56 time=1.76 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=1.72 ms
すべてのufw設定(before.rules)を元に戻し、ufwを無効にし、/ etc / default / dockerからiptables = falseを削除すると、コンテナーのDNS解決機能が復元されました。
代わりに、次の手順に従って ufw機能を再度有効にすることを楽しみにしています。
私にとっても同じ問題(Ubuntu Xenial上)。
docker run --dns ...
コンテナが働いた。 docker build
(docker-composeなど)のDockerデーモンオプションの更新が機能しませんでした。journalctl -u docker.service
不良なresolvconfに関する警告が適用された場合、Dockerログを分析した後()。
その後、私は企業のネームサーバーがネットワークインターフェースに追加されているが、resolvconfには追加されていないことを発見しました。
このソリューションを適用するインターフェイスで静的DNSを構成するにはどうすればよいですか?(askubuntu)、つまりネームサーバーの追加/etc/resolvconf/resolv.conf.d/tail
resolvconfを更新した後(または再起動した後)。
bash
docker run --rm busybox nslookup google.com
即座に働いた。
私のdocker-composeビルドはすべて動作しています。
私もこれとしばらくの間苦労してきましたが、ここでそれが私のためにそれを解決したものですUbuntu 16.04 x64
。私もそれが誰かの時間を節約することを望みます。
で/etc/NetworkManager/NetworkManager.conf
:コメントアウト
#dns=dnsmasq
作成(または変更)/etc/docker/daemon.json
:
{
"dns": ["8.8.8.8"]
}
sudo service docker restart
newgrp docker
完全なログオフを実行する代わりに問題が発生した場合にのみ、新しいdocker installを使用してLinuxラップトップで発生し ますsudo usermod -aG docker myuserid
...確かにそれは起こります