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

use*_*806 2 virtualization networking bridge docker

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

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

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

非常感谢.

+--------------+??????????+--------------+
|??????????????|??????????|??????????????|
|?Container?X??|??????????|?Container?Y??|
|??????????????|??????????|???????????? ?|
+--------------+??????????+--------------+
????????????^?veth???????????^?veth???????
????????????|????????????????|????????????
????????????+----------------+????????????
Run Code Online (Sandbox Code Playgroud)

lar*_*sks 5

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

# docker run --net=none --name container_x ...
# docker run --net=none --name container_y ...
Run Code Online (Sandbox Code Playgroud)

现在创建一veth对:

# ip link add c_x_eth0 type veth peer name c_y_eth0
Run Code Online (Sandbox Code Playgroud)

将对的每一侧分配veth给一个容器.您需要知道容器的PID才能执行此操作,例如:

docker inspect --format '{{.State.Pid}}' container_x
Run Code Online (Sandbox Code Playgroud)

我假设你已经把它放在一个名为的shell脚本中docker-pid.在第一个veth链接上设置名称空间:

# ip link set netns $(docker-pid container_x) dev c_x_eth0
Run Code Online (Sandbox Code Playgroud)

在第二个:

# ip link set netns $(docker-pid container_y) dev c_y_eth0
Run Code Online (Sandbox Code Playgroud)

现在,您需要在每个容器内配置链接.如果您还没有启动容器--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
Run Code Online (Sandbox Code Playgroud)

然后为它们分配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
Run Code Online (Sandbox Code Playgroud)

你应该全力以赴.

更新

如果nsenter不可用......

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

nsenter如果以特权模式(docker run --privileged...)运行容器,则无需完成上述操作.这将允许您的容器执行通常禁止的操作 - 例如运行网络配置命令.在这种情况下,您只需在容器中运行ip linkip addr命令,可以是从您开始使用的shell docker run或使用类似的东西docker exec.您应该知道,以特权模式运行容器会删除通常放在容器上的许多限制,因此如果其他人有权访问这些容器,则不会执行此操作.