如何在没有桥接的情况下连接Docker容器?

时间:2015-08-09 17:47:59

标签: networking docker virtualization bridge

我正在尝试使用Docker容器技术。

我需要一个特定的理由将两个veth容器接口连接在一起而不使用桥接器,Docker默认创建一个桥接器,所以我不想使用它。

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

非常感谢你。

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

1 个答案:

答案 0 :(得分:5)

当然,这是可能的,尽管你无法让Docker自动为你做这件事。首先创建两个没有网络的容器:

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

现在创建一个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

现在您需要在每个容器中配置链接。如果您尚未使用--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不可用...

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

如果以特权模式(nsenter)运行容器,则可以在不使用docker run --privileged...的情况下完成上述操作。这将允许您的容器执行通常禁止的操作 - 例如运行网络配置命令。在这种情况下,您只需在容器中运行ip linkip addr命令,可以使用docker run启动的shell,也可以使用docker exec之类的命令。您应该知道,以特权模式运行容器会消除通常放在容器上的许多限制,因此如果其他人有权访问这些容器,那么您不想这样做。