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 となっているため、上記設定そのままでは対応できない。