networking - CentOS 上的 Docker 与 LAN 网络的桥接

标签 networking docker containers bridge

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

最佳答案

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

Docker 网桥,路由网络

这样做的好处是只需要 native docker 工具来配置 docker。它的缺点是需要向您的网络添加一条路由,该路由不在 docker 汇款范围内,通常是手动的(或依赖于“网络专家”)。

Routed network

  • 启用 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。这是外部路由器/网关/“网络人”配置。在 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负责路由,那么这是最干净的解决方案。

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

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

    Shared bridge

    使用虚拟机会使这变得更复杂一些,因为您在主虚拟机的接口(interface)上运行带有额外 MAC 地址的额外接口(interface),will need additional "Promiscuous" config first to allow this to work .

    桥接接口(interface)的永久网络配置因发行版而异。以下命令概述了如何设置接口(interface)并在重新启动后消失。当您更改主网络接口(interface)配置时,您将需要控制台访问权限或进入 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
    
  • 将主接口(interface)附加到网桥,通常为 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主机上的接口(interface)。
    docker network create -d macvlan \
      --subnet=10.101.10.0/24 \
      --gateway=10.101.10.1  \
      -o parent=eth0 pub_net
    

    这将遭受相同的 VM/软交换问题,其中网络和接口(interface)需要是 promiscuous with regard mac addresses .

    关于networking - CentOS 上的 Docker 与 LAN 网络的桥接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43240377/

    相关文章:

    安卓连接/网络配置

    networking - Netmiko:如何使用变量在 switch 中搜索

    docker - Docker 远程 API 是否具有 "docker run --rm ..."的等价物?

    java - 如何获取jmDNS ServiceInfo描述字符串

    node.js - 无法在 docker 机器上安装 npm 模块

    macos - 清理 docker 镜像的重复版本

    azure - 基于事件的容器App是如何被调用的?

    Azure - 检查新的 blob 是否上传到容器

    java - 如何从docker容器内的输入文件读取

    ios - 为什么我的 iPhone 应用程序的网络服务调用仅在 AT&T 4g LTE 上失败?