docker网络笔记

参考:https://docs.docker.com/network/

https://www.bilibili.com/video/BV16E41187y4
https://www.bilibili.com/video/BV1Mz4y1C7hT

网络驱动

分类

  • birdge:默认的网络驱动程序,类似于NET网络。。如果您没有指定驱动程序,这就是您正在创建的网络类型。当您的应用程序在需要通信的独立容器中运行时,通常会使用桥接网络。

  • host:共享主机网络。

  • overlay:将多个 Docker 守护进程连接在一起,并使 swarm 服务能够相互通信。

  • macvlan:Macvlan 网络允许您为容器分配 MAC 地址,使其在您的网络上显示为物理设备。Docker 守护进程通过容器的 MAC 地址将流量路由到容器。macvlan 在处理期望直接连接到物理网络而不是通过 Docker 主机的网络堆栈路由的遗留应用程序时,使用驱动程序有时是最佳选择。

  • none:对于这个容器,禁用所有网络。通常与自定义网络驱动程序结合使用。

  • Network plugins:您可以通过 Docker 安装和使用第三方网络插件。

  • container模式:多个容器共享一个网络命名空间,如图
    style="zoom:10%;"

架构图

选择

  • 当您需要多个容器在同一个 Docker 主机上进行通信时,bridge是最佳选择。
  • 当网络堆栈不应与 Docker 主机隔离,但您希望容器的其他方面被隔离时,host网络是最佳选择。
  • 当您需要在不同 Docker 主机上运行的容器进行通信时,或者当多个应用程序使用 swarm 服务协同工作时,overlay网络是最佳选择。
  • 当您从 VM 设置迁移或需要容器看起来像网络上的物理主机时,Macvlan 网络是最佳选择,每个主机都有唯一的 MAC 地址。
  • Network plugins允许您将 Docker 与专门的网络堆栈集成。

ipvlan

IPvlan 驱动程序使用户可以完全控制 IPv4 和 IPv6 寻址。VLAN 驱动程序在此基础上构建,可为对底层网络集成感兴趣的用户提供对第 2 层 VLAN 标记甚至 IPvlan L3 路由的完全控制。对于抽象出物理约束的覆盖部署,请参阅多主机覆盖驱动程序。

IPvlan 是久经考验的真正网络虚拟化技术的新转折。Linux 实现非常轻量级,因为它们不是使用传统的 Linux 桥进行隔离,而是与 Linux 以太网接口或子接口相关联,以强制实现网络之间的分离以及与物理网络的连接。

IPvlan 提供了许多独特的功能,并为各种模式的进一步创新提供了充足的空间。这些方法的两个高级优势是,绕过 Linux 桥的积极性能影响和具有较少移动部件的简单性。移除传统上驻留在 Docker 主机 NIC 和容器接口之间的桥接,留下一个由容器接口组成的简单设置,直接连接到 Docker 主机接口。这个结果对于面向外部的服务很容易访问,因为在这些场景中不需要端口映射。

先决条件

  • 此页面上的示例都是单主机。
  • 任何使用子接口的示例eth0.10都可以替换eth0为 Docker 主机上的或任何其他有效的父接口。带有 的子接口. 是动态创建的。-o parent接口也可以 docker network create放在一起,驱动程序将创建一个dummy 接口,使本地主机连接能够执行示例。
  • 内核要求:
    • 要检查您当前的内核版本,请使用 uname -r
    • IPvlan Linux 内核 v4.2+(对早期内核的支持存在但有问题)

macvlan 网络

一些应用程序,尤其是遗留应用程序或监控网络流量的应用程序,希望直接连接到物理网络。在这种情况下,您可以使用macvlan网络驱动程序为每个容器的虚拟网络接口分配一个 MAC 地址,使其看起来是一个直接连接到物理网络的物理网络接口。在这种情况下,你需要指定你的docker主机使用的一个物理接口macvlan,还有的子网和网关macvlan。您甚至可以macvlan使用不同的物理网络接口来隔离您的网络。请记住以下几点:

  • 由于 IP 地址耗尽或“VLAN 传播”,很容易无意中损坏您的网络,这种情况是您的网络中有大量不适当的唯一 MAC 地址。

  • 您的网络设备需要能够处理“混杂模式”,即一个物理接口可以分配多个 MAC 地址。

  • 如果您的应用程序可以使用网桥(在单个 Docker 主机上)或覆盖(跨多个 Docker 主机进行通信),这些解决方案从长远来看可能会更好。

    创建一个macvlan网络

创建macvlan网络时,它可以处于桥接模式或 802.1q trunk桥接模式。

  • 在桥接模式下,macvlan流量通过主机上的物理设备。

    在 802.1q trunk模式下,流量通过 Docker 动态创建的 802.1q 子接口。这允许您在更细粒度的级别控制路由和过滤。

    步骤

    • 开启网卡混杂模式
    ip link set ens192 promise on # 开启
    ip link set ens192 promise off # 关闭
    或者
    ifconfig ens192 promisc
    ifconfig ens192 -promisc
    

    用ifconfig查看网卡,出现PROMISE 模式,即代表开启成功

    ens192: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500
            ether 00:50:56:b4:af:2a  txqueuelen 1000  (Ethernet)
            RX packets 15  bytes 900 (900.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 2  bytes 220 (220.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    • 创建macvlan
     docker network create -d macvlan --subnet=192.168.50.0/24 --gateway=192.168.50.1     -o parent=ens192.50 macvlan50
    
    • 查看

      # docker network ls
      NETWORK ID          NAME                DRIVER              SCOPE
      7002a81fe32f        bridge              bridge              local
      ad6c8672d9b2        host                host                local
      d5be6dd37eaa        macvlan50           macvlan             local
      935d04885a2c        none                null                local
      
    • 基于macvlan创建容器

      docker run -it --net=macvlan50 --rm daocloud.io/daocloud/busybox:1.29.3 /bin/sh
      / # ip a
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
          link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
          inet 127.0.0.1/8 scope host lo
             valid_lft forever preferred_lft forever
      2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop qlen 1000
          link/ipip 0.0.0.0 brd 0.0.0.0
      24: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
          link/ether 02:42:c0:a8:32:02 brd ff:ff:ff:ff:ff:ff
          inet 192.168.50.2/24 brd 192.168.50.255 scope global eth0
             valid_lft forever preferred_lft forever
      

静态路由实现跨主机通信

  • 修改docker网卡配置

由于各主机之间docker网卡可能一致,无法进行配置路由,需要手动修改一下地址范围

第一台

cat /etc/docker/daemon.json
{
    "bip": "172.17.1.252/24"
}

第二台

cat /etc/docker/daemon.json
{
    "bip": "172.17.2.252/24"
}
  • 添加静态路由

    # 第一台
    route add -net 172.17.2.0 netmask 255.255.255.0 gw 192.168.12.25(另一台主机的ip)
    # 第二台
    route add -net 172.17.1.0 netmask 255.255.255.0 gw 192.168.12.24(另一台主机的ip)
    
posted @ 2021-08-15 17:54  lttL  阅读(121)  评论(0)    收藏  举报