docker ambassador 大使容器

ambassador 容器

ambassador:使节,大使。所以ambassador 容器也叫做大使容器,一开始听到这个名字我是崩溃的,什么鬼名字,后来才慢慢了解,这个ambassador容器真的是个大使啊,负责外交的。

ambassador 最主要的功能就是将不同主机上的容器连接起来,通过代理代替真正的容器进行接收网络通信,并转发。

有人肯定要说,为啥不用跨主机网络,连通不同主机的容器方案这么多,选择ambassador干啥子。

我想说:我就喜欢用这个,你能咋的,来咬我啊!!!

开个玩笑,大使容器相较于其他方案有一个优点,不需要改任何代码就可以实现生产环境和开发环境的隔离。

应用场景

一个简单的web应用中,我们会使用到web服务提供web页面;nodejs服务提供返回头像;redis服务提供缓存存储。总共需要三个容器,有时候资源不够的情况下我们会把容器放在不同的主机上,这时候网络连通就是一个麻烦的事情。使用大使容器,通过大使容器转发可以使得这三个应用容器正常通信,感官上和在一台主机上运行三个容器是一致的。

应用实现

在host1主机上启动一个redis容器和一个大使容器,这个大使容器便是用来负责连接该redis容器的6379端口并转发出去,所以这里一定要把防火墙的6379端口打开。

docker run -d --name real-redis redis:3
docker run -d --name real-redis-ambassador -p 6379:6379 --link real-redis:real-redis docker.io/svendowideit/ambassador
firewall-cmd --permanent --zone=public --add-port=6379/tcp
firewall-cmd --permanent --zone=public --list-ports

在host2主机上启动大使容器和dnmonster容器以及identidock容器。这里的大使容器显而易见是用来接收host1主机大使容器发来的redis6379端口,并将数据转发到identidock容器。

docker run -d --name redis_ambassador --expose 6379 -e REDIS_PORT_6379_TCP=tcp://172.16.2.234:6379 docker.io/svendowideit/ambassador
docker run -d --name dnmonster docker.io/amouat/dnmonster:1.0
docker run -d --link dnmonster:dnmonster --link redis_ambassador:redis -p 80:9090 amouat/identidock:1.0

我们创建完容器之后,测试一下能否正常连接。

curl http://172.16.2.235
...

总结

今天通过大使容器,我们实现了跨主机间的容器互相通信。虽然看上去我们多运行了两个大使容器,使得web应用结构变得更加复杂。但是我们成功将应用中的服务容器进行了分离,这样支持了后期我们动态扩展等需要更多资源的场景。个人建议,如果在一个陌生的不可信的网络环境下,我们可以使用大使容器规避网络通信被拦截的风险。如果你没有做跨主机策略,而你的集群又是很小可以考虑使用大使容器完成业务逻辑。

docker ambassador 大使容器


分享到:


相關文章: