それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

dockerがapt失敗する - dns の設定を見直してみる。

Docker で起動したUbuntuがネットに出られない。

docker コンテナ側からインターネットへのネットワークの疎通を確認する。

今回は、なぜか、通信ができなかったので、エラーになる。いきなり発生したので原因を探っておく。

疎通確認

docker run busybox ping -c 1 8.8.8.8

これは、docker のコンテナを起動してpingを起動して実行する。

こんどは、docker コンテナからインターネットへのDNS名前解決を確認する

名前確認。

任意のドメインに、pingを打って名前解決を確認する。

takuya@:docker run busybox ping -c 1 t.co

今回は、ここでエラーになっていた。

DNS名前解決が出来ないときは、docker コンテナの nameserver 設定を確認する。

takuya@:~$ docker run busybox cat /etc/resolv.conf
nameserver 192.168.11.111

あ・・・ホストのDNS設定そのままコピーされてるやん

docker のネームサーバー設定は、ホストから

そうなんですね、Dockerのネームサーバーの設定は、ホストからコピーされることがあります。

DNS の設定は、docker ホスト側のresolv.confに従うが、私のサーバーのresolve.conf は localhost の unbound を見に行く。

そのため、ホスト側のDNSと同じ設定が適用されるのだが、これが必ずしも使えるとは限らない。

例えば、私はunbound側でresolveを許可するネットワークを絞っている。

takuya@:bwdata$ ip addr show  docker0
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:58:e2:8b:63 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:58ff:fee2:8b63/64 scope link
       valid_lft forever preferred_lft forever

私の場合、次のようなdocker0 ネットワークインターフェースが存在するので、このIPレンジからの問い合わせに答えてあげなくていはいけない。

access-control: 172.17.0.1/16 allow_snoop  ## docker network

今回は、私のホスト側に設定している dns サーバーがIPアドレス制限を行ってたのでapt に失敗してた。

Docker で名前解決が失敗するときは

takuya@:~$ docker run --dns=8.8.8.8   busybox  cat /etc/resolv.conf
nameserver 8.8.8.8

DNSはまとめて設定ファイルに書くことができる。

dokcer のホスト側にdocker のオプションを書きところがあり、そこの記述を追記してあげれば固定できる。

takuya@:~$ sudo cat /etc/docker/daemon.json

{
        "dns": ["8.8.8.8"]
}

上記の方法を試すなど、として様子を見てみるのもいいだろう。

docker のDNSは8.8.8.8になる

ホスト側のdns 設定がlocalhost の場合

takuya@:~$ cat /etc/resolv.conf
nameser 127.0.0.1

ホスト側がlocalhostを参照しているので、docker コンテナにこのままコピーされると詰む、なので、

takuya@:~$ docker run busybox cat /etc/resolv.conf
nameser 8.8.8.8

この場合、127.0.0.1をコピーすると詰むので、docker のコンテナには、8.8.8.8 が自動で設定されるのかもしれない。

参考資料

Configure container DNS | Docker Documentation