转载

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

【编者的话】 我是吴健,来自上海Hypers 国内顶尖的大数据分析公司,参加过“云雀Docker巨好玩”并获得一等奖,年纪尚小请大家多多指教。因为有人提出了这个想法,我之前已经成功实践过这些实验,自己也就把百度和Google不到的私房菜贡献出来,只有一个要求,希望大家互相帮助,不要自吹自擂就行,多多分享。

因为我是思科CCNP认证,天生的网络达人,所以才能想出这样的解决方案

顺便向大家推荐下云雀平台 http://www.alauda.cn

还有Daocloud https://www.daocloud.io

希望大家互相扶持,互相帮助,与DockOne&OSchina还有所有的开源社区一起推动国内的Docker商用和技术能力。

在去年各种SDN和桥接技术雄起帮助docker推波助澜之后,我发现原来可以很简单的达到我想要的效果

让容器跨主机互相访问,通过自制路由器广播路由条目互相学习

来让一个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/}'`'"}'

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

这两条命令 代表同一个意思

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

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

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

正文到此结束
Loading...