DockOne技术分享(十):跨主机的 --link

Georce · · 897 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。


【编者的话】 这次技术分享的内容是做到跨主机的容器定位通信,取代了--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\}'`'"}'

11.png

这两条命令代表同一个意思,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。
22.png

Skydns里可以设置DNS转发给223.5.5.5 或者114.114.114.114 所以无需担心不能上网。

以上内容根据2015年6月30日晚微信群分享内容整理。分享人吴健,来自上海Hypers 国内顶尖的大数据分析公司,参加过“云雀Docker巨好玩”并获得一等奖。DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学参与。

有疑问加站长微信联系(非本文作者)

本文来自:DockOne.io

感谢作者:Georce

查看原文:DockOne技术分享(十):跨主机的 --link

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

897 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传