CentOS上的Docker与LAN网络的桥梁

时间:2017-04-05 19:49:16

标签: networking docker containers bridge

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

1 个答案:

答案 0 :(得分:10)

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

Docker Bridge,路由网络

这样做的好处是只需要本机docker工具来配置docker。它有一个缺点,需要添加到您的网络的路由,这是在码头工人的汇款之外,通常是手动的(或依赖于#34;网络人员#34;)。

Routed network

  1. 启用IP转发

    /etc/sysctl.conf: net.ipv4.ip_forward = 1
    sysctl -p /etc/sysctl.conf
    

    在VM网络上创建一个包含新子网的docker bridge,例如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是您的泊坞主机的IP。这是外部路由器/网关/"网络人员"配置。在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
    
  4. 然后你完成了。容器具有可路由的IP地址。 如果您对网络方面没有问题,或者在网络上运行类似RIP / OSPF的程序或负责路由的Calico那么这是最干净的解决方案。

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

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

    Shared bridge

    使用VM可以使这更加复杂,因为您通过主{VM}接口will need additional "Promiscuous" config first to allow this to work运行额外的MAC地址接口。

    桥接接口的永久网络配置因发行版而异。以下命令概述了如何设置界面,并在重新启动后消失。在更改主网络接口配置时,您将需要控制台访问或单独进入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
      
    5. Docker macvlan network

      此后,Docker添加了一个名为macvlan的网络驱动程序,可以使容器看起来直接连接到主机所在的物理网络。容器连接到主机上的parent接口。

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

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