Docker跨主机网络通信方案

在微服务架构中,多个服务是通过服务注册中心进行管理的,服务需要将自己的IP地址和端口发送给注册中心,这样该服务才能被其它服务感知并调用。但是当服务在docker容器内运行时,服务获取到的自身IP是宿主机分配的内部IP(默认情况下会在172.17.0.0/16子网下),如172.17.0.1, 这个地址只能在宿主机内部使用(通过docker0网桥转发),其它机器是无法ping通的。我们就以服务注册的场景讨论docker容器跨主机通信方案。

端口映射

启动容器时通过 -p 参数将容器内服务监听的端口映射到主机端口中。例如容器运行的web服务监听8080端口,那么当指定-v 8080:80时,外部就可以通过访问宿主机的80端口访问到这个web服务了。这种方式有一个很大的缺点:服务器端口是一种稀缺资源,一台机器往往会运行多个容器,它们之间有可能会出现端口冲突的情况。而且就服务注册这个场景而言,容器内的web服务是无法主动得到宿主机的ip地址的,因此需要我们在启动容器时通过Dockerfile将宿主机IP通过环境变量注入到容器中,然后配置web项目使用我们指定的IP来注册自身。这种方式显然无法应用于大规模集群部署。

性能损失:20%

不进行网络隔离,直接使用宿主机网络配置

通过–net=host参数可指定使用该模式。在这种模式下,容器的网络环境并没有通过Linux内核的Network Namespace进行隔离,在容器内可以自由修改宿主机的网络参数,因此是不安全的,但优点是网络性能损失可以忽略不计。对于我们的场景来说,微服务能够像直接部署一样正常获取到主机IP。

性能损失:几乎没有

组建overlay网络

Overlay网络其实就是隧道技术,即将一种网络协议包装在另一种协议中传输的技术。Docker常见的overlay网络实现有flannel, swarm overlay, Open vSwitch等。它们的工作流程基本都是一样的:先通过某种方式保证所有docker容器都有全局唯一的ip, 然后把docker容器的ip和其所在宿主机

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值