一、跨主机网络解决方案
1.docker原生的overlay和macvlan
2.第三方的flannel、weave、calico
1.2这些解决方案怎么和docker集成在一起?
libnetwork(docker容器网络库,
其中CNM (ContainerNetworkModel)是它的核心,它对容器网络进行了抽象)
1.3macvlan网络方案实现(使用的是linux内核虚拟化技术,无需桥接,直接使用物理接口, 性能极好)
Macvlan是一个新的尝试,是真正的网络虚拟化技术的转折点。
Linux实现非常轻量级,因为与传统的Linux Bridge隔离相比,
它们只是简单地与一个Linux以太网接口或子接口相关联,以实现网络之间的分离和与物理网络的连接。
Macvlan提供了许多独特的功能,并有充足的空间进一步创新与各种模式。
这些方法的两个高级优点是绕过Linux网桥的正面性能以及移动部件少的简单性。
删除传统上驻留在Docker主机NIC和容器接口之间的网桥留下了一个非常简单的设置,包括容器接口,直接连接到Docker主机接口。
由于在这些情况下没有端口映射,因此可以轻松访问外部服务。
二、实验准备
(1)两台虚拟机server1和server2
清理掉之前的容器,删除自定义网络
清除两台主机上之前有关网络的设置
[root@server1 ~]# docker network prune 删除所有没有用的网卡
WARNING! This will remove all networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
my_net2
my_net1
[root@server1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
786dfb545dfd bridge bridge local
18863c9f4ba7 host host local
0e2c1989739c none null local
两台虚拟机上添加两块虚拟网卡,,并激活新添加的网卡;并安装好相应的docker服务(因为我们模拟的是docker容器的跨主机访问)
[root@server1 ~]# ip addr show 查看添加的网卡
[root@server2 ~]# ip addr show
激活网卡
[root@server2 ~]# ip link set up ens38
[root@server1 ~]# ip link set up ens39
打开网卡混杂模式
[root@server2 ~]# ip link set ens38 promisc on
[root@server1 ~]# ip link set ens39 promisc on
注意:如果不开启混杂模式,会导致macvlan网络无法访问外界
具体在不使用vlan时,表现为无法ping通路由,无法ping通同一网络内其他主机
三、开始在两台主机上各创建macvlan网络
3.1创建macvlan网络不同于桥接模式,需要指定网段和网关(因为要保证跨主机上网段和网关是相同的),并且都得是真实存在的
在server1上
[root@server1 ~]# docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=ens39 macvlan1
99b8434a4a3386377ab39d113c385d538fbbf641316039b754e729f682c6e088
[root@server1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
786dfb545dfd bridge bridge local
18863c9f4ba7 host host local
99b8434a4a33 macvlan1 macvlan local
0e2c1989739c none null local
在server2上
[root@server2 ~]# docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=ens38 macvlan1
63394560a92b87f517f235f64a95797ab6f6d5ed9585b8f82eb1b3bcdc9e67ab
[root@server2 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
43a7f9cc642b bridge bridge local
ec8757b5c70e host host local
63394560a92b macvlan1 macvlan local
c73db7e6bb7d none null local
在两台主机上分别使用创建的macvlan1运行一个容器
运行容器,macvlan模型这里必须手动指定ip地址,如果不指定会自动分配,单调 递增,可能会冲突
[root@server2 ~]# docker run -it --name vm2 --network macvlan1 --ip 172.20.0.12 ubuntu
[root@server1 ~]# docker run -it --name vm1 --network macvlan1 --ip 172.20.0.11 ubuntu
访问测试:sever2容器vm2中ping server1的vm1容器
其实这就实现了不同宿主机上的容器之间的通信
macvlan模式不依赖网桥,所以brctl show查看并没有创建新的bridge
[root@server1 ~]# brctl show 没有桥接在br0上'
bridge name bridge id STP enabled interfaces
docker0 8000.024289ff8a42 no
容器接口直接与主机网卡相连,无需NAT或端口映射
macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094
只需要在创建容器时使用vlan子接口就可以解决:
server1上
[root@server1 ~]# docker network create -d macvlan --subnet 172.21.0.0/24 --gateway 172.21.0.1 -o parent=ens39.1 macvlan2
125da079356597981b114bc96d0862b6d2cb3211f5b21a3739de4e9d351a69c0
[root@server1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
786dfb545dfd bridge bridge local
18863c9f4ba7 host host local
99b8434a4a33 macvlan1 macvlan local
125da0793565 macvlan2 macvlan local
0e2c1989739c none null local
[root@server2 ~]# docker network create -d macvlan --subnet 172.21.0.0/24 --gateway 172.21.0.1 -o parent=ens38.1 macvlan2
ef5870a887a94d360b305df25f3f9476c65f1c8f8ac53b7881dad056dac6f194
[root@server2 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
43a7f9cc642b bridge bridge local
ec8757b5c70e host host local
63394560a92b macvlan1 macvlan local
ef5870a887a9 macvlan2 macvlan local
c73db7e6bb7d none null local
[root@server1~]# docker run -it --name vm3 --network macvlan2 --ip 172.21.0.11 ubuntu
[root@server2 ~]# docker run -it --name vm5 --network macvlan2 --ip 172.21.0.12 ubuntu
实现了不同宿主机上的容器之间的通信,也解决了独占网卡的问题
两个容器互相ping对方ip
注意macvlan网络在二层是隔离的,所以不同macvlan容器不能通信,可以在三层通设置过网关连接(加路由),docker本身不做任何限制,像传统vlan那样管理即可。网络选型时对网络比较熟悉,选macvlan较好,因为只需要把网络设备调整好,docker方面基本不用做 什么调整’ 。