基础材料

CentOS7.6 minimal  关闭selinux 关闭swap分区 关闭NetworkManager 关闭firewalld

Docker-ce 18.09.0

Docker支持的网络类型

前面已经介绍过,docker支持的网络驱动类型有5类,分别是bridge、host、overlay、macvlan、none

bridge为默认模式(也是k8s管理的模式),docker启动后如果不指定网络则生成默认的docker0网桥,每个容器有独立的network namespace,容器和网桥之间通过veth pair虚拟网卡对进行通信。

host模式最为简单,直接使用主机网络,由于所用容器共享宿主机端口,不需要经过转换,性能高,相对的容易引起端口冲突,使得容器直接暴露在宿主机之外。

overlay模式称为覆盖网络层,用于连接多台宿主机上的docker进行通信。例如k8s下常用的flannel是overlay网络的一种实现,其在所有docker0网桥之上建立一个上层网络用于转发所有docker0网桥上的数据包。

macvlan模式使用macvlan网络驱动程序为每个容器的虚拟网络接口分配MAC地址,使其看起来像是直接连接到物理网络的物理设备,Docker守护程序通过其MAC地址将流量路由到容器

none模式禁用所有网络。通常与自定义网络驱动程序一起使用,否则容器无法对外进行通信。

由于目前环境上docker通常结合k8s使用,在k8s下管理模式为bridge类型,在k8s中overlay层一般又由第三方插件实现,如flannel等在k8s系列中再进行详细说明,所以本篇主要对bridge类型进行说明。

Docker bridge

docker在结合K8S使用时,使用birdge网桥类型,这样每个容器进程就可以使用自己的network namespace,拥有自己的网络栈(网络栈包括网卡,环回设备,iptables规则,路由表),IP地址和端口,更加接近一台虚拟机的网络。本地使用docker0网桥的容器之间是可以任意通信的。如果要对外发布服务需要使用docker run -p命令进行容器到宿主机之间的端口映射。

当然自定义网桥和默认网桥还是有一定区别的,详细区别请参见官方文档https://docs.docker.com/network/bridge/,由于大多数情况下都是结合k8s进行使用的,使用默认网桥即可。

本地主机不同容器拥有不同的network namespace,彼此看不到对方的网络栈情况,也没有相关的路由,他们之间又是如何通信的呢?

上图是两个本地容器通信的示意图,由于每创建一个容器都会生成veth pair,且是成对出现,如同物理网线一般,一端插在docker0网桥(veth),另一端插在容器上(eth0),而容器端的eth0发出的数据包会直接出现在对应的veth设备上(反之亦然,即使他们处于不用的namespace中),从而到达docker0网桥,而docker0网桥的作用可以看作是一个物理交换机,掌握着本地所有容器的地址信息,会把数据包转发到正确的veth端口,然后直接到达容器的eth0网卡上。

通过brctl show命令查看我的本地环境已经有三个veth设备插在docker0网桥之上

如何确定这些veth设备与容器之间的对应关系呢?这里提供一个方法,可以自行编写成脚本执行

通过如下两条命令可以找出veth设备及容器eth0设备的编号,通过该编号将两者联系起来。

[root@k8sregistry ~]# ip link

[root@k8sregistry ~]# docker exec 0a7b19cb468c /bin/bash -c "cat /sys/class/net/eth0/iflink"

了解本地docker容器的通信方法后,再来看看两台宿主机之间的容器是如何通信的。

上图为两台宿主机容器间通信示意图,以及宿主机A的路由表

从图上所示,容器1到宿主机B的eth0网卡之间是可以通信的,数据包通过docker0网桥转发至宿主机A的eth0网卡,两个宿主机之间通过eth0网卡是可以正常通信的。

容器1到容器3之间是不能通信的,数据包流向分为两种情况:

1、两台宿主机之间的docker0网桥使用同一网段,根据宿主机A的路由表会匹配172.17.0.0这条路由,会在本地查找172.17.0.6这个容器ip,这种情况下数据包在本地docker0网桥上就被丢弃了,根本不会向外发送。

2、两台宿主机之间的docker0网桥使用不同网段(如172.16.0.0),这种情况下无法匹配本地路由表的任何策略,会将数据包发送到默认网关,而网关只掌握两台宿主机的网络信息,并不知道宿主机B上的docker0(172.16.0.1)的存在,所以数据包会在路由器上被丢弃。

由此看来单靠docker0网桥是无法实现两台宿主机容器间的通信,这就需要使用overlay类型在所有docker0网桥之上建立一个上层网络,用于跨主机容器的通信。(当然在宿主机上指定静态路由也是可以的,但这不是好办法)

上图所示是以flannel作为overlay层的实现跨主机容器通信的方式

此时docker0网桥的地址通过其网络参数的控制,读取并设置为Flannel.1的同网段,而flannel.1的ip地址分配又由etcd数据库进行控制,保证加入到集群的每台宿主机分配网段的唯一性。当容器1向容器2发送数据包时,会先将数据包通过docker0网桥发送至flannel.1之上,此时flannel会获得目标地址的网段信息为172.30.67.0,根据该信息去etcd数据库中查找对应网段所在的宿主机ip,然后将包进行封装,由本机的eth0发出去,宿主机B的eth0网卡接收到该包,再将其解包转发至其flannel.1上,从而到达容器2.

docker系列四之网络相关推荐

  1. Docker系列四~docker安装mysql

    Docker系列四 docker安装mysql 搜索mysql版本 [root@localhost conf.d]# docker search mysql INDEX NAME DESCRIPTIO ...

  2. Docker的四种网络模式

    docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式: bridge模式:使用–net =bridge指定,默认设置: host模式:使用– ...

  3. 5、Docker 的四种网络模式

    5.1 Docker 的四种网络模式 网络模式 网络配置 说明 host(开放式网络模式) –network host 容器和宿主机共享 Network namespace container(联合挂 ...

  4. Docker系列 四.Docker部署SpringBoot

    四.Docker部署SpringBoot 环境&工具: 阿里云轻量级服务器.CentOS 7系统.FinalShell(其他连接客户端也可以).IDEA 1. 创建springboot项目 这 ...

  5. Docker的四种网络模式和相关网络命令等操作

    Docker网络模式 一.实现原理 二.Docker四种网络模式 三.Docker命令 1.查看网络列表 2.自定义网络固定IP 3.暴露端口 4.在宿主机环境执行容器内命令 5.怎么把宿主机的文件传 ...

  6. Docker系列四DockerFile打造Python镜像

    前言 起因是在更新博客的时候,发现可以用更优雅的方式来实现原有的目的,所以重新整理后,将原文改成了两篇,都收录在了该系列中. 构建Docker镜像,简单来说分为以下两种: 拉取CentOS的操作系统镜 ...

  7. Docker容器的虚拟化网络

    文章目录 1 虚拟化网络 2 单节点容器间通信 3 不同节点容器间通信 4 Docker容器网络 5 Docker的四种网络模式 5.1 host模式 5.2 container模式 5.3 none ...

  8. Docker系列文-----Docker的网络类型(4)

    Docker系列文-----Docker的网络类型(4) Docker里的常见文件及作用 Docker 内部的网络类型 1.桥接模式(默认): 2.host模式: 3.container模式 4.no ...

  9. Docker(十四):Docker:网络模式详解

    Docker作为目前最火的轻量级容器技术,牛逼的功能,如Docker的镜像管理,不足的地方网络方面. Docker自身的4种网络工作方式,和一些自定义网络模式 安装Docker时,它会自动创建三个网络 ...

最新文章

  1. 独家 | 自动编码器是什么?教你如何使用自动编码器增强模糊图像
  2. android的选项菜单,Android界面菜单(2)—选项菜单
  3. 网站排障分析常用的命令
  4. Android HttpURLConnection Post 参数 (https)
  5. 基于Token进行身份验证
  6. python中文件最重要的功能是什么和接收数据_Python测试题
  7. 一条UPDATE从生到死的整个过程的深入解析
  8. 虚拟机 之 root 用户密码重新设定(忘记了)
  9. 大专php应用开发期末考试,php程序员笔试题及答案1.doc
  10. Async注解使用及源码分析
  11. 基于Java的推箱子游戏设计与实现#毕业设计
  12. mysql刷新数据库命令_MySQL 数据库常用命令小结
  13. 企业支付宝账号注册认证流程
  14. .mdf数据库恢复mysql_恢复mdf文件到数据库方法
  15. 解决 ‘@‘ that cannot start any token. (Do not use @ for indentation)
  16. 基本数学概念——数列
  17. vue 登录注册模板
  18. 暗影精灵8 pro安装ubuntu20.04后,没有wifi驱动
  19. 拼多多店铺数据分析有什么作用?哪些数据是有用的?
  20. 5G商用价值到底在哪里,可以赋予哪些能力?

热门文章

  1. Kubernetes Meetup深秋成都行 Ghostcloud精灵云获好评如云
  2. 关于空间域卷积和频率域卷积
  3. java通过http方式代理请求api接口
  4. 如何将PDF文档中的图片提取出来?
  5. Introspect MIPI D-PHY/C-PHY DSI/CSI总线协议分析仪(Analyzer)
  6. 为什么说腾讯云TDSQL是金融行业的“杀手锏”级应用?
  7. 小学计算机创建演示稿教案,主题二 绘文绘图的演示文稿
  8. 入侵检测系统 Intrusion detection system
  9. 解决引入的源文件为乱码的问题
  10. 8个免费高质量视频、音频素材网