如何在单个主机上将多个Docker连接到不同的桥接网络?

6

在单个主机上,是否可能将多个 Docker(在我的情况下,是同一 Docker 的多个实例)连接到不同的桥接网络?

第三方解决方案,如 pipework,建议首先寻找“本地”方法。

像这样的东西:

enter image description here

当我启动 2 个实例时,第一个默认使用 docker0 桥接网络,而第二个则指示使用 br1(不同的 IP 范围):

sudo docker run -t -i me/tester:latest /bin/bash
sudo docker --bridge=br1 run -t -i me/tester:latest /bin/bash

这会导致两个容器具有来自Docker0的相同IP范围:

root@2a259a88d9c8:/# ip a
...
73: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 86:d7:cc:c8:b7:e8 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.32/16 scope global eth0

--

root@0b849a5398af:/# ip a
...
79: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 26:84:ad:6c:70:6b brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.34/16 scope global eth0
       valid_lft forever preferred_lft forever
2个回答

12
以下是使用新的本地docker网络完成的步骤: 创建带有预定义子网的docker网络(Linux桥)
docker network create --subnet=192.168.10.0/24 net1
docker network create --subnet=192.168.20.0/24 net2
docker network create --subnet=192.168.30.0/24 net3

创建的网络对应于Linux桥接

brctl show

enter image description here

创建 tap 接口。
sudo ip tuntap add dev tap1 mode tap
sudo ip tuntap add dev tap2 mode tap
sudo ip tuntap add dev tap3 mode tap

并将它们连接到桥梁上

sudo brctl addif br-a24f2eb2e054 tap1
sudo brctl addif br-d28c0759c37a tap2
sudo brctl addif br-d9512f62e471 tap3

启动您的容器

sudo docker run -itd --name=c1  phusion/baseimage
sudo docker run -itd --name=c2  phusion/baseimage
sudo docker run -itd --name=c3  phusion/baseimage

将容器连接到网络

docker network connect net1 c1
docker network connect net2 c2
docker network connect net3 c3

验证每个容器是否连接到其网络

docker network inspect net1

enter image description here

docker network inspect net2

enter image description here

docker network inspect net3

enter image description here

连接的容器从相应的网络子网中获取其IP地址。
docker exec c1 ip a s eth1

enter image description here

docker exec c2 ip a s eth1

enter image description here

docker exec c3 ip a s eth1

enter image description here

从网络中断开容器

docker network disconnect net1 c1
docker network disconnect net2 c2
docker network disconnect net3 c3

移除网络

docker network rm net1
docker network rm net2
docker network rm net3

1
非常好的教程。这个也可以通过配置像docker-compose一样完成吗? - Kevin

1
您可以创建 自定义桥接器,然后使用选项 -b <BRIDGE>--bridge=<BRIDGE> 运行每个容器,但我没有尝试过这种方法,并且我不能绝对确定这种方法是否完全有效,如果您阅读 this Docker 问题,我认为它建议不要以这种方式执行。
但是在 那个 问题中的评论中提到,您可以禁用任何docker网络管理(使用选项 --net=none 运行容器),然后使用 pipework 按照您的意愿组织网络。
最后,您可以查看 zettio/weave。 使用它,您可以轻松地在所需的网络中运行每个容器,并且如果您想将Docker环境从一台机器扩展到多台机器(就像Docker swarm一样),它还给了您很多可能性。

1
“sudo docker run -t -i me/tester:latest /bin/bash” 和 “sudo docker --bridge=br1 run -t -i me/tester:latest /bin/bash” 仍然具有相同的IP范围来自Docker0。 - AJN
1
从Docker论坛得到的答复是,该问题正在进行中的一个项目中解决,并且将在1.6-1.7版本中解决。 - AJN
1
你不能在不同的桥接中运行每个容器,--bridge选项是为所有容器设置的守护程序。 - csanchez
1
大家好,现在我们已经升级到1.10了,这是什么情况? - pnovotnak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接