首页 > 其他分享 >Docker网络原理

Docker网络原理

时间:2024-03-24 21:00:28浏览次数:32  
标签:容器 docker0 宿主机 网络 网桥 原理 Docker

  本文主要讲解 Docker 的网络原理。在此之前,最好对网络命名空间、Veth 设备对、网桥、路由、netfilter 与 iptables 等Linux基础网络知识有所了解,详见《Docker的Linux网络基础》。  

一、Docker 的网络原理

1. Docker 的网络模式

  标准的 Docker 支持 4 种网络模式,可以在使用 docker run 命令启动容器的时候通过 --net 参数指定容器的网络模式: (1)bridge:--net=bridge,Docker 默认的网络模式,新建的容器将拥有独立的网络命名空间,并连接到 Docker 的网桥 docker0 中。 (2)container:--net=container:NAME_or_ID,新建的容器将与指定容器使用同一个网络命名空间,共享网络栈,可以直接通过 lo 环回接口进行通信,但其他资源还是相互隔离的。 (3)host:--net=host,新建的容器将与宿主机使用同一个网络命名空间,但其他资源还是隔离的。容器进程可以跟主机其它 root 进程一样打开低范围的端口,如果进一步的使用 --privileged=true,容器会被允许直接配置主机的网络堆栈。 (4)none:--net=none,新建的容器将拥有独立的网络命名空间,但不进行网络配置,后续需要手动配置。

2. Docker 启动后的系统情况

(1)创建了 docker0 网桥并分配了 IP 地址

  Docker Daemon 首次启动时会创建一个虚拟网桥,默认的名称是 docker0,然后按照 RPC1918 的模型在私有网络空间中给这个网桥分配一个子网。Docker Daemon 会在几个备选地址段里给 docker0 选一个地址,通常是以 172 开头的一个地址。

(2)添加了 iptables 规则

  第 6 条:从 docker0 发出的包可以被中转给 docker0 本身,即连接在 docker0 网桥上的不同容器之间的通信是允许的。   第 3 条:如果接收到发给 docker0 网桥的数据包属于以前已经建立好的连接,那么允许直接通过,这样接收到的数据包自然又走回 docker0 并中转到相应的容器。   第 5 条:从 docker0 发出的包,如果需要转发到非 docker0 本地 IP 地址的设备,则是允许的,这样 docker0 设备发出的包就可以根据路由规则中转到宿主机的网卡设备,从而访问外面的网络了。   第 1 条:若本地 docker0 网段发出的数据包不是发往 docker0 的,而是发往主机之外的设备的,则都需要进行动态地址修改 (MASQUERADE) ,将源地址从容器的地址修改为宿主机网卡的 IP 地址,之后就可以发送给外面的网络了。

(3)Linux 的 ip_forward 功能开启

 

 

二、bridge 网络模式

  在 bridge 模式下,针对由 Docker 建的每一个容器,都会创建一个虚拟以太网设备 —— Veth 设备对,其中一端关联到网桥 docker0 上,另一端使用 Linux 的网络命名空间技术映射到容器内的 eth0 设备,然后在网桥的地址段内给 eth0 接口分配一个没有使用过的 IP 地址。   Docker 的 bridge 模式的网络模型如下:   docker0 地址段默认情况下在宿主机外部是不可见的,所以在同一台机器内的容器之间可以相互通信,不同主机上的容器不能相互通信,实际上它们甚至有可能在相同的网络地址范围内(不同主机上的 docker0 地址段可能是一样的)。   为了让它们跨节点相互通信,就必须在主机的地址上分配端口,然后通过这个端口将网络流量路由或代理到目标容器上。这样做显然意味着一定要在容器之间小心谨慎地协调好端口的分配情况,或者使用动态端口的分配技术,而这二者都是困难且会增加复杂度的事情。这都是 Docker 的网络模型在跨主机访问时面临的问题。

(1)创建一个 Docker 容器,默认使用 bridge 网络模式,同时指定端口映射

  将宿主机 8080 端口映射到容器 4000 端口。

(2)查看容器的网络模式

  使用了 Docker 的默认网络模式——bridge。

(3)查看网桥连接与容器路由

  宿主机上的 Veth 设备对已经建立,连接容器与网桥 docker0。   容器内默认停止的回环设备 lo 被启动,外面宿主机连接进来的 Veth 设备也被命名成了 eth0, 并且已经配置了地址 172.17.0 2。   容器内路由信息表包含一条到 docker0 的子网路由和一条到 docker0 的默认路由。

(4)查看 iptables 规则

  请求宿主机 8080 端口的数据包目的地址将被转换为容器的服务地址 172.17.0.2:4000。    

三、container 网络模式

  使用 container 网络模式创建的容器将与指定容器使用同一个网络命名空间,共享网络栈,可以直接通过 lo 环回接口进行通信,但其他资源还是相互隔离的。

(1)使用 container 网络模式创建一个容器

(2)查看容器网络模式

(3)查看容器网络

  可以看到,container 模式的容器与指定容器处于同一网络命名空间,使用同一个 ip,两个容器之间可通过 lo 设备通信,使用端口不可重复。   container 网络模式的容器无法进行端口映射。    

四、host 网络模式

  使用 host 网络模式创建的容器将与宿主机使用同一个网络命名空间,但其他资源还是隔离的。容器进程可以跟主机其它 root 进程一样打开低范围的端口,如果进一步的使用 --privileged=true,容器会被允许直接配置主机的网络堆栈。

(1)使用 host 网络模式创建一个容器

(2)查看容器网络模式

(3)查看容器网络

  容器与宿主机使用同一网络命名空间,在容器中可以看到 docker0 网桥。

(4)查看宿主机端口占用

  容器直接占用宿主机的端口。    

五、none 网络模式

  使用 none 网络模式创建的容器将拥有独立的网络命名空间,但不进行网络配置,后续需要手动配置。

(1)使用 none 网络模式创建一个容器

(2)查看容器网络模式

(3)查看容器网络

  只有 lo 设备,暂无 veth 设备,未设置 ip。    

六、Docker 网络的局限性

  Docker 一直以来的理念都是“简单为美”,所以一开始没有考虑到多机互联的网络解决方案。若要基于 Docker 的网络模型实现跨主机访问,要么在容器之间小心谨慎地协调好端口的分配情况,要么使用动态端口的分配技术,但这二者都是困难且会增加复杂度的事情。

 

 

 

 

参考: 《Kubernetes 权威指南第 5 版》    

标签:容器,docker0,宿主机,网络,网桥,原理,Docker
From: https://www.cnblogs.com/wujuntian/p/18093048

相关文章

  • sentinel中StatisticSlot数据采集的原理
    StatisticSlot数据采集的原理时间窗口固定窗口在固定的时间窗口内,可以允许固定数量的请求进入;超过数量就拒绝或者排队,等下一个时间段进入,如下图时间窗长度划分为1秒单个时间窗的请求阈值为3上述存在一个问题,假如9:18:04:333-9:18:05:000产生了2个请求,9:18:0......
  • 100天精通风控建模(原理+Python实现)——第23天:风控建模中的贝叶斯优化是什么?怎么实现
    在当今风险多变的环境下,风控建模已经成为金融机构、企业等组织的核心工作之一。在各大银行和公司都实际运用于业务,用于营销和风险控制等。本文以视频的形式阐述风控建模中的召回率是什么,怎么实现。并提供风控建模原理和Python实现文章清单。  之前已经阐述了100天精通风......
  • docker安装mysql
    1.创建本地文件夹mkdir-p/docker/mysql8/confmkdir-p/docker/mysql8/datamkdir-p/docker/mysql8/log2.新建配置文件在conf文件夹中创建文件:mysql.conf文件内容:[mysqld]init-connect="SETcollation_connection=utf8mb4_0900_ai_ci"init_connect="SETNAMESutf8......
  • 网络模型 IO多路复用原理
    网络模型IO多路复用原理网络模型中的I/OI/OI/O多路复用是一种高效的......
  • Spark重温笔记(三):Spark在企业中为什么能这么强?——持久化、Checkpoint机制、共享变量与
    Spark学习笔记前言:今天是温习Spark的第3天啦!主要梳理了Spark核心数据结构:RDD(弹性分布式数据集),包括RDD持久化,checkpoint机制,spark两种共享变量以及spark内核调度原理,希望对大家有帮助!Tips:"分享是快乐的源泉......
  • Linux收到一个网络包是怎么处理的?
    目录摘要​编辑1从网卡开始2硬中断,有点短2.1GameOver3接力——软中断3.1NET_RX_SOFTIRQ软中断的开始3.2数据包到了协议栈3.3网络层处理3.4传输层处理4应用层的处理5总结摘要    一个网络包的接收始于网卡,经层层协议栈的解析,终于应用层。......
  • Docker的Linux网络基础
    Docker技术依赖于近年来Linux内核虚拟化技术的发展,所以Docker对Linux内核有很强的依赖。本文将Docker使用到的与Linux网络有关的主要技术进行简单介绍。 一、网络命名空间为了支持网络协议栈的多个实例,Linux在网络栈中引入了网络命名空间,这些独立的协议......
  • MyBatis3源码深度解析(二十一)动态SQL实现原理(二)动态SQL解析过程、#{}和${}的区别
    文章目录前言8.5动态SQL解析过程8.5.1SQL配置转换为SqlSource对象8.5.2SqlSource转换为静态SQL语句8.6#{}和${}的区别8.7小结前言在【MyBatis3源码深度解析(二十)动态SQL实现原理(一)动态SQL的核心组件】中研究了MyBatis动态SQL相关的组件,如SqlSource用于描述......
  • 【嵌入式】Docker镜像构建指南:引领应用部署的革新之路
    ......
  • Docker学习笔记
    一个打包工具可以实现不同应用跨系统运行,同时通过它提供的隔离容器避免包、依赖冲突问题    Docker与虚拟机的区别......