原文链接:WorkMap技术博客-Docker网络
简介
Docker的IPvlan网络驱动,基于最新的Linux网络虚拟化技术。它的实现非常轻量级,不使用传统的Linux网桥隔离,容器可以直接连接到主机的网络设备接口,提升网络性能。
参数
-
ipvlan_mode
设置IPvlan的操作模式。可以是以下之一:l2,l3,l3s,默认为l2;
-
ipvlan_flag
设置IPvlan模式标志。可以是以下之一:bridge,private,vepa,默认是bridge;
-
parent
指定要使用的父接口。
前置条件
Linux内核v4.2+(支持早期内核版本,但可能有bug)
IPvlan L2 模式
连接到主机的eth0设备
- 查看主机的eth0网络设备
ip addr show eth0
- 创建IPvlan网络,用主机上的eth0作为父设备,使用l2模式
docker network create -d ipvlan \ --subnet=192.168.1.0/24 \ --gateway=192.168.1.1 \ -o ipvlan_mode=l2 \ -o parent=eth0 db_net
- 启动容器,连接到IPvlan网络
docker run --net=db_net -it --rm alpine /bin/sh
- 这种模式下的容器网络架构如下图所示:
与bridge网络的区别,简化了网络架构,不需要经过docker0桥接
基于801.2q协议的Vlan作为parent
- 创建ipvlan网络ipvlan20,parent是id为20的Vlan
docker network create -d ipvlan \ --subnet=192.168.20.0/24 \ --gateway=192.168.20.1 \ -o parent=eth0.20 ipvlan20
eth0.20的格式为interface_name.vlan_tag,使用这种标准格式,docker会自动创建id为20的虚拟eth网络设备。
- 查看主机网络,会新增一个网络设备eth0.20
ip link
- 创建连接到ipvlan20的容器,并进入到容器
docker run --net=ipvlan20 -it --name ivlan_test1 --rm alpine /bin/sh
可以在容器内执行
ip link
查看容器网络接口
可以创建多个vlan,不同的容器集合连接到不同的vlan网络,网络架构图如下所示:
IPvlan L3模式
IPvlan L3模式会丢弃所有广播和多播流量。所以,可以使用IPvlan L3模式进行大规模和可预测网络的集成。通过IPvlan L2模式,隔离一些vlans,这些vlans通过交换机交换数据。然后通过IPvlan L3模式在边缘进行路由,这样可以将故障域缩小到本地主机。
L3模式需要在默认命名空间中有一个单独的子网,因为它需要一个指向IPvlan父接口的netlink路由。
本示例中使用的父接口是eth0,它位于子网192.168.1.0/24上。注意,创建的docker网络与主机的eth0不在同一个子网中。
与IPvlan L2模式不同,只要它们共享相同的父接口-o parent=,不同的子网/网络可以相互ping通。
- 创建IPvlan L3网络
docker network create -d ipvlan \ --subnet=192.168.214.0/24 \ --subnet=10.1.214.0/24 \ -o ipvlan_mode=l3 ipnet210
- 创建两个容器,连接到ipnet210
docker run --net=ipnet210 --ip=192.168.214.10 -itd alpine /bin/sh docker run --net=ipnet210 --ip=10.1.214.10 -itd alpine /bin/sh
- 创建一个新容器,ip为192.168.214.9,测试能否ping通10.1.214.10容器
docker run --net=ipnet210 --ip=192.168.214.9 -it --rm alpine ping -c 2 10.1.214.10
- 创建一个新容器,ip为10.1.214.9 ,测试能否ping通10.1.214.10容器
docker run --net=ipnet210 --ip=10.1.214.9 -it --rm alpine ping -c 2 192.168.214.10