使用Ambassador容器构建docker容器集群

当两个Docker容器在同一主机(或虚拟机)时,可以通过 --link 命令让两者直接互相访问。如果要跨主机实现容器互联,则往往需要容器知道物理主机的ip地址。利用Ambassador 容器机制,可以让互联的容器无需知道所在物理主机的IP地址即可互联。

基本场景

Ambassador 容器也是一种 docker 容器,她在内部提供了转发服务。

如下图。当客户端容器要访问服务器时,直接访问客户端 Ambassador 容器;这个请求会被客户端Ambassador 转发出去,到达服务端主机。服务端Ambassador 容器监听在对应的端口上,收到请求后再转发请求给服务端容器。

使用 Ambassador 容器

首先在服务端主机上创建一个服务端 redis-server:

$ sudo docker run -d --name redis-server crosbymichael/redis

创建一个服务端Ambassador 容器 redis_ambassador ,连接到服务端容器 redis-server,并监听本地的6379端口:

$ sudo docker run -d --link redis-server:redis --name redis_ambassador -p 6379:6379 svendowideit/ambassador

在客户端主机上创建客户端Ambassador容器, 为其设置服务端物理主机的监听地址是tcp://x.x.x.x:6379,将本地收集到6379端口的流量转发到服务端物理主机:

$ sudo docker run -d --name redis_ambassador --expose 6379 -e REDIS_PORT_6379_TCP=tcp://x.x.x.x:6379 svendowideit/ambassador

最后,创建一个哭护短容器,进行测试,默认访问6379端口实际上是访问的服务端容器内的 Redis应用:

$ sudo docker run -it --rm --link redis_ambassador:redis relateiq/redis-cli

Ambassador 镜像的Dockerfile

Ambassador 镜像的Dockerfile如下所示:

FROM docker-ut
MAINTAINER SvenDowideit@home.org.qu
CMD env | grep _TCP= | sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/'  | sh && top 

主要是一行正则表达式,从环境变量中找到包含“TCP”字符串的变量,然后使用正则表达式‘.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)’从中提取ip和端口号,最后利用socat 将流量转发到指定的地址上。

这种情况下,需要额外的Ambassador 容器,并且也仍然需要知道目标容器所在的物理主机的地址。

博客:https://blog.csdn.net/sunset108/article/details/40856957 也有相关说明。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值