网站首页 > 技术文章 正文
1. 问题出现
微服务启动的时候,会自动向服务注册中心报告自己的 IP 和端口。但是服务是在 Docker 容器内运行的,注册的 IP 就成了 172.17.0.2 类似的 Docker 内部 IP,这个地址是无法被其它机器访问的。
原因解释: Docker Bridge 网络模式是 Docker 默认的网络模式,它将容器连接到 Docker 宿主机的虚拟网络中,并为每个容器分配一个 IP 地址。容器之间可以通过 IP 地址直接通信,也可以通过容器名称进行通信。
在 Bridge 网络模式下,Docker 会为每个容器创建一个虚拟网桥,容器之间的通信都是通过这个虚拟网桥进行的。Docker 宿主机上的所有容器都连接到这个虚拟网桥上,而 Docker 宿主机本身也是通过一个特殊的容器(名为 docker0 )连接到这个虚拟网桥上的。
当 Docker 创建容器时,它会自动为容器分配一个 IP 地址,并将该地址添加到虚拟网桥的配置中。这样,在容器之间通信时,就可以使用这个IP地址进行通信了。需要注意的是,Bridge 网络模式下的容器只能和同一台主机上的容器通信,无法和其他主机上的容器通信。
初步解决:在不使用 Docker Overlay 网络模式之前,我们一般会用下边几种方式解决:
直接将网络模式设置成 Docker Host 模式,--net=host 与宿主机打通。 保持 Docker Bridge 网络模式不变,将容器内所有需要的通信端口映射到宿主机,使得直接使用 宿主机IP: 端口 能访问到容器内部应用;当然在此之前还需要修改应用的注册发布客户端代码,将宿主机 IP 设置在环境变量中,应用从环境变量中获取并报告给注册中心。
2. Overlay 虚拟网
Overlay 网络是通过网络虚拟化技术,在同一张 Underlay 网络上构建出的一张或者多张虚拟的逻辑网络。不同的 Overlay 网络虽然共享 Underlay 网络中的设备和线路,但是 Overlay 网络中的业务与 Underlay 网络中的物理组网和互联技术相互解耦。
为什么需要 Overlay 网络?
Overlay 网络和 Underlay 网络是一组相对概念,Overlay 网络是建立在 Underlay 网络上的逻辑网络。而为什么需要建立 Overlay 网络,就要从底层的 Underlay 网络的概念以及局限讲起。
Underlay 网络
Underlay 网络正如其名,是 Overlay 网络的底层物理基础。如下图所示,Underlay 网络可以是由多个类型设备互联而成的物理网络,负责网络之间的数据包传输。
在 Underlay 网络中,互联的设备可以是各类型交换机、路由器、负载均衡设备、防火墙等,但网络的各个设备之间必须通过路由协议来确保之间 IP 的连通性。然而传统的网络设备对数据包的转发都基于硬件,其构建而成的 Underlay 网络也产生了如下的问题:
- 由于硬件根据目的IP地址进行数据包的转发,所以传输的路径依赖十分严重。
- 新增或变更业务需要对现有底层网络连接进行修改,重新配置耗时严重。
- 互联网不能保证私密通信的安全要求。
- 网络切片和网络分段实现复杂,无法做到网络资源的按需分配。
- 多路径转发繁琐,无法融合多个底层网络来实现负载均衡。
Overlay 网络
为了摆脱 Underlay 网络的种种限制,现在多采用网络虚拟化技术在 Underlay 网络之上创建虚拟的 Overlay 网络。如下图所示,在 Overlay 网络中,设备之间可以通过逻辑链路,按照需求完成互联形成 Overlay 拓扑。
相互连接的 Overlay 设备之间建立隧道,数据包准备传输出去时,设备为数据包添加新的 IP 头部和隧道头部,并且被屏蔽掉内层的 IP 头部,数据包根据新的 IP 头部进行转发。当数据包传递到另一个设备后,外部的 IP 报头和隧道头将被丢弃,得到原始的数据包,在这个过程中 Overlay 网络并不感知 Underlay 网络。
Overlay 网络有着各种网络协议和标准,包括 VXLAN、NVGRE、SST、GRE、NVO3、EVPN 等。随着 SDN 技术的引入,加入了控制器的 Overlay 网络,有着如下的优点:
- 流量传输不依赖特定线路。Overlay 网络使用隧道技术,可以灵活选择不同的底层链路,使用多种方式保证流量的稳定传输。
- Overlay 网络可以按照需求建立不同的虚拟拓扑组网,无需对底层网络作出修改。
- 通过加密手段可以解决保护私密流量在互联网上的通信。
- 支持网络切片与网络分段。将不同的业务分割开来,可以实现网络资源的最优分配。
- 支持多路径转发。在 Overlay 网络中,流量从源传输到目的可通过多条路径,从而实现负载分担,最大化利用线路的带宽。
Overlay 和 Underlay 的区别
3. Docker Overlay 网络模式
Docker Overlay 网络是一种网络技术,它使用了 Docker 引擎的特性,使得多个 Docker 主机可以连接在一起,形成一个虚拟网络,从而实现多主机之间的容器通信。Docker Overlay 网络使用 VXLAN 协议实现跨主机的网络通信。
Docker Overlay 网络是使用 VXLAN 协议实现的,VXLAN 是一种虚拟化隧道协议,它可以将二层网络封装在 UDP 包中传输,从而实现跨主机的网络通信。
Docker Overlay 网络的工作流程如下:
上图术语解释:
- br0:它是 Overlay 默认创建的网桥。
- VETP:对 VXLAN 数据包的封装与解封装。
- Container eth0: eth0 它是 Overlay 网络分配的唯一的 IP 地址,它是 veth pair 虚拟设备对,作用是实现点对点的通信,通过桥接到 br0 这个网桥中,可以实现不同 NameSwitch 之间容器进行通信。
- Container eth1:eth1 是容器主机的默认网络,主要提供容器访问外网所提供的服务,走的默认 docker 网络架构,只不过他创建了 docker_gwbridge 这个网桥。
- docker_gwbridge:docker_gwbridge 是容器所创建的网桥它替代了 docker0 的服务。
- Host eth0:真机网卡与外界网卡连接得真机网卡,它用来转发,容器 VXLAN 与 NAT 两种网卡类型的数据包到指定的对端节点。
工作流程介绍:
容器 Container1 如何发送数据包 到容器 Container2 ?
- 容器 Container1 会通过 Container eth0 将这个数据包发送到 10.0.0.1 的网关。
- 网关将数据包发送出去后到达 br0 网桥。
- b20 网桥针对 VXLAN 设备,主要用于捕获对外的数据包通过 VETP 进行数据包封装。
- 封装好将 VXLAN 格式数据包交给 eth0,通过 UDP 方式交给 Container2 的 eth0。
- Container2 收到数据包后通过 VETP 将数据包解封装。
- 网桥通过网关将解封装的数据包转发给 Container eth0,完毕通信。
Overlay 网络的优点
- 跨主机通信:Overlay 网络可以将多个 Docker 主机上的容器连接起来,实现跨主机的容器通信。
- 网络隔离:每个 Overlay 网络都是独立的,可以实现网络隔离。
- 灵活性:Overlay 网络可以很容易地进行扩展和管理,使得应用程序可以根据需要进行快速部署和重构。
- 安全性:Overlay 网络可以加密通信,确保数据的安全性。
Overlay 网络的缺点
- 性能问题:Overlay 网络使用 VXLAN 协议实现跨主机通信,会增加数据包的传输延迟,对网络性能有一定影响。
- 配置复杂:Overlay 网络的配置比较复杂,需要进行多个配置步骤。
- 容易出错:出于 Overlay 网络的配置比较复杂的原因。
4. Docker Swam 中使用 Overlay
使用 Overlay 网络的 Docker 守护进程需要的防火墙规则。
要让一个 overlay 网络中的 docker主机能够相互通信,你需要打开下面的端口:
TCP 端口 2377,用来集群管理相关的通信; TCP 和 UDP 端口 7946,用来进行节点之间的通信; UDP 端口 4789,用来进行进行 overlay 网络上的数据传输。
在你能创建一个 overlay 网络之前,你要么要通过 docker swarm init 把你的 docker 守护进程初始化成一个集群管理者(swarm manager),要么要通过 docker swarm join 把它加入到一个已存在的集群中。
不管哪种方式,默认创建并使用的都是叫做 ingress 的 overlay 式网络。即使你不打算使用集群服务,也要这么做。
创建一个用在集群服务中的 overlay 式网络,用下面所示的命令:
bash复制代码docker network create \
--driver overlay \
--ingress \
--subnet=10.11.0.0/16 \
--gateway=10.11.0.2 \
--opt com.docker.network.mtu=1200 \
--attachable my-attachable-overlay \
my-ingress
参数解释:
- --ingress:创建群集路由网状网络
- --subnet:代表网段的 CIDR 格式的子网
- --gateway:主子网的 IPv4 或 IPv6 网关
- --attachable:允许容器直接加入网络中(docker run 也能 --network=my-attachable-overlay)
- --opt com.docker.network.mtu=1200:网络 MTU 最大传输单元为 1200 字节
在服务启动时,使用如下参数,加入到 overlay 网络中:
bash复制代码docker service create \
...
--network=my-ingress
--attachable 允许在容器启动时,也能加入到 overlay 网络中:
bash复制代码docker run \
...
--network=my-attachable-overlay
Overlay 网络上的加密通信不支持 Windows。如果 Windows 节点试图连接到加密通信的 overlay 网络,不会报错,但这个节点会不能和其他节点通信。
猜你喜欢
- 2024-10-14 Docker Overlay 网络学习 dockercompose 网络
- 2024-10-14 盘点c++几种常见的设计模式及具体实现
- 2024-10-14 Docker新手福音!这个开源控制面板让你更快上手Docker
- 2024-10-14 Docker-掌握这三种方法,创建自己的docker镜像
- 2024-10-14 docker 基础概念 docker基于什么
- 2024-10-14 小白也能轻松上手,深度体验绿联私有云DX4600 Docker功能
- 2024-10-14 一文带你了解docker常用命令 docker常用命令及参数
- 2024-10-14 Docker最佳实践的反模式 docker反向代理
- 2024-10-14 docker中容器如何实现通信 docker容器之间如何通信
- 2024-10-14 工程化Docker:确保应用程序的可靠性、可扩展性和可维护性
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)