八、docker的跨主机通讯之macvlan

在实际生产环境中,为了提高系统的健壮性和大规模容器的部署性能要求,需要将容器部署在多个节点上,这个时候就考虑容器之间的通讯问题了。

今天就来介绍一些docker容器的跨主机通讯方式之一:macvlan

macvlan 是将一块物理网卡虚拟成多块虚拟网卡,其原理其实是:正常情况下,一个网卡下面对应一个Mac地址,但是通过在网卡下面配置多个Mac地址而实现虚拟多块网卡。为什么一个IP地址搭配多个Mac地址就能够实现多个网卡的功能呢?这个地方要去好好体会一下TCP/IP中的ARP协议。

复制代码
[root@docker-2-27 ~]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.2 -o parent=ens32 macvlan_20201206  #为了简单设置的网络与宿主机的网络为同一网段
a22940610925b166b99628e903a8152e6a279cfa715fb58b1f2c2def9b933818
[root@docker-2-27 ~]# 
[root@docker-2-27 ~]# docker network ls 
NETWORK ID          NAME                DRIVER              SCOPE
8c3783664027        bridge              bridge              local
2bb25566094c        host                host                local
a22940610925        macvlan_20201206    macvlan             local    #新增了macvlan类型的网络
66221610ad40        none                null                local
[root@docker-2-27 ~]# 
复制代码
复制代码
[root@docker-2-27 ~]# docker run -it --network macvlan_20201206 --ip=10.0.0.121 busybox:latest #在两台宿主机上分别增加一个容器,地址为10.0.0.120/10.0.0.121
/ # ip add 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
5: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:0a:00:00:79 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.121/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping 10.0.0.120
PING 10.0.0.120 (10.0.0.120): 56 data bytes
64 bytes from 10.0.0.120: seq=0 ttl=64 time=2.733 ms
64 bytes from 10.0.0.120: seq=1 ttl=64 time=0.307 ms
^C
--- 10.0.0.120 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.307/1.520/2.733 ms
/ # ping www.baidu.com
PING www.baidu.com (39.156.66.14): 56 data bytes
64 bytes from 39.156.66.14: seq=0 ttl=128 time=41.821 ms
64 bytes from 39.156.66.14: seq=1 ttl=128 time=48.462 ms
^C
--- www.baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 41.821/45.141/48.462 ms
/ # 
复制代码

像这样做之后,容器直接使用宿主机的网卡,性能较好。

需要注意的是,通过MacVLAN创建的网络,docker容器内的IP是不能与parent的网卡互通的。

因为 macvlan 网络会独占物理网卡,即一张物理网卡只能创建一个 macvlan 网络,如果想创建多个 macvlan 网络就得用多张网卡,但主机的物理网卡是有限的,这个时候需要用到VLAN子接口的功能实现,具体可参看

https://blog.csdn.net/dupeng0811/article/details/90387975?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160724313419721942293404%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160724313419721942293404&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-3-90387975.nonecase&utm_term=macvlan&spm=1018.2118.3001.4449

 

posted @   woshinidaye  阅读(513)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言
点击右上角即可分享
微信分享提示