Docker 容器跨主机通信 overlay

news2024/12/29 10:06:38

Docker 容器跨主机通信 overlay

一.Overlay网络概述

​ Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。Overlay网络采用VXLAN(Virtual Extensible LAN)技术创建一个虚拟网络,将不同主机上的容器连接到同一个逻辑网络中。这样,容器就可以像在同一台主机上一样进行通信,而无需关心底层的网络细节。

二.Overlay网络的优势

​ 跨主机通信:Overlay网络允许在不同主机上的容器之间进行通信,打破了主机之间的隔离。
扩展性:Overlay网络可以支持大量的容器和主机,满足大规模容器化部署的需求。
隔离性:通过Overlay网络,可以为不同的容器提供独立的网络环境,避免网络冲突和干扰。
灵活性:Overlay网络支持动态添加和删除容器,无需重新配置网络。

三、实现Overlay网络的步骤

1.准备环境

docker01 192.168.73.128 ens33 centos7
docker02 192.168.73.129 ens33 centos7

2.初始化一个swarm集群

# 初始化swarm集群
[root@docker01 ~]# docker swarm init --advertise-addr 192.168.73.128
Swarm initialized: current node (9fn9iyxhkxvjey06lwhgv7zhb) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1rqzq4jhf4wm77e8yn6s347sd189u84mr0u042kwxxv05n8bbx-1rv4ae95p4e4y6aztlhkvqtfx 192.168.73.128:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

# 查看集群
[root@docker01 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
9fn9iyxhkxvjey06lwhgv7zhb *   docker01   Ready     Active         Leader           26.1.4

# 查看网络
[root@docker01 ~]# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
6ad75bb1b055   bridge            bridge    local
f12f6a0f8bbf   docker_gwbridge   bridge    local
b1c70e3e1ded   host              host      local
116fnum2qea1   ingress           overlay   swarm
e9eddadcf473   none              null      local

3.创建 overlay network

# 创建ovelay,自定义子网和网关,不输入系统会自动生成
[root@docker01 ~]# docker network create -d overlay --subnet=192.168.100.0/24 --gateway=192.168.100.1 --attachable my-overlay
ue8rewtwd72difwr86gi5wwsl

# -–attachable:允许集群服务间的容器交互连接或者独立的容器之间能够连接。swarm在设计之初是为了service(一组container)而服务的,因此通过swarm创建的overlay网络在一开始并不支持单独的container加入其中。但是在docker1.13, 我们可以通过“–attach” 参数声明当前创建的overlay网络可以被container直接加入。

[root@docker01 ~]# docker network inspect my-overlay
[
    {
        "Name": "my-overlay",
        "Id": "ue8rewtwd72difwr86gi5wwsl",
        "Created": "2024-10-12T06:04:04.784641012Z",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "192.168.100.0/24", # 自定义子网
                    "Gateway": "192.168.100.1"	  # 自定义网关
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": null,
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4098"
        },
        "Labels": null
    }
]

4.将docker02加入集群

# 获取加入集群命令
[root@docker01 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1rqzq4jhf4wm77e8yn6s347sd189u84mr0u042kwxxv05n8bbx-1rv4ae95p4e4y6aztlhkvqtfx 192.168.73.128:2377
    
# 在docker02上执行
[root@docker02 ~]# docker swarm join --token SWMTKN-1-1rqzq4jhf4wm77e8yn6s347sd189u84mr0u042kwxxv05n8bbx-1rv4ae95p4e4y6aztlhkvqtfx 192.168.73.128:2377
This node joined a swarm as a worker.

# docker01 上查询是否加入成功
[root@docker01 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
9fn9iyxhkxvjey06lwhgv7zhb *   docker01   Ready     Active         Leader           26.1.4
4m1xin9edttdt1ljxtzy3q2ab     docker02   Ready     Active                          26.1.4

5.docker01创建容器

[root@docker01 ~]# docker run -d --name=busybox1 --network=my-overlay harbor.linux.com/k8s/busybox:latest /bin/sleep 3600
d8b2749823f570d6c08eccf2df369774323a72628e18e09bc9dfb09735bd00f0

# 查询容器ip
[root@docker01 ~]# docker exec -it busybox1 /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether 02:42:c0:a8:64:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.2/24 brd 192.168.100.255 scope global eth0
       valid_lft forever preferred_lft forever
16: eth1@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever

# 查看网络,可以发现有了容器的IP及LB IP
[root@docker01 ~]# docker network inspect my-overlay
[
    {
        "Name": "my-overlay",
        "Id": "ue8rewtwd72difwr86gi5wwsl",
        "Created": "2024-10-12T14:15:21.812458427+08:00",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "192.168.100.0/24",
                    "Gateway": "192.168.100.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "d8b2749823f570d6c08eccf2df369774323a72628e18e09bc9dfb09735bd00f0": {
                "Name": "busybox1",
                "EndpointID": "225db615a5d654cd813171ed4d07c7f485b362551507dd18125a4405c45b18fb",
                "MacAddress": "02:42:c0:a8:64:02",
                "IPv4Address": "192.168.100.2/24",
                "IPv6Address": ""
            },
            "lb-my-overlay": {
                "Name": "my-overlay-endpoint",
                "EndpointID": "cce907ae37301e39dbd55abcba03e50e562f589f7d08e6c57ace8891d4785747",
                "MacAddress": "02:42:c0:a8:64:03",
                "IPv4Address": "192.168.100.3/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4098"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "9fc55aae1502",
                "IP": "192.168.73.128"
            }
        ]
    }
]

6.docker02创建容器

[root@docker02 ~]# docker run -d --name=busybox2 --network=my-overlay harbor.linux.com/k8s/busybox:latest /bin/sleep 3600
3dd7b088c68f0247d312070bc63e15a697d5e8aa198f7bf53450ea96843cc41b

# 查询容器ip
[root@docker02 ~]# docker exec -it busybox2 /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether 02:42:c0:a8:64:04 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.4/24 brd 192.168.100.255 scope global eth0
       valid_lft forever preferred_lft forever
15: eth1@if16: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever
       
# 查看网络,可以发现有了容器的IP及LB IP
[root@docker02 ~]# docker network inspect my-overlay
[
    {
        "Name": "my-overlay",
        "Id": "ue8rewtwd72difwr86gi5wwsl",
        "Created": "2024-10-12T14:21:11.23116209+08:00",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "192.168.100.0/24",
                    "Gateway": "192.168.100.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "3dd7b088c68f0247d312070bc63e15a697d5e8aa198f7bf53450ea96843cc41b": {
                "Name": "busybox2",
                "EndpointID": "e0b40de6b74e610d1e13318f8420fcaa5b7e8b9bcd9c68f6faaa9931ea72f992",
                "MacAddress": "02:42:c0:a8:64:04",
                "IPv4Address": "192.168.100.4/24",
                "IPv6Address": ""
            },
            "lb-my-overlay": {
                "Name": "my-overlay-endpoint",
                "EndpointID": "4fe0523b017be80ce24bddd8b034633f998e36630b100d3a0468ce02ba4e533d",
                "MacAddress": "02:42:c0:a8:64:05",
                "IPv4Address": "192.168.100.5/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4098"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "9fc55aae1502",
                "IP": "192.168.73.128"
            },
            {
                "Name": "473174a88eb9",
                "IP": "192.168.73.129"
            }
        ]
    }
]       

7.在容器内部互相ping对方

# docker01 ping内外网测试
[root@docker01 ~]# docker exec -it busybox1 /bin/sh
/ # ping 192.168.100.4
PING 192.168.100.4 (192.168.100.4): 56 data bytes
64 bytes from 192.168.100.4: seq=0 ttl=64 time=1.033 ms
64 bytes from 192.168.100.4: seq=1 ttl=64 time=1.702 ms
64 bytes from 192.168.100.4: seq=2 ttl=64 time=2.209 ms
^C
--- 192.168.100.4 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 1.033/1.648/2.209 ms
/ # ping 192.168.100.5
PING 192.168.100.5 (192.168.100.5): 56 data bytes
64 bytes from 192.168.100.5: seq=0 ttl=64 time=0.897 ms
64 bytes from 192.168.100.5: seq=1 ttl=64 time=1.988 ms
64 bytes from 192.168.100.5: seq=2 ttl=64 time=0.893 ms
^C
--- 192.168.100.5 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.893/1.259/1.988 ms
/ # ping www.baidu.com
PING www.baidu.com (182.61.200.7): 56 data bytes
64 bytes from 182.61.200.7: seq=0 ttl=127 time=21.864 ms
64 bytes from 182.61.200.7: seq=1 ttl=127 time=23.486 ms
64 bytes from 182.61.200.7: seq=2 ttl=127 time=23.225 ms
^C
--- www.baidu.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 21.864/22.858/23.486 ms

# docker02 ping内外网测试
[root@docker02 ~]# docker exec -it busybox2 /bin/sh
/ # ping 192.168.100.2
PING 192.168.100.2 (192.168.100.2): 56 data bytes
64 bytes from 192.168.100.2: seq=0 ttl=64 time=1.001 ms
64 bytes from 192.168.100.2: seq=1 ttl=64 time=1.374 ms
64 bytes from 192.168.100.2: seq=2 ttl=64 time=1.990 ms
^C
--- 192.168.100.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 1.001/1.455/1.990 ms
/ # ping 192.168.100.3
PING 192.168.100.3 (192.168.100.3): 56 data bytes
64 bytes from 192.168.100.3: seq=0 ttl=64 time=0.572 ms
64 bytes from 192.168.100.3: seq=1 ttl=64 time=0.999 ms
64 bytes from 192.168.100.3: seq=2 ttl=64 time=1.199 ms
^C
--- 192.168.100.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.572/0.923/1.199 ms
/ # ping www.baidu.com
PING www.baidu.com (182.61.200.6): 56 data bytes
64 bytes from 182.61.200.6: seq=0 ttl=127 time=22.134 ms
64 bytes from 182.61.200.6: seq=1 ttl=127 time=22.375 ms
64 bytes from 182.61.200.6: seq=2 ttl=127 time=22.372 ms
^C
--- www.baidu.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 22.134/22.293/22.375 ms

# Overlay网络ping通内外网的原理
# 内部网络通信:
	1.在Overlay网络中,虚拟机之间的通信通过虚拟隧道进行。每个虚拟机都有一个唯一的IP地址,这个地址在Overlay网络中有效。
	2.当一个虚拟机需要向另一个虚拟机发送数据时,数据会被封装在Overlay报文中,并通过虚拟隧道传输到目标虚拟机。
	3.由于Overlay网络是在物理网络之上构建的,因此虚拟机之间的通信不会受到物理网络细节的影响。
# 外部网络通信:
	1.Overlay网络通常与物理网络相连,以便虚拟机能够访问外部网络。
	2.在这种情况下,虚拟机发出的数据会被封装在Overlay报文中,并通过物理网络的网关或路由器发送到外部网络。
	3.外部网络收到的数据会被解封装,并根据目标IP地址进行路由和转发。

在这里插入图片描述
VXLAN(Virtual eXtensible Local Area Network)是一种网络虚拟化技术,它使用隧道协议将二层以太网帧封装在三层IP报文中,从而实现跨物理网络的二层连接。这里的vxlan:vethXXX表示通过VXLAN隧道连接的虚拟以太网接口,它可能用于将容器的流量封装并通过宿主机发送到外部网络或其他容器。vxlan才是实体,overlay只是网络模型;一句话就是vxlan是overlay网络的一种实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2209910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过docker镜像安装elasticsearch和kibana

目录 前言安装elasticsearch:7.17.21安装对应版本的kibana 前言 本文主要参考&#xff1a;https://blog.csdn.net/qq_23859799/article/details/138521052&#xff0c;内容基本一致&#xff0c;改动了部分错误 安装elasticsearch:7.17.21 拉取镜像&#xff1a;docker pull d…

论文 | Context-faithful Prompting for Large Language Models

主要内容&#xff1a; 这篇文章主要探讨了如何提高大型语言模型 (LLM) 在特定语境下的“忠诚度”&#xff0c;即模型是否能准确理解并提供与上下文相符的答案。文章关注了两个主要问题&#xff1a; 知识冲突&#xff1a; 当上下文中的事实与模型预训练数据中的事实不一致时&a…

树莓派应用--AI项目实战篇来啦-17.YOLOv8目标检测-安全帽检测

1. YOLOv8介绍 YOLOv8是Ultralytics公司2023年推出的Yolo系列目标检测算法&#xff0c;可以用于图像分类、物体检测和实例分割等任务。YOLOv8作为YOLO系列算法的最新成员&#xff0c;在损失函数、Anchor机制、样本分配策略等方面进行了全面优化和创新。这些改进不仅提高了模型的…

WebGl学习使用attribute变量绘制一个水平移动的点

在WebGL编程中&#xff0c;attribute变量是一种特殊类型的变量&#xff0c;用于从客户端传递数据到顶点着色器。这些数据通常包括顶点的位置、颜色、纹理坐标等&#xff0c;它们是与每个顶点直接相关的信息。attribute变量在顶点着色器中声明&#xff0c;并且对于每个顶点来说都…

数据结构-5.4.二叉树的性质

一.二叉树的常考性质&#xff1a; 常见考点1&#xff1a;结点个数的性质 设非空二叉树(度最大为2,最小为0)当中度为0的结点个数为a&#xff0c;度为1的结点个数为b&#xff0c;度为2的结点个数为c&#xff0c;那么abc&#xff1a; 推导过程&#xff1a;设该非空二叉树共有n个…

Go基础知识:切片

数组 Go 数组的大小是固定的&#xff0c;其长度是其类型的一部分&#xff08;[4]int并且[5]int是不同的、不兼容的类型&#xff09; var a [10]intb : [2]string{"Penn", "Teller"} b : [...]string{"Penn", "Teller"}package maini…

计算机专业大一课程:线性代数探秘

计算机专业大一课程&#xff1a;线性代数探秘 对于计算机专业的大一新生来说&#xff0c;线性代数是一门基础且重要的课程。它不仅是数学的一个分支&#xff0c;更是计算机科学中不可或缺的工具。那么&#xff0c;线性代数究竟包含哪些内容&#xff0c;对我们的计算机学习有何…

操作系统(1) (进程属性/内存映像/进程状态/PCB/上下文切换)

目录 1. 进程及其实现 2. 没有进程概念之前的系统 3. 进程的属性 4. 进程的内存映像 5. 进程状态及其转换 6. 进程描述与操作控制结构 操作控制结构&#xff1a; 操作系统使用数据结构来记录进程和系统资源的状态&#xff1a; 进程控制块&#xff08;PCB&#xff09;&a…

libmodbus编程应用(超详细源码讲解)

目录 前言 libmodbus开发库 1.功能概要 2.源码获取 3.libmodbus与应用程序的关系 libmodbus源代码解析 1.核心函数 2.框架分析与数据结构 3.情景分析 &#xff08;1&#xff09;初始化 &#xff08;2&#xff09;主设备发送请求 &#xff08;3&#xff09;主/从设备…

【Adobe PR】Adobe Premiere Pro 快捷键介绍

Adobe Premiere Pro (简称PR) 是一款广泛使用的视频编辑软件&#xff0c;熟练掌握其快捷键可以显著提高编辑效率。下面是整理的一些常用的Adobe Premiere Pro快捷键&#xff0c;适用于Windows和Mac操作系统。对于Mac用户&#xff0c;除非特别指出&#xff0c;通常可以将Ctrl键替…

视频画面变糊是平台在做手脚吗?

人气视频博主“影视飓风”一条新发布的视频被全网下架&#xff0c;这两日更是引起轩然大波&#xff0c;不仅频上热门&#xff0c;甚至还有不少数码与视频同行为其抱不平。那么影视飓风到底发布了一条什么视频&#xff1f;又为何会惨被全网下架呢&#xff1f; 10月8日&#xff0…

Android Studio Ladybug使用经典主题UI

背景 Android Studio Ladybug | 2024.2.1 默认使用new ui&#xff0c;但是已经找不到之前经典主题了。 通过插件方式设置经典主题 打开设置。Plugins。 在Marketplace中搜索&#xff1a;Classic UI 下面的截图是我已经安装完成的。 插件安装完成了&#xff0c;重启as即可。…

闭着眼学机器学习——K近邻分类

引言&#xff1a; 在正文开始之前&#xff0c;首先给大家介绍一个不错的人工智能学习教程&#xff1a;https://www.captainbed.cn/bbs。其中包含了机器学习、深度学习、强化学习等系列教程&#xff0c;感兴趣的读者可以自行查阅。 1. 算法介绍 K近邻(K-Nearest Neighbors, KNN…

ScriptableObject基本使用

使用方法 自定义类继承ScriptableObject 可以在类内部增加数据或者数据类&#xff0c;一般用于配置 注意事项 给继承ScriptableObject的类增加CreateAssetMenu特性。 CreateAssetMenu一般默认三个参数 第一个参数是父目录 第二个参数是父目录的子选项 第三个参数是可以…

虚幻闪烁灯光材质

创建一个材质 材质域改成光照函数 , Time让材质动起来 参数B用来控制速度 , Sine 让灯光闪烁 , Frac 增加了闪烁细节 把材质放到灯光材质上 效果还是挺不错的! 可以用于一些恐怖游戏~

FileZilla的简单使用

FileZilla的下载与安装以及简单使用&#xff08;有图解超简单&#xff09;-CSDN博客 参考这篇文章。 我在Window下安装了客户端&#xff0c;在虚拟机下启动Ubuntu&#xff0c;启用了Ubuntu的FTP服务。 按照该文章的流程进行下去&#xff0c;成功的把客户端上的文件上传到了F…

STM32学习--6-1 定时器定时中断

定时器电路图 第一步&#xff1a;RCC开启时钟&#xff0c;基本上每个代码都是第一步 第二步&#xff1a;选择时基单元的时钟源&#xff08;内部时钟&#xff09; 第三步&#xff1a;配置时基单元&#xff0c;包括预分频器、自动重装器、计数模式等&#xff0c;通过结构体配置…

Dockerfile(Jenkins)

1.创建⼀个jenkins的Dockerfile mkdir tomcat cd tomcat 2、上传需要的安装包 apache-tomcat-8.5.47.tar.gz jdk-8u211-linux-x64.tar.gz jenkins.war 3、编写Dockerfile vim Dockerfile # This my first jenkins Dockerfile # Version 1.0 FROM centos:7 MAINTAINER l…

Echarts+vue3+高德渲染地图

Echartsvue3高德渲染地图 一&#xff1a;安装 npm install echarts二&#xff1a;渲染地图 1. html <template><div class"content"><div ref"myChartsRef" id"map" style"width: 100%;height: 560px;" ></d…

JAVA自动化测试TestNG框架

1.TestNG简介 JAVA自动化测试最重要的基石。官网&#xff1a;https://testng.org 使用注解来管理我们的测试用例。 发现测试用例 执行测试用例 判断测试用例 生成测试报告 2.创建Maven工程 2.1创建一个maven工程 2.2设置maven信息 2.3设置JDK信息 2.4引入testng依赖 <dep…