Ubuntu 16.04 LTS 上でConsulとDocker Swarm Modeを組み合わせて使う場合のDNS関連設定メモ
Dockerのコンテナ内から名前解決ができない
通常のDockerコンテナからは名前解決できるが、Docker Swarm Modeのサービスコンテナからは名前解決できない
一般のドメインは名前解決できるが、Consulサービス名等が名前解決できない
Ubuntu 16.04 LTS
Docker-CE 18.03
サーバ設置場所の関係から、GoogleのPublicDNS 8.8.8.8 にアクセスできない
ホスト上ではConsul+dnsmasqで名前解決を設定している
DBを db.service.consul として、Redisを redis.service.consul として接続している
/etc/resolv.conf は 127.0.0.1
dnsmasq で .consul ドメインを 127.0.0.1:8600 で名前解決
DockerSwermServiceのアプリ内からも、DBを db.service.consul として接続したい
Dockerが利用するDNSサーバが正しくない。
ホスト上で利用している「Consul+dnsmasq」のDNSサーバ情報が正しくDockerデーモンに設定されていない
設置データセンターのNW的な制約から 8.8.8.8 にアクセスできないからといって、DockerデーモンのDNSをデータセンタから提供されるキャッシュDNSサーバに向けてはいけない。
理由:外部ドメインは解決できるが、自前のConsulの名前が解決できない
Docker側ではPublicDNS(8.8.8.8)やデータセンタで提供されるキャッシュDNSを考慮しない
DNSはすべて「コンテナホストのdnsmasq(127.0.0.1:53)」で解決することとする
この設定により、アプリ側(Dockerfile、docker-compose.yml、およびコンテナ内アプリ)ではDNSの設定を気にすることなく、db.service.consul としてDBに接続することができる。
DNSサーバとして、コンテナホストを指すアドレス「172.17.0.1」を設定する
daemon用設定ファイルに "dns": を記述
{
"dns": ["172.17.0.1"]
}
コンテナからのDNSリクエストを許可する
/etc/dnsmasq.conf
server=/consul/127.0.0.1#8600
strict-order
conf-dir=/etc/dnsmasq.d/,*.conf
/etc/dnsmasq.d/docker-bridge.conf
interface=docker0
listen-address=172.17.0.1
dockerdをdebugモードで動かすことでDocer Swarm Service内での名前解決のログが見られる
/etc/docker/daemon.json に "debug": true を追記
Ubuntu 18.04 LTS bionic の場合にはローカルリゾルバのデフォルトが systemd-resolved となっているため、上記設定そのままでは対応できない。