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

how to connect Docker containers without a bridge?

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

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

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

非常感谢。

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

当然可以,尽管您无法让 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 脚本中。设置名字space放在第vethlink:

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

第二次:

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

现在您需要在每个容器中配置 link。如果您还没有使用 --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 容器,您应该拥有所需的所有权限。

如果您 运行 您的容器处于特权模式 (docker run --privileged...),则无需 nsenter 即可完成上述操作。这将允许您的容器执行通常被禁止的操作——例如 运行 网络配置命令。在这种情况下,您只需 运行 容器中的 ip linkip addr 命令,或者从 shell 以 docker run 开始,或者使用类似 docker exec。您应该知道,运行在特权模式下启用容器会删除通常对容器施加的许多限制,因此如果其他任何人都可以访问这些容器,则您不想这样做。