docker内でのDNS解決
docker は、docker が作り出した隔離空間(のコンテナ群)のために専用の DNS サーバを動かしています。 docker を動かしているホストとは別の DNS サーバです。 そのサーバの IP アドレスが 127.0.0.11 です。
この DNS サーバには、走らせているコンテナ名とIPアドレスが自動的に登録されます。 また、コンテナは、この DNS サーバを使うように自動的に設定されます。
これにより、
たとえば mysql という名のコンテナを実行(docker run --name=mysql ...
)すれば、
他のコンテナは mysql という名前でサーバにアクセス出来ます。
ただし、この機能が使えるのは、ユーザ定義ネットワークに接続されたコンテナ群だけです。 デフォルトの bridge ネットワークでは使えません。
このため、
本構築ガイドでは
docker network create
で新たにos
という名の仮想ネットワーク(ユーザ定義ネットワーク)を作成し、
コンテナ群は、このネットワーク os に接続するようにしています
/etc/resolv.conf
コンテナの /etc/resolv.conf は、デフォルトの bridge の場合、ホストと同じ設定が入ります。 ユーザ定義ネットワークの場合は
nameserver 127.0.0.11
となります。
ちなみに docker がコンテナイメージを改変しているのではなく、 ファイルシステムを重ね合わせることで、 これ(docker が用意した /etc/resolver.conf をコンテナイメージの上に重ね、 docker が用意した設定の方を読ませる)を実現しています (グラフィック編集ソフトがレイヤーを重ねて絵をつくる理屈と同じです。この説明でイメージが湧くかな?)。