在CentOS上搭build桥接networking的Docker

我有一个10.101.10.0/24的服务器VLAN,我的Docker主机是10.101.10.31。 如何在我的Docker主机(VM)上configuration桥接networking,以便所有容器都可以直接连接到LANnetworking,而无需在默认172.17.0.0/16上redirect端口? 我尝试search,但迄今为止发现的所有howtos都导致SSH会话丢失,我不得不从控制台进入虚拟机以恢复我所做的步骤。

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

docker桥,路由networking

这有利于只需要本地docker工具来configurationdocker。 它需要添加一个路由到您的networking,这是在docker之外的汇款和通常手动(或依靠“networking人”)。

路由网络

  1. 启用IP转发

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

    在虚拟机networking上创build一个新的子网桥,例如10.101.11.0/24

     docker network create routed0 --subnet 10.101.11.0/24 
  2. 告诉networking的其余部分10.101.11.0/24应该通过10.101.10.X路由,其中​​X是您的docker主机的IP。 这是外部路由器/网关/“networking人”configuration。 在linux网关上,你可以添加一个路由:

     ip route add 10.101.11.0/24 via 10.101.10.31 
  3. 使用10.101.11.0/24地址在网桥上创build容器。

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

然后你完成了。 容器具有可路由的IP地址。 如果你在networking方面没有问题,或者运行类似RIP / OSPF的路由,那么这是最干净的解决scheme。

自定义网桥,现有networking(和界面)

这具有不需要任何外部networking设置的好处。 缺点是docker主机上的设置比较复杂。 主界面在启动时需要这个网桥,所以它不是一个本地docker network设置。 pipe道或手动容器设置是必需的。

共享桥梁

使用虚拟机可能会使这一点变得更复杂,因为您在主虚拟机的界面上运行额外的MAC地址的额外接口, 首先需要额外的“混杂”configuration才能使其工作 。

桥接接口的永久networkingconfiguration因发行版而异。 以下命令概述了如何设置接口并在重启后消失。 当您更改主networking接口configuration时,您将需要控制台访问或单独的路由到您的虚拟机。

  1. 在主机上创build一个桥。

     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. 重新configuration你的网桥,让eth0的ipconfiguration。

     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