码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2020-01-28 21:12:46      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:镜像   自定义   ice   网卡   进入   wal   gate   作业   bst   

让外网能否访问容器的端口映射方法:

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地址不能冲突)

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

标签:镜像   自定义   ice   网卡   进入   wal   gate   作业   bst   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!