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)
それで?
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ファイルを直接編集するべきではありません 。)
私は自分で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
具体的には私の状況でこれに遭遇しました
npm install
を実行するなどのことを行いますVPN上、コンテナ内。npm
はDNSルックアップを正常に実行できないため、これはCIパイプラインから機能しますが、開発者のマシンからは機能しません。UbuntuはデフォルトでNetworkManagerによって起動されたdnsmasq
を使用してDNS要求をキャッシュし、/etc/resolv.conf
が127.0.1.1
上のこのインスタンスを指すように設定します
/etc/resolv.conf
を強制します/etc/resolv.conf
をデフォルトでコンテナにシャドウしますdnsmasq
状況を認識しているため、Google DNSサーバーをコンテナに渡します。docker0
ネットワークブリッジ上のコンテナから、VPN tap0
アダプタを介したDNSサーバーへのルートはありません。ソリューション :
NetworkManagerを使用する方がよりエレガントで、設計された方法でキャプティブdnsmasq
インスタンスになります。
DNSにdnsmasq
インスタンスを使用するようにDockerに指示します
ファイル/etc/docker/daemon.json
を追加または編集して、DNSにdocker0
ブリッジアダプターを使用するようにdockerに指示します
{
"dns": ["172.17.0.1"]
}
デフォルトでは127.0.1.1のみをリッスンするため、NM dnsmasq
インスタンスもDockerブリッジをリッスンするように構成します-ファイル/etc/NetworkManager/dnsmasq.d/docker-bridge.conf
を作成します
# Default Docker bridge
interface=docker0
# Other Docker bridges
interface=br-*
私はそのVPNクライアントの失礼な振る舞いが好きではなく、VPNルックアップにVPNエンドでDNSを使用するだけです(正しく設定されたNetworkManagerを使用するポライトVPNクライアントがある場合、これを行う必要はありません)
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
オプションで、ドメインの検索ドメインを追加して、短い名前を使用できるようにします
NetworkManagerとDockerを再起動します
Sudo service network-manager restart
Sudo service docker restart
この時点で、Dockerコンテナは、VPNの内側と外側の両方のドメインで、VPNを使用しているときに問題なくnslookup
を実行できるはずです。
ここでは、ヘッドレスを実行している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サーバーです。
ユーザー定義ネットワーク上にある場合、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 + が必要です)。
同様の問題がありました 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 に自動マジックソリューションを導き出す方法をまだ見つけていません。