docker部署Macvlan实现跨主机网络通信

基本概念:

Macvlan工作原理:

  • Macvlan是Linux内核支持的网络接口。要求的Linux内部版本是v3.9–3.19和4.0+;
  • 通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址。虚拟出来的子接口将直接暴露在相邻物理网络中。从外部看来,就像是把网线隔开多股,分别接受了不同的主机上一样;
  • 物理网卡收到包后,会根据收到包的目的MAC地址判断这个包需要交给其中虚拟网卡。

当容器需要直连入物理网络时,可以使用Macvlan。Macvlan本身不创建网络,本质上首先使宿主机物理网卡工作在‘混杂模式’,这样物理网卡的MAC地址将会失效,所有二层网络中的流量物理网卡都能收到。接下来就是在这张物理网卡上创建虚拟网卡,并为虚拟网卡指定MAC地址,实现一卡多用,在物理网络看来,每张虚拟网卡都是一个单独的接口。

  • 使用Macvlan需要注意以下几点:
  • 容器直接连接物理网络,由物理网络负责分配IP地址,可能的结果是物理网络IP地址被耗尽,另一个后果是网络性能问题,物理网络中接入的主机变多,广播包占比快速升高而引起的网络性能下降问题;
  • 宿主机上的某张网上需要工作在‘混乱模式’下;
  • 前面说到,工作在混乱模式下的物理网卡,其MAC地址会失效,所以,此模式中运行的容器并不能与外网进行通信,但是不会影响宿主机与外网通信;
  • 从长远来看bridge网络与overlay网络是更好的选择,原因就是虚拟网络应该与物理网络隔离而不是共享。

项目环境:

两台docker主机:(centos7)
docker01: 172.16.1.30
docker02: 172.16.1.31

项目操作:

实例一:macvlan跨主机单网络解决方案:

docker01:

(1)开启ens33网卡的混杂模式,开启网卡的多个虚拟interface(接口)
[[email protected] ~]# ip link set ens33 promisc on
##查看网卡的状态:
[[email protected] ~]# ip link show  ens33

(2)创建macvlan网络:
[[email protected] ~]# docker network  create -d macvlan --subnet 172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1

参数解释:
-o: 绑定在哪张网卡之上(基于ens33网卡)

(3)基于刚创建的网络运行一个容器:
[[email protected] ~]# docker run -itd --name box1 --ip 172.16.100.10 --network mac_net1 busybox

docker02:(与docker01相同操作)

开启混杂模式
[[email protected] ~]# ip link set ens33 promisc on
[[email protected] ~]# ip link  show ens33

//创建macvlan网络
[[email protected] ~]# docker network  create  -d macvlan --subnet  172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1
//运行一个容器:
[[email protected] ~]# docker run -itd --name box2 --network mac_net1 --ip 172.16.100.20 busybox

(4)测试两个主机间的两个容器相互通信:

注意事项:
能ping通的原因是两个容器都是基于真实的ens33网卡的,所以宿主机上的ens33网卡必须能够相互通信。这种方式只能够ping通ip地址,是无法ping通容器名的。

实例二:macvlan跨主机多网络解决方案:

(1)首先查看主机内核的8021q模块:
[[email protected] ~]# modinfo  8021q

##如果没有查看到该模块,需要执行以下命令进行加载:
[[email protected] ~]# modprobe  8021q
开启路由转发:
[[email protected] ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf
[[email protected] ~]# sysctl -p
net.ipv4.ip_forward = 1

(2)修改网络配置信息:
docker01:

[[email protected] ~]# cd /etc/sysconfig/network-scripts/
[[email protected] network-scripts]# ls


[[email protected] network-scripts]# vim ifcfg-ens33

基于ens33网卡进行创建子网卡:

[[email protected] network-scripts]# cp -p ifcfg-ens33  ifcfg-ens33.10  #网卡名称自定义
[[email protected] network-scripts]# cp -p ifcfg-ens33  ifcfg-ens33.20

-p:表示保留原有属性(权限)

//修改ens33.10网卡:
[[email protected] network-scripts]# vim ifcfg-ens33.10
##只保留以下选项:

//修改ens33.20网卡:
[[email protected] network-scripts]# vim ifcfg-ens33.20
配置与ens33.10相同,只需修改ip地址:

(3)启动子网卡

[[email protected] network-scripts]# ifup ifcfg-ens33.10
[[email protected] network-scripts]# ifup ifcfg-ens33.20 
//查看网络信息
[[email protected] network-scripts]# ifconfig

(4)基于ens33.10和ens33.20创建macvlan网络:
注意:网段不同,网络名称不同

[[email protected] ~]# docker network  create -d macvlan --subnet 172.16.200.0/24 --gateway 172.16.200.1 -o parent=ens33.10 mac_net10

[[email protected] ~]# docker network  create -d macvlan --subnet 172.16.210.0/24 --gateway 172.16.210.1 -o parent=ens33.20 mac_net20

(5)基于以上网络分别运行2个容器:

[[email protected] ~]# docker run -itd --name test1 --ip 172.16.200.10 --network mac_net10 busybox

[[email protected] ~]# docker run -itd --name test2 --ip 172.16.210.10 --network mac_net20 busybox

部署docker02:
基本与docker01操作相同,注意网段的相同,但主机ip得不同。
#以下操作将不做解释:

开启路由转发:
[[email protected] ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf
[[email protected] ~]# sysctl -p
net.ipv4.ip_forward = 1
[[email protected] network-scripts]# pwd
/etc/sysconfig/network-scripts
[[email protected] network-scripts]# vim ifcfg-ens33 

[[email protected] network-scripts]# cp -p ifcfg-ens33  ifcfg-ens33.10
[[email protected] network-scripts]# cp -p ifcfg-ens33  ifcfg-ens33.20

[[email protected] network-scripts]# vim ifcfg-ens33.10

[[email protected] network-scripts]# vim ifcfg-ens33.20

[[email protected] network-scripts]# ifup ifcfg-ens33.10
[[email protected] network-scripts]# ifup ifcfg-ens33.20
//创建macvlan网络:
[[email protected] ~]# docker network  create  -d macvlan  --subnet 172.16.200.0/24 --gateway 172.16.200.1 -o parent=ens33.10 mac_net10

[[email protected] ~]# docker network  create  -d macvlan  --subnet 172.16.210.0/24 --gateway 172.16.210.1 -o parent=ens33.20 mac_net20
//运行容器(ip地址不同):
[[email protected] ~]# docker run -itd --name  test3 --network mac_net10 --ip 172.16.200.11  busybox

[[email protected] ~]# docker run -itd --name  test4 --network mac_net20 --ip 172.16.210.11  busybox

//确保容器正常运行

(6)测试容器之间能够跨主机通信:(注意:如果你是vmware环境的话,由于VMware虚拟机的原因,必须将两台主机默认的NAT模式修改为桥接模式才能够正常通信)
test3与test1通信(相同网段):

test4与test2通信(相同网段):

排错思路:如果部署完主机间无法通信的话,首先确认防火墙或iptables规则是否关闭或放行,是否禁用selinux,其次排查ens33的网卡配置文件及其子网卡内容是否修改错误,最后排查你创建macvlan网络是是否网段定义错误,或者在运行容器是否ip地址指定不正确。

----------------------macvlan多网络跨主机实现通信部署完毕---------------------

扩展知识点:
假设我们运行了一个t1容器,然后t2容器使用t1容器的网络栈。

[[email protected] ~]# docker run -itd --name   t1 busybox
[[email protected] ~]# docker exec t1 ip a

[[email protected] ~]# docker run -it --name t2 --network container:t1 busybox

//接下来在t1容器中操作:
[[email protected] ~]# docker exec -it   t1 bin/sh


然后在t2容器中也可以看到此服务:

以上就是部署网络栈的基本内容,自己也不是经常用到,就是为了实现其他容器能够共享其中一个容器中的资源。

———————— 本文至此结束,感谢阅读 ————————

原文地址:https://blog.51cto.com/13972012/2446646

时间: 2024-09-29 06:27:19

docker部署Macvlan实现跨主机网络通信的相关文章

Docker学习总结之跨主机进行link

Docker学习总结之跨主机进行link Docker的功能非常强大,但要想驾驭好Docker却不是一件很容易的事情.下面就介绍一种日常工作中会遇到的一个user case.比如现在有两台host,分别标记为hostA和hostB.hostA用来运行oracle服务,hostB用来运行app服务. hostB中app产生的数据需要实时写入hostA中的oracle数据库.也就是hostB中的docker container需要link hostA中的docker container. 为了解决这

centos7下安装docker(15.3跨主机网络-macvlan)

除了ovrlay,docker还开发了另一个支持跨主机容器的driver:macvlan macvlan本身是linu kernel模块,其功能是允许在同一物理网卡上配置多了MAC地址,即:多个interface,每个interface可以配置自己的ip.macvlan本身是一种网卡虚拟化技术,Docker用macvlan实现容器网络就不奇怪了 macvlan最大的优点是性能极好,相比其他方案,macvlan不需要创建Linux bridge,而是直接通过以太interface连接到物理网络.

centos7下安装docker(14.2跨主机网络-overlay)

为支持容器跨主机通信,Docker提供了overlay driver,使用户可以创建基于VxLAN的overlay网络.VxLAN可将二层数据封装到UDP进行传输,VxLAN提供与VLAN相同的以太网二层服务,但是拥有更强的扩展性和灵活性. Docker overlay网络需要一个key-value数据库用于保存网络信息状态,包括Network,Endpoint,IP等.Consul,Etcd和Zookeeper都是docker支持的key-value软件,今天讨论的是consul 试验环境描述

Docker:使用Ambassador进行跨主机间容器通信

由于Docker自身的网络的原因,想要在多主机间的容器之间进行通信是比较麻烦的事情.可以利用Ambassador容器来实现这一功能. 基本原理: 利用Ambassador来实现主机间容器进行通信时,需要在两台需要通信的容器的主机上都启动Ambassador容器.由Ambassador容器提供数据转发服务. 当客户端主机上的容器client_container想要同服务器端主机上的容器server_container通信时,client_container容器直接访问同一台主机上运行的client

centos7下安装docker(15.6docker跨主机网络---Weave)

Weave是weaveworks开发的容器网络解决方案.weave创建的虚拟网络可以将部署在多个主机上的容器连接起来.对于容器来说,weave就像一个巨大的网络交换机,容器可以直接通信,无需NAT和端口映射.除此之外,weave的DNS模块是容器可以通过hostname访问 weave不依赖分布式数据库(例如:consul和etcd)交换网络信息,每个主机上只需要运行weave组件就能建立起跨主机容器网络,weave网络能够穿透防火墙并运行在部分连接的网络上,weave支持加密网络接连,用户可以

Docker容器跨主机多网段通信解决方案

实现Docker的跨主机网络通信的方案有很多,比如在之前博文中写到的通过部署consul服务实现Docker容器跨主机通信 ,但是consul服务并不能实现多个网段跨主机进行通信,在这种情况之下,MacVlan的概念就应用而生了. Macvlan工作原理: Macvlan是Linux内核支持的网络接口.要求的Linux内部版本是v3.9–3.19和4.0+: 通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址.虚拟出来的子接口将直接暴露在相邻物理网络中.从

docker的跨主机网络Overlay,MacVlan网络的实现

让外网能否访问容器的端口映射方法: 1.手动指定端口映射关系 两台虚拟机,第一台映射端口(第二台访问宿主机端口,就是访问容器端口 curl 192.168.1.1:90 .)docker run -itd --name web1 -p 90:80 nginx:latest 2>从宿主机随机映射端口到容器,docker run -itd --name web2 -p 80 nginx:latest 3>从宿主机随机映射端口到容器,容器内所有暴漏端口,都会一一映射.docker run -itd

部署Flannel,实现跨主机Docker容器通信

flannel(flannel is a virtual network that attaches IP addresses to containers) 两个主机下的Docker容器之间是不互通的,通过部署flannel,对docker容器的ip进行规划,就能实现跨主机容器之间的通信. 官方文档:https://coreos.com/flannel/docs/latest/flannel-config.html 以下介绍Flannel的部署 机器配置如下 hostname ip 系统版本 e

Docker:macvlan实现容器跨主机通信 [十四]

一.什么是macvlan 1.macvlan 本身是 linux kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址, 2.即多个 interface,每个 interface 可以配置自己的 IP. 3.macvlan 本质上是一种网卡虚拟化技术 二.跨主机通信 1.创建macvlan 1.主机luoahong [[email protected] ~]# docker network create --driver macvlan --subnet 10.0.0.0/2