web-dev-qa-db-ja.com

docker.io DNSが機能せず、8.8.8.8を使用しようとしています

Ubuntu 14.04を新しくインストールし、Dockerを使用して12.04が必要な古いものを実行したい。 Docker内のDNSは機能しません。

私のラップトップのresolv.confは次のようになります。

nameserver 127.0.0.1

明らかに、Dockerでは機能しません。したがって、ネームサーバーを8.8.8.8および8.8.4.4に設定しようとします。私がする時

$ Sudo docker run -i -t ubuntu /bin/bash

それは言います:

WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]

確かに、Dockerインスタンス内では、resolv.confは次のようになります。

nameserver 8.8.8.8
nameserver 8.8.4.4

Dockerインスタンス内からこれらの両方に正常にpingできます。ただし、DNSはありません(たとえば、ping google.comが失敗します)。

docker内のifconfig出力:

eth0      Link encap:Ethernet  HWaddr aa:e9:9f:83:9d:92  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::a8e9:9fff:fe83:9d92/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:648 (648.0 B)  TX bytes:738 (738.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

それで?

32
RemcoGerlich

Ubuntu Dockerパッケージがsystemdを使用するように更新されたときに、/etc/default/docker構成ファイルのサポートが削除されたため、初期ソリューション rocketman10404で推奨 は機能しなくなります(dnsmasqを無効にしても動作しますが、UbuntuがDNSサーバーを自動的に更新できないという欠点があります)。

新しいdaemon.json構成ファイルの修正

ネットワークのDNSサーバーを見つけます。

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:                             10.0.0.2

存在しない場合は/etc/docker/daemon.jsonを開くか作成し、ExecStart行にDNS設定を追加します。

# /etc/docker/daemon.json
{
    "dns": ["10.0.0.2", "8.8.8.8"]
}

Dockerデーモンを再起動します。

$ Sudo service docker restart

私は 詳細なブログ記事 を書き、さらに バグを提出した についてもっと詳しく知りたい場合はこの問題について書きました。

(もともと私はそれを解決しました /lib/systemd/system/docker.serviceを開き、ExecStart行にDNS設定を追加します、しかしそれは悪いです-私たち systemdファイルを直接編集するべきではありません 。)

22
Robin Winslow

私は自分でdockerを使用していないので、通常はdockerの質問についてはここに突き当たりませんが、たまたまそれについて読んでいて、いくつかのdockerのドキュメントにつまずきました この正確な問題に対処します 。総括する...

ドキュメントでは、いくつかの回避策が提案されています。最初の方法は、/etc/default/dockerに次の行を追加して、コンテナのdockerデーモンが使用するDNSサーバーを指定することです。

docker_OPTS="--dns 8.8.8.8"

提供されるDNSは、192.168.1.1(ゲートウェイ)などのローカルDNSサーバーにすることができます。次に、で再起動します

Sudo restart docker

別の解決策は、次のように/etc/NetworkManager/NetworkManager.confの設定をコメントアウトすることにより、NetworkManagerでdnsmasqを無効にすることです。

#dns=dnsmasq

その後、両方を再起動します

Sudo restart network-manager
Sudo restart docker
15
rocketman10404

具体的には私の状況でこれに遭遇しました

  • ローカル開発マシンでDockerコンテナーを実行する
  • VPNに接続されているもの
  • コンテナ構築スクリプトのいくつかは、カスタムリポジトリからnpm installを実行するなどのことを行いますVPN上、コンテナ内。
    • npmはDNSルックアップを正常に実行できないため、これはCIパイプラインから機能しますが、開発者のマシンからは機能しません。
    • また、外部REST AP​​Iを呼び出すためにルックアップを行う必要のあるコンテナにも問題がありました。

UbuntuはデフォルトでNetworkManagerによって起動されたdnsmasqを使用してDNS要求をキャッシュし、/etc/resolv.conf127.0.1.1上のこのインスタンスを指すように設定します

  • 使用しているVPNクライアントはNetworkManagerに対応しておらず、NetworkManagerの設定を上書きする/etc/resolv.confを強制します
  • これにより、VPNのDNSサーバーが構成されます
  • Dockerは/etc/resolv.confをデフォルトでコンテナにシャドウします
    • 通常、Ubuntuでは、dnsmasq状況を認識しているため、Google DNSサーバーをコンテナに渡します。
    • しかし、VPN DNSサーバーの設定をコンテナに渡すことは幸せです
    • docker0ネットワークブリッジ上のコンテナから、VPN tap0アダプタを介したDNSサーバーへのルートはありません。
  • エルゴ、コンテナ内のすべてのDNSルックアップは、提供されたDNSサーバーにしか到達できないため失敗します。
  • また、一部のネットワークは、すべてのDNSルックアップをスヌープできるようにするため、Google DNSサーバーへのリクエストをブロックします

ソリューション :

NetworkManagerを使用する方がよりエレガントで、設計された方法でキャプティブdnsmasqインスタンスになります。

  1. DNSにdnsmasqインスタンスを使用するようにDockerに指示します

    • ファイル/etc/docker/daemon.jsonを追加または編集して、DNSにdocker0ブリッジアダプターを使用するようにdockerに指示します

      {
        "dns": ["172.17.0.1"]
      }
      
  2. デフォルトでは127.0.1.1のみをリッスンするため、NM dnsmasqインスタンスもDockerブリッジをリッスンするように構成します-ファイル/etc/NetworkManager/dnsmasq.d/docker-bridge.confを作成します

    # Default Docker bridge
    interface=docker0
    # Other Docker bridges
    interface=br-*
    
  3. 私はそのVPNクライアントの失礼な振る舞いが好きではなく、VPNルックアップにVPNエンドでDNSを使用するだけです(正しく設定されたNetworkManagerを使用するポライトVPNクライアントがある場合、これを行う必要はありません)

    • VPNクライアントのDNS機能をオフにします(接続時にresolv.confの上書きを停止し、すべてのDNSが再びdnsmasqを通過します)
    • dnsmasqにドメインのDNSリクエストを適切に送信するように設定ファイルを追加します-ファイル `/etc/NetworkManager/dnsmasq.d/vpn-dns.confを追加します

      server=/myprivatedomain.net/10.0.0.1  
      # or whatever your private DNS server is
      
    • オプションで、ドメインの検索ドメインを追加して、短い名前を使用できるようにします

      • デフォルトのネットワーク接続の検索リストにローカルドメインを追加しました
  4. NetworkManagerとDockerを再起動します

    Sudo service network-manager restart
    Sudo service docker restart
    

この時点で、Dockerコンテナは、VPNの内側と外側の両方のドメインで、VPNを使用しているときに問題なくnslookupを実行できるはずです。

9
Adrian

ここでは、ヘッドレスを実行しているUbuntu 14.04サーバーでdockerをセットアップする方法を示します。

次のdockerバージョンがインストールされたUbuntuサーバー14.04を実行しています。

#docker version
Client version: 0.9.1
Go version (client): go1.2.1
Git commit (client): 3600720
Server version: 0.9.1
Git commit (server): 3600720
Go version (server): go1.2.1

ファイル/etc/init/docker.io.confおよびスクリプトには、次の行が含まれています。

# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
    DOCKER=/usr/bin/$UPSTART_JOB
    DOCKER_OPTS=

上記の答えは、上記のファイルを見つけるのに役立ちました。

/etc/default/docker.ioで以下のコメントを外し、ローカルDNSサーバーを追加しました。

# Use DOCKER_OPTS to modify the daemon startup options.  
DOCKER_OPTS="--dns 192.168.X.X"

次を使用してサービスを再起動しました。

Sudo service docker.io restart

Ran docker run <image> /bin/bash

コンテナの起動時にDNSメッセージはありません。

新しいコンテナを開始し、dnsutilsをインストールしました。

Ran Digとサーバーメッセージは正しいローカルDNSサーバーです。

2
Hank

ユーザー定義ネットワーク上にある場合、DockerコンテナからホストのローカルDNSリゾルバ(たとえばdnsmasq)を使用できます 。その場合、コンテナの/etc/resolv.confにはネームサーバー127.0.0.11(別名Dockerの 埋め込みDNSサーバー )があり、DNS要求をホストのループバックアドレスに適切に転送できます。

$ cat /etc/resolv.conf
nameserver 127.0.0.1
$ docker run --rm Alpine cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
$ docker network create demo
557079c79ddf6be7d6def935fa0c1c3c8290a0db4649c4679b84f6363e3dd9a0
$ docker run --rm --net demo Alpine cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0    

docker-compose を使用すると、コンテナのカスタムネットワークが自動的にセットアップされます(ファイル形式 v2 + )。ただし、docker-composeはユーザー定義のネットワークでコンテナーを実行しますが、defaultネットワークでコンテナーを構築します。ビルドにカスタムネットワークを使用するには、 ビルド構成networkパラメーターを指定できます(ファイル形式 v3.4 + が必要です)。

0
Eugene Yarmash

同様の問題がありました StackOverflowに報告 。 DockerのデフォルトのUbuntuインストールで指定されている8.8.8.8ネームサーバーを照会できなかったようです。ただし、pingを実行できました。この場合、実際に照会できるDNSサーバーを使用します。でテスト

nslookup - dns.server.name

コンテナを起動します

docker run --dns=ip.addr.of.dns

https://askubuntu.com/q/607172/30266 に自動マジックソリューションを導き出す方法をまだ見つけていません。

0
krlmlr