我正在尝试使用Docker容器技术。
我需要一个特定的理由将两个veth容器接口连接在一起而不使用桥接器,Docker默认创建一个桥接器,所以我不想使用它。
我很困惑,想知道这样做是否正确。任何人都可以提供建议并指出一些链接或方法?我将不胜感激。
非常感谢你。
+--------------+ +--------------+
| | | |
| Container X | | Container Y |
| | | |
+--------------+ +--------------+
^ veth ^ veth
| |
+----------------+
答案 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 link
和ip addr
命令,可以使用docker run
启动的shell,也可以使用docker exec
之类的命令。您应该知道,以特权模式运行容器会消除通常放在容器上的许多限制,因此如果其他人有权访问这些容器,那么您不想这样做。