以前は機能していたさまざまなファイルでDockerビルドを実行しようとしてきましたが、現在は機能していません。
Dockerファイルにソフトウェアをインストールする行が含まれるとすぐに、パッケージが見つからなかったというメッセージが表示されて失敗します。
RUN apt-get -y install supervisor nodejs npm
ログに表示される一般的なメッセージは
Could not resolve 'archive.ubuntu.com'
ソフトウェアがインストールされない理由は何ですか?
多くの頭痛の後、私は答えを見つけました。 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_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
コマンドは、「google.com」のテキストアドレスをIPアドレスに変換するために、DNSサーバー8.8.8.8を照会します。皮肉なことに、8.8.8.8は GoogleのパブリックDNSサーバー です。 nslookup
が失敗した場合、8.8.8.8などのパブリックDNSサーバーが会社によってブロックされる可能性があります(セキュリティ上の理由によると思われます)。
会社のDNSサーバーをDOCKER_OPTS
の/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
参照:
私は、ソリューションのすべての功績に値するロビンウィンスローの記事に基づいてソリューションを作成しました。ありがとう、ロビン!
「DockerのネットワークDNS設定を修正します。」ロビン・ウィンスロー。 2016年11月9日検索。 https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/
私は同じ問題に遭遇しましたが、コメントを外す/ etc/default/dockerdnsエントリも/ etcの編集もビルドコンテナ内の/resolv.confまたは/ etc/docker/daemon.jsonが役立ちます。
しかし、オプション--network = Hostを指定してビルドした後、解決は再びうまくいきました。
docker build --network=Host -t my-own-ubuntu-like-image .
たぶんこれは再び誰かを助けるでしょう。
マットキャリアの答え がこの問題の正しい解決策だと思います。しかし、それを実装した後、私はまだ同じ動作を観察しました: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
ファイルに追加することでした。
この問題も抱えている人のために、他の回答や質問で示唆されているように、/etc/default/docker
ファイルを編集して問題を解決しました。しかし、DNSとして使用するIPがわかりませんでした。
しばらくしてから、ホストで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
でした。これがこの問題を抱えている人の助けになることを願っています。
ローカルの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をビルドしてください... :)
検索エンジンからこの問題に出くわした人には、遅い応答を追加したかっただけです。
これをしないでください:以前はiptables=false
を設定するために/ etc/default/dockerにオプションがありました。これはufwが機能しなかったためです(3つのポートしか許可されていないにもかかわらずすべてが開かれたため)。私は盲目的にこの質問の答えに従いました: Uncomplicated Firewall(UFW)はDockerの使用時に何もブロックしません および this 、コメントにリンクされていました
一般的に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機能を再び有効にすることを楽しみにしています。
私は この答え を見つけました。私はWindowsを使用しているため、上記の回答の一部がファイルシステムに適用されませんでした。
基本的に実行:
docker-machine ssh default
echo "nameserver 8.8.8.8" > /etc/resolv.conf
8.8.8.8
で使用されている既存のネームサーバーを上書きするだけです。それは私のために働いた!
私は同じ問題を抱えており、記載されている手順を試しましたが、ネットワーク設定を更新するまで何も動作しないようです。
手順:
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"
を/etc/default/docker
に追加します。iptables -t nat -F POSTROUTING
を使用してPREROUTINGテーブルの内容を手動でフラッシュします。これを実行した後、Dockerを再起動すると、natテーブルが新しいIP範囲で初期化されます。私と同じ問題(Ubuntu Xenial上)。
docker run --dns ...
コンテナが機能しました。docker build
(docker-composeなど)のdockerデーモンオプションの更新は機能しませんでした。Dockerログ(journalctl -u docker.service
)を分析した後、不適切なresolvconfの適用に関する警告が見つかった場合。
それに続いて、企業のネームサーバーがネットワークインターフェイスに追加されましたが、resolvconfには追加されていないことがわかりました。
このソリューションを適用しました インターフェイスで静的DNSを構成するにはどうすればよいですか?(askubuntu) 、つまり/etc/resolvconf/resolv.conf.d/tail
にネームサーバーを追加します
Resolvconfの更新後(または再起動後)。
bash docker run --rm busybox nslookup google.com
すぐに働きました。
私のdocker-composeビルドはすべて動作しています。
今日同じ問題が発生しました。/etc/default/dockerに以下の行を追加しました
DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"
そしてラップトップを再起動しました。
私の場合、Dockerデーモンを再起動するだけでは不十分です。ラップトップを再起動して動作させる必要があります。
他のソリューションに時間をかけすぎる前に、単にDockerを再起動してくださいして、もう一度やり直してください。
Windows 10でDocker Desktop for Windowsを使用して、問題を解決しました。
私のシステム(macOS High Sierra 10.13.6
with Docker 2.1.0.1
)では、これは企業のプロキシが原因でした。
これを2つのステップで解決しました。
Preferences>Proxies
でプロキシ設定を手動で構成します同じ設定を~/.docker/config.json
内のconfig.jsonに追加します:
"proxies":
{
"default":
{
"httpProxy": "MYPROXY",
"httpsProxy": "MYPROXY",
"noProxy": "MYPROXYWHITELIST"
}
}