我的服务器 VLAN 为 10.101.10.0/24,我的 Docker 主机是 10.101.10.31。如何在我的 Docker 主机 (VM) 上配置桥接网络,以便所有容器都可以直接连接到我的 LAN 网络,而无需在默认的 172.17.0.0/16 上重定向端口?我尝试搜索,但到目前为止我发现的所有方法都导致丢失 SSH session ,我必须从控制台进入 VM 以恢复我所做的步骤。
最佳答案
有多种方法可以做到这一点。我最成功的两个是将子网路由到 docker 网桥并在主机 LAN 上使用自定义网桥。
Docker 网桥,路由网络
这样做的好处是只需要 native docker 工具来配置 docker。它的缺点是需要向您的网络添加一条路由,该路由不在 docker 汇款范围内,通常是手动的(或依赖于“网络专家”)。
/etc/sysctl.conf: net.ipv4.ip_forward = 1
sysctl -p /etc/sysctl.conf
在您的 VM 网络上创建一个带有新子网的 docker 桥,例如
10.101.11.0/24
docker network create routed0 --subnet 10.101.11.0/24
10.101.11.0/24
应该通过 10.101.10.X
路由其中 X 是您的 docker 主机的 IP。这是外部路由器/网关/“网络人”配置。在 linux 网关上,您可以添加一个路由:ip route add 10.101.11.0/24 via 10.101.10.31
docker run --net routed0 busybox ping 10.101.10.31
docker run --net routed0 busybox ping 8.8.8.8
然后你就完成了。容器具有可路由的 IP 地址。
如果您对网络端没问题,或者在网络上运行类似 RIP/OSPF 或 Calico负责路由,那么这是最干净的解决方案。
自定义网桥、现有网络(和接口(interface))
这样做的好处是不需要任何外部网络设置。缺点是 docker 主机上的设置更复杂。主界面在启动时需要这个桥接器,所以它不是原生的
docker network
设置。 Pipework或需要手动设置容器。使用虚拟机会使这变得更复杂一些,因为您在主虚拟机的接口(interface)上运行带有额外 MAC 地址的额外接口(interface),will need additional "Promiscuous" config first to allow this to work .
桥接接口(interface)的永久网络配置因发行版而异。以下命令概述了如何设置接口(interface)并在重新启动后消失。当您更改主网络接口(interface)配置时,您将需要控制台访问权限或进入 VM 的单独路由。
ip link add name shared0 type bridge
ip link set shared0 up
在
/etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=shared0
TYPE=Bridge
BOOTPROTO=static
DNS1=8.8.8.8
GATEWAY=10.101.10.1
IPADDR=10.101.10.31
NETMASK=255.255.255.0
ONBOOT=yes
eth0
ip link set eth0 up
ip link set eth0 master shared0
在
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
TYPE=Ethernet
IPV6INIT=no
USERCTL=no
BRIDGE=shared0
eth0
的ip配置。ip addr add dev shared0 10.101.10.31/24
ip route add default via 10.101.10.1
10.101.10.0/24
将容器连接到桥接器地址。CONTAINERID=$(docker run -d --net=none busybox sleep 600)
pipework shared1 $CONTAINERID 10.101.10.43/24@10.101.10.Y
或者在容器内使用 DHCP 客户端
pipework shared1 $CONTAINERID dhclient
Docker macvlan 网络
Docker 此后添加了一个名为
macvlan
的网络驱动程序。这可以使容器看起来直接连接到主机所在的物理网络。容器附加到 parent
主机上的接口(interface)。docker network create -d macvlan \
--subnet=10.101.10.0/24 \
--gateway=10.101.10.1 \
-o parent=eth0 pub_net
这将遭受相同的 VM/软交换问题,其中网络和接口(interface)需要是 promiscuous with regard mac addresses .
关于networking - CentOS 上的 Docker 与 LAN 网络的桥接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43240377/