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 --name web4 -P nginx:latest

Join容器:container(共享网络协议栈)
容器和容器之间。
docker run -itd --name web5 busybox
docker run -itd --name web6 --network container:web5 busybox:latest

docker exec -it web6 /bin/sh
echo 6666666 > /tmp/index.html
httpd -h /tmp/

docker exec -it web5 /bin/sh
get -O - -q 127.0.0.1
6666666

这时会发现,两个容器的ip地址一样。

PS:这种方法的使用场景:
由于这种网络的特殊性,一般在运行同一服务,并且合格服务需要做监控,以及日志收集,或者网络监控的时候,可以选择这种网络。

Docker的跨主机网络解决方案。

overlay 的解决方案。
实验:
作业:
1)实现容器的跨主机通信,使用Overlay网络的方式实现。
2)准备3台dockerHost,基于上述创建的Overlay网络创建容器服务。 docker01上基于busybox镜像运行服务,名称为:自己名称+t1. docker02上基于busybox镜像运行服务,名称为:自己名称+t2. docker03上基于busybox镜像运行服务,名称为:自己名称+t3.
3)要求容器使用指定网段,10.10.10.0/16网段。 IP地址分别为:
t1: 10.10.10.6 t2: 10.10.10.8 t3: 10.10.10.10
4) 要求3个容器可以分别实现IP和容器名称的通信。
myprogrium-consul.tar
实验环境consul :是数据中心
docker01 docker02 docker03
192.168.1.1 ,192.168.1.20 ,192.168.1.30

暂时不考虑防火墙,和selinux安全问题。
将三台dockerhost防火墙和selinux全部关闭,并且分别更改主机名为,docker01 docker02 docker03

更改主机名。
hostnamectl set-hostname docker01
su -
关闭防火墙。
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0

在docker上操做
导入

docker run -d -p 8500:8500 -h consul --name consul --restart always progrium/consul -server -bootstrap
PS:容器生产,之后,我们可以通过浏览器访问consul服务,验证consul服务是否正常,访问dockerHost加映射端口。

如果出现这个,是因为刚更改防火墙需重启docker

systemctl restart docker
docker start consul
访问consul
http://192.168.1.1:8500/ui/#/dc1/services

修改docker02和docker03上的docker配置文件,
vim /usr/lib/systemd/system/docker.service (加)

/var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store
=consul://192.168.1.1:8500 --cluster-advertise=ens33:2376

保存退出
重启
systemctl daemon-reload
systemctl restart docker (重启docker)
返回浏览器192.168.1.1的consul界面



在,docker02上创建一个自定义网络,
docker network create -d overlay --subnet 10.10.10.0/16 ov_net1
docker network create -d overlay ov_net1
docker network ls(2,3台都会有)


在docker02上创建的网络,我们可以看到它的scope定义的是global(全局),意味着加入到consul这个服务的docker服务,都可以看到我们自定义的网络,

同理如果是用此网络创建的容器,会有两张网卡。
默认这张网卡,的网段是10.0.0.0网段,如果想要docker01也可能看到这个网络,那么也只在docker01的docker配置文件添加相应内容即可
注意global;表示全局的意思

同理,因为是自定义网络,符合自定义网络的特性,可以直接通过docker容器的名称相互通信,当然也可以在自定义网络的时候,指定它的网段,那么使用此网络的容器也可以指定IP地址。

在docker01上也添加

并重启
systemctl stop docker.service
systemctl start docker.service

在docker01 -----docker03上创建t1,t2,t3
自己的名称+t1,t2,t3

指定IP地址
docker run? -itd --name lbst1 --network ov_net1 --ip 10.10.10.6 busybox:latest
docker run? -itd --name lbst1 --network ov_net1 --ip 10.10.10.8 busybox:latest
docker run? -itd --name lbst1 --network ov_net1 --ip 10.10.10.10 busybox:latest
不指定IP地址
docker run -itd --name t1 --network ov_net1 busybox:latest
docker run -itd --name t2 --network ov_net1 busybox:latest
docker run -itd --name t3 --network ov_net1 busybox:latest

进入t1 ping docke02到03
docker exec -it t1 /bin/sh

进入t2ping docker01与 03

进入t3ping docker01与 02

另一种跨主机网络MacVlan
Docker 跨主机网络方案之MacVlan

实验环境:vlan(局域网)
Docker01 docker02
192.168.1.1 192.168.1.20
关闭防火墙和禁用selinux,更改主机名。
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
关闭防火墙与selinux,需要重启一下docker
systemctl daemon-reload
systemctl restart docker

Macvlan的单网络通信

1》打开网卡的混杂模式(需要在docker02到docker01都需要开启)
ip link show ens33(查看网卡)
开启混杂模式
ip link set ens33 promisc on
2》在docker01上创建macvlan网络
docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1

PS: -o parent=绑定在那张网卡之上。
3》基于创建的macvlan网络运行一个容器
docker run -itd --name bbox1 --ip 172.22.16.10 --network mac_net1 busybox
4>在dcker02上创建的macvlan网络,注意与docker1上的macvlan网络一摸一样
docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1
5》在docker2上,基于创建的macvlan网络运行一个容器,验证与docker01容器的通信
docker run -itd --name bbox2 --network mac_net1 --ip 172.22.16.20 busybox

Macvlan的多网络通信(真实接口不够用的问题)

验证内核模块8021q封装
Macvlan需要解决的问题,基于真实的ens33网卡,生产新的虚拟网卡
1》Docker01到docker02验证内核模块
modinfo 8021q

如果内核模块没有开启,加载内核模块
modprobe 8021q

> 2》基于ens33创建虚拟网卡
cd /etc/sysconfig/network-scripts/
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改ens33网卡的配置文件

手动添加虚拟网卡的配置文件
cp -p ifcfg-ens33 ifcfg-ens33.10

PS: -p保留源文件或目录的属性

修改ens33.10


创建第二个虚拟网卡配置文件
cp -p ifcfg-ens33.10 ifcfg-ens33.20
vim ifcfg-ens33.20

3》Docker01上的操做启用创建的虚拟网卡
ifup ifcfg-ens33.10
ifup ifcfg-ens33.20

4》基于虚拟网卡,创建macvlan的网络
docker network create -d macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33.10 mac_net10

docker network create -d macvlan --subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=ens33.20 mac_net20

scp -p ifcfg-ens33.10 ifcfg-ens33.20 192.168.1.20:/etc/sysconfig/network-scripts/

创建容器(docker01到docker02)
docker run -itd --name bbox10 --network mac_net10 --ip 172.16.10.10 192.168.1.1:5000/test:latest

docker run -itd --name bbox20 --network mac_net20 --ip 172.16.20.20 192.168.1.1:5000/test:latest

5》基于上述创建的macvlan网络,运行对应的容器,不过这里需要注意,运行的容器与网络对应的网段相符合,还需注意,ip地址的唯一性。

6》在docker02上进行操做,创建网络机容器
这里只需要,我们在这里的操做跟docker01上的一摸一样,操做顺序大致为:
1.验证8021q内核封装
2.基于ens33网卡创建新的虚拟网卡,esn33.10和ens33.20(注意和docker01上ens33.10和ens33.20必须是在同一网段,且ip不能冲突)
3.基于此网络运行容器,(注意和docker01上的容器,都是基于刚刚创建的macvlan网络,但ip地址不能冲突)

7》验证:
注意:Vmware的网络必须是桥接(Bridge)
在docker01上进入容器bbox10和docker02上的bbox1进行通信
在docker01上进入容器bbox20和docker02上的bbox21进行通信

个人总结:macVlan网络的实现原理及步骤
原理:
1.基于宿主机的网卡的修改配置多个虚拟网卡。
2.基于虚拟网卡创建macvlan网络
3.基于虚拟网络创建要求的容器
步骤:1.验证8021q内核封装
2.基于ens33网卡创建新的虚拟网卡,esn33.10和ens33.20(注意和docker01上ens33.10和ens33.20必须是在同一网段,且ip不能冲突)
3.基于此网络运行容器,(注意和docker01上的容器,都是基于刚刚创建的macvlan网络,但ip地址不能冲突)

原文地址:https://blog.51cto.com/13911055/2468509

时间: 2024-09-28 21:33:18

docker的跨主机网络Overlay,MacVlan网络的实现的相关文章

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

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

docker之跨主机通信

本地workstations虚拟机server1和server2环境为centOS7.7,安装软件为docker-ce,docker版本为19.03.05docker安装就不介绍了,直接进主题.一.准备工作跨主机需要两个独立的网卡:server1和server2添加网卡 [[email protected] ~]# ip addr show 查看网卡是否添加成功 添加成功. macvlan本身是linxu kernel的模块,本质上是一种网卡虚拟化技术.其功能是允许在同一个物理网卡上虚拟出多个网

Docker容器跨主机通信之:OVS+GRE

一.概述 由于docker自身还未支持跨主机容器通信,需要借助docker网络开源解决方案 OVS OpenVSwich即开放式虚拟交换机实现,简称OVS,OVS在云计算领域应用广泛,值得我们去学习使用. OpenVSwich OpenVSwich是一种开源软件,通过软件的方式实现二层交换机功能,专门管理多租赁云计算网络环境,提供虚拟网络中的访问策略.网络隔离.流量监控等. 既然是虚拟交换机,自然与传统的物理交换机有着相同的特性,操作中可以按照理解物理交换机的方式去操作,有助于对虚拟交换机的认识

Docker容器跨主机通信之:直接路由方式

概述 就目前Docker自身默认的网络来说,单台主机上的不同Docker容器可以借助docker0网桥直接通信,这没毛病,而不同主机上的Docker容器之间只能通过在主机上用映射端口的方法来进行通信,有时这种方式会很不方便,甚至达不到我们的要求,因此位于不同物理机上的Docker容器之间直接使用本身的IP地址进行通信很有必要.再者说,如果将Docker容器起在不同的物理主机上,我们不可避免的会遭遇到Docker容器的跨主机通信问题.本文就来尝试一下. 方案原理分析 由于使用容器的IP进行路由,就

第 8 章 容器网络 - 057 - macvlan 网络隔离和连通

macvlan 网络隔离和连通 验证 macvlan 之间的连通性. bbox1 能 ping 通 bbox3,bbox2 能 ping 通 bbox4. 即:同一 macvlan 网络能通信. bbox1 无法 ping 通 bbox2 和 bbox4. 即:不同 macvlan 网络之间不能通信. 但更准确的说法应该是:不同 macvlan 网络不能 在二层上 通信. 在三层上可以通过网关将 macvlan 连通,下面我们就启用网关. 将 Host 10.12.31.21 配置成一个虚拟路由

利用虚拟网桥实现Docker容器的跨主机访问

最近在研究Docker,Docker的网络配置是比较令人头疼的部分,尤其是跨主机的容器间通信,很多解决方案都比较复杂,这里,我只用虚拟网桥来实现Docker的跨主机访问,分享出来,希望对Docker学习的各位有一定的启发. 基本思想: 由于Docker容器通过docker0 网桥实现同一主机间中,容器的ip地址分配和访问,所以,如果希望Docker跨主机访问,最简单的方式就是将不同主机的docker0 设置为同一网段. 那么怎么实现跨主机呢?我这里将本机网卡也通过网桥来连接,那么,整体网络拓扑结

Docker容器的跨主机连接

Docker容器的跨主机连接 使用网桥实现跨主机容器连接 网络拓扑 网络连接使用的是Bridge 操作 修改/etc/network/interfaces文件,分配静态IP地址 1.auto br02.iface br0 inet static3.address 10.211.55.34.netmask 255.255.255.05.gateway 10.211.55.16.bridge_ports eth0 修改/etc/default/docker文件,限定分配IP地址段,防止冲突 1.-b

跨主机通信

JOIN容器:container(共享网络协议栈) 容器和容器之间. [[email protected] ~]# docker pull busybox [[email protected] ~]# docker run -itd --name web5 busybox:latest 把网卡指定web5: [[email protected] ~]# docker run -itd --name web6 --network container:web5 busybox:latest Web6

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

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