【编者的话】 这次技术分享的内容是做到跨主机的容器定位通信,取代了--link无法跨主机和互通的障碍。
阅读本文之前,请先阅读我的上一篇文章,让容器跨主机互相访问,通过自制路由器广播路由条目互相学习。
来让一个LAN里的Docker主机全部知道对方网络的下一跳怎么走,但是解决了刚需之后,又一个很大的问题告诉我,Docker在重启容器或者服务之后会更改自己的IP地址。
就像配置思科路由器的 ip local pool (不是DHCP服务)不会释放地址池等等,所以在不能很轻易固定IP的情况下,我想到了域名解析。但怎么让DNS服务器去知道容器的IP和名字呢?我查阅了一些资料发现DDNS是很适合这个需求。但是DDNS 是配合DHCP的,docker0却不是,Docker容器不会从DHCP服务器请求地址。
在有一天无意中看到了etcd GitHub里的文档,有一些根据etcd开发的开源软件,不仅有服务发现,还有两个DNS服务。比较了学习成本后,我选择了 skydns+etcd,skydns是Golang写的。
只想要etcd里提交信息,skydns就能读取到,无需重启服务,这非常的方便,就是怎么让容器去告诉etcd 域名和IP地址呢?Docker容器的好处就是启动脚本可以自定义。
我在启动脚本里添加一条curl或者etcdctl每次启动容器的时候容器读取自己的hostname还有IP地址发送给etcd服务器就可以。
比如我有2个Tomcat和1个Nginx都是容器化的:
tomcat1.hypers.local tomcat2.hypers.local
在Nginx的upstream里将server的地址变成tomcat1.hypers.local:8080 tomcat2.hypers.local:8080。这样我就忘记了 容器的IP,也忘记了它在哪台主机上。
只要DNS能解析出他们的IP就可以了,因为 docker容器是取宿主的 nameserver 所以这个dns如何指定地址无需担心。只要宿主是skydns的地址就行,启动etcd+skydns是非常简单的,etcd 启动命令我想大家玩过k8s的都会。
skydns是0配置的,可以读取etcd里的skydns信息。也可以自己 skydns -后面加参数启动,我已经把skydns Docker化了,就不麻烦大家编译了,在灵雀云上的georce的仓库里能找到。
skydns搭建在etcd服务器上
curl -XPUT http://127.0.0.1:4001/v2/keys/skydns/config \
-d value='{"dns_addr":"0.0.0.0:53", "domain":".local.", "nameservers": ["223.5.5.5:53","114.114.114.114:53"]}'
docker pull index.alauda.cn/georce/skydns
docker run -itd --name=skydns --net=host index.alauda.cn/georce/skydns
容器启动脚本
curl -XPUT http://$ETCD:4001/v2/keys/skydns/local/$DOMAIN/"`hostname -s`" \
-d value='{"host":"'`ip a | grep "scope global eth0" | awk '{print$2}' | grep -o '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}'`'"}'
etcdctl -C $ETCD_HOST:4001 --no-sync set /skydns/local/$DOMAIN/"`hostname -s `" '{"host":"'`ip a | grep "scope global eth0" | grep -o '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}'`'"}'
这两条命令代表同一个意思,hostname是根据启动容器时的命令,比如
docker run -itd --name=java --hostname=tomcat1
。$DOMAIN 是docker run -itd -e DOMAIN=hypers
我默认都是用的local最后根域,连起来就是 tomcat1.hypers.local。就像我网络那篇文章最后用win7访问无端口映射过的Nginx。nginx.hypers.local 也是可以访问的,只要我win7的dns是指向skydns。
Skydns里可以设置DNS转发给223.5.5.5 或者114.114.114.114 所以无需担心不能上网。
以上内容根据2015年6月30日晚微信群分享内容整理。分享人吴健,来自上海Hypers 国内顶尖的大数据分析公司,参加过“云雀Docker巨好玩”并获得一等奖。DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学参与。
有疑问加站长微信联系(非本文作者)