Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save shichi-at-nttr/515e7fb934594dcdbe693c86e35a8eeb to your computer and use it in GitHub Desktop.
Save shichi-at-nttr/515e7fb934594dcdbe693c86e35a8eeb to your computer and use it in GitHub Desktop.
Docker Swarm Mode + Consul + Dnsmasq on Ubuntu 16.04 LTS

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.conf127.0.0.1
    • dnsmasq で .consul ドメインを 127.0.0.1:8600 で名前解決
  • DockerSwermServiceのアプリ内からも、DBを db.service.consul として接続したい

原因

  • Dockerが利用するDNSサーバが正しくない。
  • ホスト上で利用している「Consul+dnsmasq」のDNSサーバ情報が正しくDockerデーモンに設定されていない

対処その1 (NGパターン)

  • 設置データセンターのNW的な制約から 8.8.8.8 にアクセスできないからといって、DockerデーモンのDNSをデータセンタから提供されるキャッシュDNSサーバに向けてはいけない。
  • 理由:外部ドメインは解決できるが、自前のConsulの名前が解決できない

対処その2 (OKパターン)

考え方

  • Docker側ではPublicDNS(8.8.8.8)やデータセンタで提供されるキャッシュDNSを考慮しない
  • DNSはすべて「コンテナホストのdnsmasq(127.0.0.1:53)」で解決することとする
  • この設定により、アプリ側(Dockerfiledocker-compose.yml、およびコンテナ内アプリ)ではDNSの設定を気にすることなく、db.service.consul としてDBに接続することができる。

Dockerの設定

  • DNSサーバとして、コンテナホストを指すアドレス「172.17.0.1」を設定する
  • daemon用設定ファイルに "dns": を記述
{
    "dns": ["172.17.0.1"]
}

dnsmasq設定

  • コンテナからの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 となっているため、上記設定そのままでは対応できない。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment