如何连接Docker容器没有桥?
我正在做一些与Docker容器技术有关的实验。
我需要一个特定的原因将两个veth容器接口连接在一起,而不使用桥接,默认情况下,Docker会创build一个桥接,所以我不想使用它。
我很困惑,想知道这样做是否正确。 任何人都可以提供build议,并指出我的一些链接或方法? 我会感激。
非常感谢。
+--------------+ +--------------+ | | | | | Container X | | Container Y | | | | | +--------------+ +--------------+ ^ veth ^ veth | | +----------------+
当然,这是可能的,虽然你不能让Docker自动为你做。 首先创build两个不带networking的容器:
# docker run --net=none --name container_x ... # docker run --net=none --name container_y ...
现在创build一个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
现在您将需要configuration每个容器内的链接。 如果您还没有使用--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
不可用…
最简单的解决scheme就是在系统上安装nsenter
。 如果你能够创build新的veth
接口并启动Docker容器,你应该拥有所有你需要的权限。
如果你在特权模式下运行你的容器( docker run --privileged...
),你可以完成上述的操作。 这将允许你的容器做一些事情 – 比如运行networkingconfiguration命令 – 通常是禁止的。 在这种情况下,您只需在容器中运行ip link
和ip addr
命令,无论是从docker run
开始的shell还是使用诸如docker exec
类的东西。 您应该知道,在特权模式下运行容器会消除许多通常放在容器上的限制,所以如果其他人有权访问这些容器,则不是您想要执行的操作。