Docker で起動したUbuntuがネットに出られない。
docker コンテナ側からインターネットへのネットワークの疎通を確認する。
今回は、なぜか、通信ができなかったので、エラーになる。いきなり発生したので原因を探っておく。
疎通確認
docker run busybox ping -c 1 8.8.8.8
これは、docker のコンテナを起動してpingを起動して実行する。
こんどは、docker コンテナからインターネットへのDNS名前解決を確認する
名前確認。
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になる
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 が自動で設定されるのかもしれない。