Docker 在 CentOS 上,桥接到 LAN 网络

Docker on CentOS with bridge to LAN network

我的服务器 VLAN 是 10.101.10.0/24,我的 Docker 主机是 10.101.10.31。如何在我的 Docker 主机 (VM) 上配置桥接网络,以便所有容器都可以直接连接到我的 LAN 网络,而无需在默认 172.17.0.0/16 上重定向端口?我尝试搜索,但到目前为止我发现的所有 howtos 都导致 SSH 会话丢失,我不得不从控制台进入 VM 以恢复我所做的步骤。

有多种方法可以做到这一点。我最成功的两个是将子网路由到 docker 网桥并在主机 LAN 上使用自定义网桥。

Docker 网桥,路由网络

这样做的好处是只需要本机 docker 工具即可配置 docker。它的缺点是需要向您的网络添加路由,这超出了 docker 的职权范围并且通常是手动的(或依赖于 "networking guy")。

  1. 启用 IP 转发

    /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
    
  2. 告诉网络的其余部分 10.101.11.0/24 应该通过 10.101.10.X 路由,其中​​ X 是您的 docker 主机的 IP。这是外部 router/gateway/"network guy" 配置。在 linux 网关上,您可以添加一条路由:

    ip route add 10.101.11.0/24 via 10.101.10.31
    
  3. 在地址为 10.101.11.0/24 的桥上创建容器。

    docker run --net routed0 busybox ping 10.101.10.31
    docker run --net routed0 busybox ping 8.8.8.8
    

那么你就完成了。容器具有可路由的 IP 地址。 如果您对网络端感到满意,或者 运行 网络上的 RIP/OSPF 或 Calico 负责路由,那么这是最干净的解决方案。

自定义网桥,现有网络(和接口)

这样做的好处是不需要任何外部网络设置。缺点是 docker 主机上的设置更复杂。主界面在启动时需要此桥,因此它不是本机 docker network 设置。 Pipework 或需要手动设置容器。

使用 VM 会使这变得更复杂一些,因为您要在 will need additional "Promiscuous" config first to allow this to work.[=39= 主 VM 接口上使用额外的 MAC 地址来 运行ing 额外的接口]

桥接接口的永久网络配置因发行版而异。以下命令概述了如何设置界面并在重启后消失。在更改主网络接口配置时,您将需要控制台访问权限或进入 VM 的单独路由。

  1. 在主机上创建网桥。

    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
    
  2. 将主接口附加到网桥,通常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
    
  3. 重新配置您的网桥以使用 eth0 的 ip 配置。

    ip addr add dev shared0 10.101.10.31/24
    ip route add default via 10.101.10.1
    
  4. 附加容器以桥接 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 接口。

docker network create -d macvlan \
  --subnet=10.101.10.0/24 \
  --gateway=10.101.10.1  \
  -o parent=eth0 pub_net

这将遇到相同的 VM/softswitch 网络和接口需要 promiscuous with regard mac addresses 的问题。