如何连接Docker容器没有桥?

我正在做一些与Docker容器技术有关的实验。

我需要一个特定的原因将两个veth容器接口连接在一起,而不使用桥接,默认情况下,Docker会创build一个桥接,所以我不想使用它。

我很困惑,想知道这样做是否正确。 任何人都可以提供build议,并指出我的一些链接或方法? 我会感激。

非常感谢。

+--------------+          +--------------+ |              |          |              | | Container X  |          | Container Y  | |              |          |             | +--------------+          +--------------+             ^ veth           ^ veth                   |                |                        +----------------+ 

当然,这是可能的,虽然你不能让Docker自动为你做。 首先创build两个不带networking的容器:

 # docker run --net=none --name container_x ... # docker run --net=none --name container_y ... 

现在创build一个veth对:

 # ip link add c_x_eth0 type veth peer name c_y_eth0 

veth对的每一侧分配给一个容器。 你将需要知道容器的PID来做到这一点,你可以得到,例如:

 docker inspect --format '{{.State.Pid}}' container_x 

我假设你已经把这个插入到一个名为docker-pid的shell脚本中了。 在第一个veth链接上设置名称空间:

 # ip link set netns $(docker-pid container_x) dev c_x_eth0 

而第二个:

 # ip link set netns $(docker-pid container_y) dev c_y_eth0 

现在您将需要configuration每个容器内的链接。 如果您还没有使用--privileged启动容器,则需要使用nsenter执行此操作:

 # nsenter -t $(docker-pid container_x) -n ip link set c_x_eth0 up # nsenter -t $(docker-pid container_y) -n ip link set c_y_eth0 up 

然后分配给他们的IP地址:

 # nsenter -t $(docker-pid container_x) -n ip addr add 10.10.10.1/24 dev c_x_eth0 # nsenter -t $(docker-pid container_y) -n ip addr add 10.10.10.2/24 dev c_y_eth0 

而且你应该全部设置。

更新

如果nsenter不可用…

最简单的解决scheme就是在系统上安装nsenter 。 如果你能够创build新的veth接口并启动Docker容器,你应该拥有所有你需要的权限。

如果你在特权模式下运行你的容器( docker run --privileged... ),你可以完成上述的操作。 这将允许你的容器做一些事情 – 比如运行networkingconfiguration命令 – 通常是禁止的。 在这种情况下,您只需在容器中运行ip linkip addr命令,无论是从docker run开始的shell还是使用诸如docker exec类的东西。 您应该知道,在特权模式下运行容器会消除许多通常放在容器上的限制,所以如果其他人有权访问这些容器,则不是您想要执行的操作。