两个 Docker Bridge 网络,相同的网络地址?

问题描述 投票:0回答:0

我有一个类似于此的网络拓扑(省略了一些信息):

在路由器和服务器之间至少使用了两个 VLAN,20/21。它们都在同一个网络上,但使用 VRF(路由器端)在逻辑上拆分为单独的实体。这个想法是 VRF 客户 A 与 VRF 客户 B 具有相同的 IP 地址方案,服务器也是相同的 IP 地址,但每个提供不同的服务。

我需要两个 Docker 容器,一个用于 VLAN 20/21。它们需要具有相同的 IP 地址和相同的网络地址。我相信这可能通过使用命名空间/veth 桥来实现。有人能指出我正确的方向吗?如果无法使用 Docker,替代解决方案会有所帮助。

这是我想出的(注意其中一些删除了清理):

#!/bin/bash

echo “删除现有的网络名称空间...” sudo ip netns delete vlan20_ns 2>/dev/null ||真的 sudo ip netns delete vlan21_ns 2>/dev/null ||真

echo “正在创建网络名称空间...” sudo ip netns 添加 vlan20_ns sudo ip netns 添加 vlan21_ns

echo “删除现有的 VLAN 接口...” sudo ip link delete ens3.20 2>/dev/null ||真的 sudo ip link delete ens3.21 2>/dev/null ||真

echo “正在创建 VLAN 接口...” sudo ip link 添加链接 ens3 名称 ens3.20 类型 vlan id 20 sudo ip link 添加链接 ens3 名称 ens3.21 类型 vlan id 21

echo“将 VLAN 接口移动到名称空间...” sudo ip 链接设置 ens3.20 netns vlan20_ns sudo ip link set ens3.21 netns vlan21_ns

echo “正在命名空间中配置接口和路由……” sudo ip netns exec vlan20_ns ip addr add 10.0.20.254/24 dev ens3.20 sudo ip netns exec vlan20_ns ip link set ens3.20 up sudo ip netns exec vlan20_ns ip route add default via 10.0.20.1

sudo ip netns exec vlan21_ns ip addr add 10.0.20.254/24 dev ens3.21 sudo ip netns exec vlan21_ns ip link set ens3.21 up sudo ip netns exec vlan21_ns ip route add default via 10.0.20.1

echo “删除现有的 Docker 容器...” sudo docker rm -f nginx-vlan20 2>/dev/null ||真的 sudo docker rm -f nginx-vlan21 2>/dev/null ||真

echo “用 Nginx 镜像启动 Docker 容器……” sudo docker run -d --name nginx-vlan20 --net=none --restart=unless-stopped nginx sudo docker run -d --name nginx-vlan21 --net=none --restart=unless-stopped nginx

echo “获取容器的 PID 并将 veth 接口移动到容器......” pid_vlan20=$(sudo docker inspect -f '{{.State.Pid}}' nginx-vlan20) pid_vlan21=$(sudo docker inspect -f '{{.State.Pid}}' nginx-vlan21)

echo “正在创建 veth 对并将它们移动到命名空间……” sudo ip link add name veth0 类型 veth peer name veth0_peer netns $pid_vlan20 sudo ip link add name veth1 类型 veth peer name veth1_peer netns $pid_vlan21

将 veth 接口移动到 vlan2x_ns 命名空间

sudo ip link set veth0 netns vlan20_ns sudo ip 链接设置 veth1 netns vlan21_ns

在 vlan2x_ns 命名空间中设置 veth 接口

sudo ip netns exec vlan20_ns ip link set veth0 up sudo ip netns exec vlan21_ns ip link set veth1 up

在 Docker 容器命名空间中设置 veth_peer 接口

sudo nsenter -t $pid_vlan20 -n ip link set veth0_peer name eth0 sudo nsenter -t $pid_vlan21 -n ip link set veth1_peer name eth0

echo “正在将 Docker 容器内的网络接口设置为启动状态……” sudo nsenter -t $pid_vlan20 -n ip link 设置eth0 sudo nsenter -t $pid_vlan21 -n ip link set eth0

将 IP 地址更新为相同

echo “正在使用 IP 地址配置容器端接口并设置它们……” sudo nsenter -t $pid_vlan20 -n ip addr add 10.0.20.2/24 dev eth0 sudo nsenter -t $pid_vlan21 -n ip addr add 10.0.20.2/24 dev eth0

添加缺失的部分:在 Docker 容器中设置默认网关

echo “正在 Docker 容器内设置默认网关……” sudo nsenter -t $pid_vlan20 -n ip route add default via 10.0.20.1 sudo nsenter -t $pid_vlan21 -n ip route add default via 10.0.20.1

echo “网络命名空间和 Docker 容器已成功配置。”

似乎不允许码头工人 ping 透视网络,即使使用网桥也是如此。不确定这是否已正确完成。

linux docker networking cisco
© www.soinside.com 2019 - 2024. All rights reserved.