Docker Overlay网络的一些总结

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 在早期的docker版本中,是不支持跨主机通信网络驱动的,也就是说如果容器部署在不同的节点上面,只能通过暴露端口到宿主机上,再通过宿主机之间进行通信。随着docker swarm集群的推广,docker也有了自家的跨主机通信网络驱动,名叫overlay,overlay网络模型是swarm集群容器间通信的载体,将服务加入到同一个网段上的Overlay网络上,服务与服务之间就能够通信。

在早期的docker版本中,是不支持跨主机通信网络驱动的,也就是说如果容器部署在不同的节点上面,只能通过暴露端口到宿主机上,再通过宿主机之间进行通信。随着docker swarm集群的推广,docker也有了自家的跨主机通信网络驱动,名叫overlay,overlay网络模型是swarm集群容器间通信的载体,将服务加入到同一个网段上的Overlay网络上,服务与服务之间就能够通信。


容器之间可互相通信



overlay网络模型在docker集群节点间的加入了一层虚拟网络,它有独立的虚拟网段,意味着docker容器发送的内容,会先发送到虚拟子网,再由虚拟子网包装为宿主机的真实网址进行发送。


也意味着在overlay网络模型上,docker不会暴露端口给宿主机,所有有关网络的事情都交给overlay去处理了,这样的好处就是在同一台服务器,不会引起端口冲突,理解这点非常重要。


下面我画个模型图给大家理解下:

640.jpg


在早期使用docker进行微服务部署时,你肯定干过将docker容器所在宿主机的ip作为注册地址,因为如果你将容器内的ip作为注册地址,其他服务将不可访问你的服务,只能将宿主机的ip挂在容器内部处理,或者在容器内部添加ip地址环境变量来处理。


当使用docker swarm进行集群服务部署时,这个问题自然也就随之解决了,当服务已加入到overlay网络中,服务容器内会获得一个overlay网络下的一个地址,如下:

640.jpg


而dubbo默认会拿eth0的ip作为注册地址,因此服务只需要将docker容器的ip地址作为注册地址就行了,只要服务与服务之间在同一个ovelay网段下,就可以进行通信。

这里我特别做了一个验证,如下:

640.jpg640.jpg


提供者和消费者同时部署了2个实例,在相同overlay网段下,相互之间是可通信的。


负载均衡特性



前面我也说了,服务的端口会交给overlay网络去处理。在Overlay网络下,即使该节点并没有部署指定服务,也会监听该服务的端口,docker通过这个特性实现了访问任意一个节点+服务对应端口,就可以访问服务,而且还具备负载均衡特性。

基于该特性,我突发奇想,我把服务的网关加入集群后,无需关心网关被分配在哪个节点上,只需要在集群再上一层nginx层配置若干个节点ip+网关服务端口,就可实现双层负载均衡,即nginx访问网关时的负载均衡,访问集群时的负载均衡。如果此时你正在搭建docker swarm集群,我建议你把网关项目同时加入到集群中,再通过nginx做双层负载均衡。


swarm load balancer:

640.jpg


Compose编排文件的网络选择



编排文件有个不太灵活的地方, 初次使用它来创建swarm集群的人可能会犯一些错误,比如说:


1.如果你没有指定网络,它会给你默认创建一个网络,如:

stackname_default

2.假如两个stack栈分别属于不同的overlay网络,那么不同stack栈的服务是不可以进行通信的。

3.如果你指定一个网络,没有写name属性的,那么它会在你指定的网络名字前面加个stackname,这本就不是我们设定好的名字,也不知道docker为什么要这么做。

4.如果该网络已存在,在部署时还会报错,不会智能将该stack服务地加入该网络中。

基于上面几点坑爹的想不明白docker为什么这么做的问题,我建议你在部署服务前,先通过命令创建一个网络:

$ sudo docker network create -d overlay chaos_net


为了防止overlay的网络会跟其它网络有冲突,更严谨的做法是自定义overlay网段:

$ sudo docker network create -d overlay --subnet=10.0.15.0/24 chaos_net


在编排文件的networks上配置defualt属性,在defualt属性下面添加external属性,在其下面填写刚刚生成的网络的名称:

networks:
  default:
    external:
      name: chaos_net


官方解析如下图所示:

640.jpg


这么做的好处是可以灵活地将不同stack服务栈加入到相同网络下,也可避免上面提到的几个坑。


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
24天前
|
Docker 容器
docker swarm启动服务并连接到网络
【10月更文挑战第16天】
22 5
|
24天前
|
调度 Docker 容器
docker swarm创建覆盖网络
【10月更文挑战第16天】
15 5
|
25天前
|
负载均衡 网络协议 关系型数据库
docker swarm 使用网络启动服务
【10月更文挑战第15天】
21 4
|
10天前
|
Docker 容器
【赵渝强老师】Docker的None网络模式
Docker容器在网络方面实现了逻辑隔离,提供了四种网络模式:bridge、container、host和none。其中,none模式下容器具有独立的网络命名空间,但不包含任何网络配置,仅能通过Local Loopback网卡(localhost或127.0.0.1)进行通信。适用于不希望容器接收任何网络流量或运行无需网络连接的特殊服务。
|
10天前
|
Docker 容器
【赵渝强老师】Docker的Host网络模式
Docker容器在网络环境中是隔离的,可通过配置不同网络模式(如bridge、container、host和none)实现容器间或与宿主机的网络通信。其中,host模式使容器与宿主机共享同一网络命名空间,提高性能但牺牲了网络隔离性。
|
10天前
|
Kubernetes Docker 容器
【赵渝强老师】Docker的Container网络模式
Docker容器在网络环境中彼此隔离,但可通过配置不同网络模式实现容器间通信。其中,container模式使容器共享同一网络命名空间,通过localhost或127.0.0.1互相访问,提高传输效率。本文介绍了container模式的特点及具体示例。
|
10天前
|
Linux Docker 容器
【赵渝强老师】Docker的Bridge网络模式
本文介绍了Docker容器的网络隔离机制及其四种网络模式:bridge、container、host和none。重点讲解了默认的bridge模式,通过示例演示了如何创建自定义bridge网络并配置容器的网络信息。文中还附有相关图片和视频讲解,帮助读者更好地理解Docker网络的配置和使用方法。
|
8天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
33 2
|
6天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
14天前
|
关系型数据库 MySQL API