如何在没有桥接的情况下连接 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放在第veth
link:
# 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 link
和 ip addr
命令,或者从 shell 以 docker run
开始,或者使用类似 docker exec
。您应该知道,运行在特权模式下启用容器会删除通常对容器施加的许多限制,因此如果其他任何人都可以访问这些容器,则您不想这样做。
我正在做一些关于 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放在第veth
link:
# 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 link
和 ip addr
命令,或者从 shell 以 docker run
开始,或者使用类似 docker exec
。您应该知道,运行在特权模式下启用容器会删除通常对容器施加的许多限制,因此如果其他任何人都可以访问这些容器,则您不想这样做。