跨主机容器网络
1. 理论
- 跨主机网络解决方案
docker原生的overlay和macvlan
- 第三方的flannel、weave、calico
众多网络方案是如何与docker集成在一起的
libnetwork docker容器网络库
CNM (Container Network Model)这个模型对容器网络进行了抽象
- CNM分三类组件
Sandbox:容器网络栈,包含容器接口、dns、路由表。(namespace)
Endpoint:作用是将sandbox接入network (veth pair)
Network:包含一组endpoint,同一network的endpoint可以通信。
2. macvlan网络方案实现
- Linux kernel提供的一种网卡虚拟化技术。(内核自带)
无需Linux bridge,直接使用物理接口,性能极好。
- 下面步骤的操作在截图中
- 在两台docker主机上各添加一块网卡,打开网卡混杂模式:
-
- 在两台docker主机上各创建macvlan网络:
-
- macvlan网络结构分析:
没有新建linux bridge
容器的接口直接与主机网卡连接,无需NAT或端口映射。
[root@server2 ~]# brctl show
bridge name bridge id STP enabled interfaces
br-283cf1fc96c1 8000.02426d0e4f33 no
docker0 8000.024257e101e8 no
- macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
- vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094。
- macvlan网络间的隔离和连通
macvlan网络在二层上是隔离的,所以不同macvlan网络的容器是不能通信的。
可以在三层上通过网关将macvlan网络连通起来。
docker本身不做任何限制,像传统vlan网络那样管理即可。
2.1 前期设置,设置俩个网卡
[root@server1 ~]# cd harbor/
[root@server1 harbor]# docker-compose down ##换成stop
server1和server2都添加成俩个网卡
2.2 实现不同主机之间通信
##server1和server2同样的操作
[root@server1 ~]# ip link set up eth1
[root@server1 ~]# ip link set eth1 promisc on ##打开混杂模式PROMISC
[root@server1 ~]# ip addr show eth1
36: eth1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:64:dd:fd brd ff:ff:ff:ff:ff:ff
inet6 fe80::5054:ff:fe64:ddfd/64 scope link
valid_lft forever preferred_lft forever
[root@server1 ~]# docker network create -d macvlan --subnet 172.21.0.0/24 --gateway=172.21.0.1 -o parent=eth1 mac_net1
##使用eth1网卡
[root@server1 ~]# docker inspect mac_net1 | grep "parent"
"parent": "eth1"
[root@server1 ~]#
[root@server1 ~]# docker run -it --rm --network mac_net1 --ip 172.21.0.11 busybox
WARNING: IPv4 forwarding is disabled. Networking will not work.
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
37: eth0@if36: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:15:00:0b brd ff:ff:ff:ff:ff:ff
inet 172.21.0.11/24 brd 172.21.0.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ping 172.21.0.12
PING 172.21.0.12 (172.21.0.12): 56 data bytes
64 bytes from 172.21.0.12: seq=0 ttl=64 time=0.375 ms
2.3 vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094。
3. docker network子命令
- docker network子命令
connect 连接容器到指定网络
create 创建网络
disconnect 断开容器与指定网络的连接
inspect 显示指定网络的详细信息
ls 显示所有网络
rm 删除网络