Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

tomy103rider
渋谷で働くインフラエンジニア→六本木一丁目で働くSREのようなインフラエンジニアのような何か。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away