boot2docker上のコンテナ間の名前解決方法 (dnsmasq)


---

kibana/elasticsearchの環境を作っていて、config内でIP指定 or ホスト名指定が必要になり、
コンテナは起動時にIPが変わってしまって困ったので、以下のように回避した。

---
参考URL
http://tell-k.hatenablog.com/entry/2014/04/28/002437
http://blog.cloudpack.jp/2014/11/12/memo-docker-cant-control-hosts/
https://blog.amartynov.ru/archives/dnsmasq-docker-service-discovery/

---

# dnsmasqインストール

`$ brew install dnsmasq`

	==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/dnsmasq-2.71.mountain_lion.bottle.tar.gz
	######################################################################## 100.0%
	==> Pouring dnsmasq-2.71.mountain_lion.bottle.tar.gz
	==> Caveats
	To configure dnsmasq, copy the example configuration to /usr/local/etc/dnsmasq.conf and edit to taste.

	 cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf

	To have launchd start dnsmasq at startup:
	 sudo cp -fv /usr/local/opt/dnsmasq/*.plist /Library/LaunchDaemons

	Then to load dnsmasq now:
	 sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist

	WARNING: launchctl will fail when run under tmux.
	==> Summary
	 /usr/local/Cellar/dnsmasq/2.71: 7 files, 504K


# 設定ファイルをコピー
`$ cp $(brew list dnsmasq | grep /dnsmasq.conf.example$) /usr/local/etc/dnsmasq.conf`

# 自動起動設定用の設定ファイルをコピー
`$ sudo cp $(brew list dnsmasq | grep /homebrew.mxcl.dnsmasq.plist$) /Library/LaunchDaemons/`
`$ sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist`

　※自動起動をoffにしたい場合はplistファイル内のRunAtLoadをtrue=>falseにすれば良いらしい。

# dnsmasqの設定
/usr/local/etc/dnsmasq.conf の最後に以下を追記する

	### Add tomy
	listen-address=0.0.0.0
	# 解決できない場合に使うDNSサーバ
	resolv-file=/usr/local/etc/resolv.dnsmasq.conf
	conf-dir=/etc/dnsmasq.d
	# launch daemonで動かすために常にforgroundで起動？
	keep-in-foreground
	no-resolv

/usr/local/etc/resolv.dnsmasq.conf に以下を記述

	nameserver 8.8.8.8
	nameserver 8.8.8.4

# dnsmasqを停止
`$ sudo launchctl stop homebrew.mxcl.dnsmasq`

# dnsmasqを起動
`$ sudo launchctl start homebrew.mxcl.dnsmasq`　

# 稼働中コンテナ用のレコードを登録スクリプトを作成
このスクリプトを実行することで稼働中のコンテナのIP/Hostnameをdnsmasqに反映させる

`$ vim docker_dns_refresh.sh`

	#!/bin/bash
	
	# Domain name for containers
	CONTAINER_DOMAIN=tomi.local
	
	# Path to the addn-hosts file
	CONTAINER_HOSTS=/etc/dnsmasq.d/tomi.local
	
	echo "" > $CONTAINER_HOSTS
	echo "# Auto-generated by $0" > $CONTAINER_HOSTS
	for CONTAINER_ID in `docker ps -q`; do
	    IP=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CONTAINER_ID`
	    NAME=`docker inspect --format '{{ .Config.Hostname }}' $CONTAINER_ID`
	    echo "address=\"/$NAME/$IP\"" >> $CONTAINER_HOSTS
	done
	
	# Ask dnsmasq to reload addn-hosts
	echo 'hogehoge' | sudo -S launchctl stop homebrew.mxcl.dnsmasq
	echo 'hogehoge' | sudo -S launchctl start homebrew.mxcl.dnsmasq
	
	# result
	echo "---current up container---"
	cat ${CONTAINER_HOSTS}
	echo "---"

# コンテナ作成時にDNSをホスト側に向ける(例:centos6)
指定するIPアドレスを確認
`$ ifconfig -a`
　※自分環境だとvboxnet3の「192.168.59.3」に向けたらいけた
　
コンテナ作成。--dnsオプションを使って以下のようにする。
`$ docker run -d -it -p 50080:80 --dns 192.168.59.3 --hostname tomi-local-kibana01 --name tomi-local-kibana01 tomy103rider/tomi-local-kibana:latest /bin/bash`

コンテナ起動
`$ docker start tomi-local-kibana01`

# コンテナにログインして別のコンテナの名前解決ができるか確認
`$ dig tomi-local-elasticsearch01`