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")。
启用 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
告诉网络的其余部分 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
在地址为 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 的单独路由。
在主机上创建网桥。
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
接口。
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 的问题。
我的服务器 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")。
启用 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
告诉网络的其余部分
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
在地址为 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 的单独路由。
在主机上创建网桥。
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
接口。
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 的问题。