0

首先,我知道使用基于 ip 命令的标记创建 VXLAN 接口:

ip link add vxlan-br0 type vxlan id <tag-id> group <multicast-ip> local <host-ip> dstport 0

但是对于我的实际需求是没有用的,我的需求是用不同的标签来隔离多个docker容器,比如:

brctl addif br1 veth111111 tag=10 # veth111111 is the netdev used by docker container 1 brctl addif br1 veth222222 tag=20 # veth222222 is the netdev used by docker container 2 brctl addif br1 veth333333 tag=10 # veth111111 is the netdev used by docker container 3

我想将容器 2 与容器 1 和 3 隔离,并且不隔离容器 1 和 3 之间的通信。如何实现这一点?

4

1 回答 1

0

添加两个桥接网络将提供隔离。

docker create network net1
docker create network net2

然后启动一些容器

docker run -d --name one --net net1 busybox sleep 600
docker run -d --name two --net net2 busybox sleep 600
docker run -d --name three --net net1 busybox sleep 600

one并将three在它们连接到同一个网桥时进行通信

docker exec one ping three
docker exec three ping one

其他人将在跨越网络/网桥时失败

docker exec one ping two
docker exec two ping one
docker exec three ping two

您会注意到 docker 在网络内提供主机/名称解析,因此实际上是上述失败的主机名解析。IP 也不在网桥之间路由。

$ docker exec three ip ad sh dev eth0
17: eth0@if18: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:14:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe14:3/64 scope link 
       valid_lft forever preferred_lft forever

two

$ docker exec three ping -c 1 -w 1 172.21.0.2
PING 172.21.0.2 (172.21.0.2): 56 data bytes

--- 172.21.0.2 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss

one

docker exec three ping -c 1 -w 1 172.20.0.2
PING 172.20.0.2 (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.044 ms

此设置也适用于覆盖网络驱动程序,但设置起来更复杂。

于 2016-06-10T05:27:25.117 回答