root@ubuntu:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
128956db798a bridge bridge local
19fb1af129e6 host host local
2509b3717813 mac1 macvlan local
d5b0798e725e none null local
2 在 host1 运行容器 c1,并指定使用 macvlan 网络:
root@ubuntu:~# docker run -itd --name c1 --ip=172.16.10.2 --network mac1 busybox
--ip
指定容器 c1 使用的 IP,这样做的目的是防止自动分配,造成 IP 冲突
--network
指定 macvlan 网络
同样在 host2 中运行容器 c2:
root@ubuntu:~# docker run -itd --name c2 --ip=172.16.10.3 --network mac1 busybox
3 在 host1 c1 中 ping host2 c2:
root@ubuntu:~# docker exec c1 ping -c 2 172.16.10.3
PING 172.16.10.3 (172.16.10.3): 56 data bytes
64 bytes from 172.16.10.3: seq=0 ttl=64 time=0.641 ms
64 bytes from 172.16.10.3: seq=1 ttl=64 time=0.393 ms
--- 172.16.10.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.393/0.517/0.641 ms
iptables -t nat -A POSTROUTING -o enp0s8.100 -j MASQUERADE
iptables -t nat -A POSTROUTING -oenp0s8.200 -j MASQUERADE
iptables -A FORWARD -i enp0s8.100 -o enp0s8.200 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i enp0s8.200 -o enp0s8.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i enp0s8.100 -o enp0s8.200 -j ACCEPT
iptables -A FORWARD -i enp0s8.200 -o enp0s8.100 -j ACCEPT
为什么配置 VLAN 子接口,配上 IP 就可以通了,我们可以看下路由表就知道了。
首先看容器 d1 的路由:
root@ubuntu:~# docker exec d1 ip route
default via 172.16.10.1 dev eth0
172.16.10.0/24 dev eth0 scope link src 172.16.10.10
我们在创建容器的时候指定了网关
172.16.10.1
,所以数据包自然会被路由到 host3 的接口。再来看下 host3 的路由:
[root@localhost ~]# ip route
default via 192.168.108.1 dev enp0s3 proto dhcp metric 100
172.16.10.0/24 dev enp0s8.100 proto kernel scope link src 172.16.10.1
172.16.20.0/24 dev enp0s8.200 proto kernel scope link src 172.16.20.1
192.168.56.0/24 dev enp0s8 proto kernel scope link src 192.168.56.122 metric 101
192.168.108.0/24 dev enp0s3 proto kernel scope link src 192.168.108.2 metric 100