Docker网络续集:穿越Bridge、隧道Overlay、直连Macvlan,构建云原生通信矩阵!
文章目录本篇摘要一.docker 网络分类overlay网络MACVLAN网络IPVLAN网络二.网络查询实战操作docker bridge 的 veth pair 的连接情况查看操作容器与宿主机/外界主机通信原理Docker容器网络与NAT技术容器与宿主机外部如何打通iptables简单介绍容器的网络命名空间查找nsenter介绍三.本篇小结本篇摘要本文深入解析Docker四大网络模式Bridge/Host/Container/None重点剖析Overlay、Macvlan、IPVLAN的实现原理与跨主机通信机制并通过veth pair、网桥、iptables NAT实战演示容器内外网络流量走向。一.docker 网络分类之前在docker网络部分介绍了对应的bridge host container none网络这里就不在介绍下面重点说下对应的overlay网络。overlay网络为了解决跨主机的容器通信问题让运行在不同物理机器上的Docker容器能够像在同一个局域网内一样直接通信因此引入了overlay网络类型。实现原理在不改变底层物理网络的情况下通过一种“隧道”技术如VXLAN将容器原始的二层数据包封装在UDP/IP报文里利用现有IP网络进行传输可以发现创建overlay网络后对应的bridge网络自动变成了docker_gebridge。主要优势透明性对应用程序和底层网络设施都是透明的无需修改。安全性支持对传输的消息进行加密比如在overlay网络层操作。高效性消除了在容器之间进行复杂操作系统级路由的需要。典型应用它是Docker Swarm等容器编排工具实现多主机网络的主流方案也是构建大规模云数据中心网络的基础技术如VXLAN。一句话Overlay网络是一种通过“包中包”的隧道技术在现有IP网络上构建出大规模虚拟二层网络从而实现容器跨主机直接通信的解决方案。overlay网络创建指令如下dockernetwork create-doverlay ovnet1MACVLAN网络为每个容器的虚拟网卡分配一个真实的MAC地址让容器在网络层面上等同于一台直接连接在物理网络中的真实主机。关键优势性能极高容器流量直接通过物理网卡进出完全绕过了宿主机的协议栈和虚拟网桥如docker0减少了中间损耗。网络隔离可以使用不同的物理接口为不同的Macvlan网络提供连接实现网络隔离。必要配置创建Macvlan网络时必须在Docker主机上指定三个参数用于连接的物理接口如eth0所在的子网网段出口的网关地址重要前提必须将指定的物理网卡如eth0开启混杂模式promiscuous mode命令为ifconfig eth0 promisc。这是为了让该网卡能够接收目的MAC地址为所有容器而非仅宿主机本身的网络帧。一句话Macvlan是一种高性能网络方案它通过为容器分配独立MAC地址并让其直接借用物理网卡通信使容器变成物理网络中的“一等公民”。overlay网络创建指令如下dockernetwork create-dmacvlan--subnet172.16.10.0/24 --gateway172.16.10.1-oparenteth0 mac1IPVLAN网络核心功能IPVLAN 是一种网络技术用于实现不同主机上的容器之间直接通信。工作模式特点它让所有容器都处于同一个二层网络同一个网段/VLAN中就像都连接在同一个物理交换机上一样。跨网段通信方式通过创建不同的子接口并关联到不同的三层网络网段来实现不同IPVLAN网络即不同网段间的容器通信。与Overlay技术的对比Overlay网络如VXLAN天生就是为了解决跨三层IP网络构建虚拟二层网络的问题而IPVLAN最初更侧重于在同一二层域内提供高性能的网络解决方案。一句话IPVLAN是一种让容器像在同一台交换机下一样直接通信的技术通过子接口实现跨网段互联与Overlay的“隧道”技术路线不同。overlay网络创建指令如下dockernetwork create-dipvlan--subnet192.168.1.0/24 --gateway192.168.1.1-oipvlan_model2-oparenteth0 pub_net二.网络查询实战操作docker bridge 的 veth pair 的连接情况查看操作首先启动对应的busybox容器。进入容器查看网卡情况可以看到存在一个veth的网卡对然后内部是eth0网卡通过1721网线拉到宿主机。退出容器查看对应的这网线的另一头的网卡编号然后去对应的docker0的linux bridge 发现确实被插上了容器通过veth对借助网桥进行通信包括对内与对外。容器与宿主机/外界主机通信原理Docker容器网络与NAT技术Bridge模式通过veth pair和Network Namespace技术Docker 实现了容器与宿主机及外部的网络连通。NAT技术由于容器veth pair的IP与宿主机IP不在同一网段导致外部网络无法直接发现或通过容器IP访问其内部服务 Docker 采用NAT网络地址转换技术让外部网络能够主动将数据包发送到容器内部。端口绑定容器内的服务监听自身的IP和端口port_0Docker 通过 NAT 将此端口与宿主机的某个端口port_1进行“绑定”或映射。这样外部访问宿主机port_1的流量就会被自动转发到容器内部的port_0。一句话Docker通过NAT技术将容器内部的端口与宿主机端口进行映射解决了外部网络无法直接访问隔离容器的问题。容器与宿主机外部如何打通外界访问容器入方向通过DNAT目标地址转换实现。外部请求访问宿主机IP:端口宿主机根据DNAT规则将其目的IP和端口改写为容器的IP和端口并通过veth pair将请求转发给容器内服务。容器访问外界出方向通过SNAT源地址转换实现。容器发出的请求其源IP是容器IP。请求经veth pair和网桥到达宿主机后宿主机根据SNAT规则将其源IP改写为宿主机IP再发往外网。响应报文如何返回容器关键靠conntrack连接跟踪机制而非DNAT。对于已建立的连接ESTABLISHED或相关连接RELATED的响应报文宿主机能自动识别并将其直接返回给原始的容器无需额外配置端口映射。核心依赖veth pair连接容器与宿主机网桥的“虚拟网线”。网桥docker0充当容器网络的虚拟交换机。IP转发需开启宿主机内核的IP转发功能/proc/sys/net/ipv4/ip_forward宿主机才能为容器转发数据包。一句话Docker通过DNAT让外界能访问容器通过SNAT让容器能访问外界依靠连接跟踪机制确保响应报文正确返回。iptables简单介绍核心功能iptables 是 Linux 系统自带的免费包过滤防火墙主要用于实现封包过滤、重定向和网络地址转换NAT等核心安全功能。四张功能表filter 表最常用负责基础包过滤决定数据包是否允许通过。nat 表负责网络地址转换如SNAT、DNAT用于共享上网或端口映射。mangle 表用于修改数据包内容如TTL。raw 表用于连接跟踪前的数据包处理。常用命令参数-t指定要操作的表如 filter、nat。-L列出指定链中的所有规则。-n以数字形式显示IP和端口加速解析。-v显示详细信息如数据包计数。一句话iptables 通过四张表filter/nat/mangle/raw和一系列规则链构成了Linux系统的核心防火墙用以控制网络流量和实现地址转换。下面通过nat表来验证下上面结论这里伪装规则说了只要不是从docker出来的也就是从容器出来的它的ip符合对应的docker0桥规定ip 无论目的ip等是啥都会遵守这个伪装规则。添加对应NGINX容器理应说是可以外界ip访问进容器的。这里再次查看发现对应的DNAT转化生效把对应的只要不是从docker0桥进来的也就是访问容器的无论源目的ip是啥都会被自动转化成对应容器的虚拟ipport这样就完成了正向访问。容器的网络命名空间查找nsenter介绍命令用途nsenter命令用于进入指定进程尤其是容器的命名空间从而使用宿主机的网络工具如ip、ping调试容器内部网络解决容器内缺少基础命令的问题。核心功能通过参数进入不同类型的命名空间如网络、PID、挂载等最常用的是进入容器的网络命名空间-n参数。基本语法nsenter [options] program [argument...]通过-t指定目标进程的PID来定位容器。常用参数-t, --target pid作用指定要进入的目标进程的PID这是使用该命令的前提。-i, --ipc[file]作用进入目标进程的IPC命名空间用于调试进程间通信。-m, --mount[file]作用进入目标进程的Mount命名空间可访问其文件挂载点。-n, --net[file]作用进入目标进程的Network命名空间用于配置和调试网络是最常用的参数。-p, --pid[file]作用进入目标进程的PID命名空间可查看其进程树。-u, --uts[file]作用进入目标进程的UTS命名空间可查看或修改主机名与域名。-U, --user[file]作用进入目标进程的User命名空间用于用户权限管理相关的操作。-V, --version作用显示该命令工具自身的版本信息。适用场景轻量级容器缺失ip、tcpdump等网络工具时直接从宿主机调试容器网络环境。测试下添加对应的网络命名空间。进到宿主机放对应网络命名空间的目录。进去后查看对应接口配置发现为空和宿主机不一样。下面测试下容器的网络命名空间:首先启动一个容器理应创建了一个专属的网络命名空间。但是这里查不到因为这指令只会显示主机默认的而docker的专属放在一个目录里/var/run/docker/netns。看到了对应的busybox容器的网络命名空间。这里查看容器详情也可以看到对应的命名空间id完整版。进入容器看到它被docker0网桥分配的虚拟网卡的ip。在容器所在的网络命名空间进行ping百度通过veth另一端给docker0网桥然后在根据snat技术成功借助宿主机ip访问到百度最后应答再次同理借助dnat技术完成发送给容器故看到ping成功。与容器详情看到的ip一致。因此关于容器网络命名空间设计大大简化了对容器网络调试的困难。三.本篇小结学习完本篇将掌握Docker网络是容器技术的核心。Bridge模式通过veth pair和网桥连通容器Overlay用隧道技术实现跨主机通信Macvlan/IPVLAN让容器直连物理网络。理解DNAT/SNAT和网络命名空间是调试网络问题的关键。本篇收尾了docker基础入门教程之后会继续更新其他docker方面知识欢迎订阅