CentOS上的Docker与LAN网络的桥梁

Ero*_*oji 2 networking containers bridge docker

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

Mat*_*att 12

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

Docker Bridge,路由网络

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

路由网络

  1. 启用IP转发

    /etc/sysctl.conf: net.ipv4.ip_forward = 1
    sysctl -p /etc/sysctl.conf
    
    Run Code Online (Sandbox Code Playgroud)

    比如说,在VM网络上创建一个带有新子网的docker bridge 10.101.11.0/24

    docker network create routed0 --subnet 10.101.11.0/24
    
    Run Code Online (Sandbox Code Playgroud)
  2. 告诉10.101.11.0/24应该通过10.101.10.X其中X是您的泊坞主机IP的IP 路由到网络的其余部分.这是外部路由器/网关/"网络人"配置.在Linux网关上,您可以添加以下路由:

    ip route add 10.101.11.0/24 via 10.101.10.31
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

然后你完成了.容器具有可路由的IP地址.如果你对网络方面没问题,或者在网络上运行类似RIP/OSPF的东西或者负责路由的Calico,那么这是最干净的解决方案.

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

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

共享桥梁

使用VM可以使这更加复杂,因为您在主VM的接口上运行额外的MAC地址接口,这将需要额外的"混杂"配置才能使其正常工作.

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

  1. 在主机上创建一个桥.

    ip link add name shared0 type bridge
    ip link set shared0 up
    
    Run Code Online (Sandbox Code Playgroud)

    /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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通常将主接口连接到网桥 eth0

    ip link set eth0 up
    ip link set eth0 master shared0
    
    Run Code Online (Sandbox Code Playgroud)

    /etc/sysconfig/network-scripts/ifcfg-eth0

    DEVICE=eth0
    ONBOOT=yes
    TYPE=Ethernet
    IPV6INIT=no
    USERCTL=no
    BRIDGE=shared0
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将网桥重新配置为具有eth0ip配置.

    ip addr add dev shared0 10.101.10.31/24
    ip route add default via 10.101.10.1
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

    或者在容器内使用DHCP客户端

    pipework shared1 $CONTAINERID dhclient
    
    Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这将遭受相同的VM /软交换问题,其中网络和接口将需要与mac地址混杂.