Docker Bridge 网络原理

Docker 的网络子系统是可插拔驱动式的,默认情况下存在或支持多种网络接口,如 bridge、host、overlay、macvlan 以及 none 类型的网络接口。

bridge 是 docker 默认的网络模式,如果在创建容器时不指定网络类型,则默认时 bridge 模式,会为每个容器分配一个 Network Namespace、IP 等,并将容器的网络连接到一个网桥(docker0)上。
这种模式的特点是:同一个网桥下的容器间可以相互通信,不同网桥间的容器网络会被隔离。

Linux 网桥

bridge 模式是基于 Linux 的 网桥(一同通过软件实现的虚拟设备)实现的, 网桥可以将 Linux 内部多个网络接口连接在一起,如下图:

Docker Bridge 网络原理

通过网桥将网络接口连接起来可以实现:一个网络接口接收到网络数据包后,会复制到其他网络接口中,如下图所示:

Docker Bridge 网络原理
如上图所示,当网络接口A收到数据包后, 网桥会将数据包复制发送给连接到网桥的其他接口(如上图中的网卡B和网卡C)。

docker0

Docker 通过 Linux 的 网桥实现了 bridge模式,原理如下图:

Docker Bridge 网络原理
Docker 在启动时,会创建一个名为 docker0网桥,并把其IP地址设为 172.17.0.1/16(私有IP地址)。
$ brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.0242526953be   no

注:brclt 一个用来管理网桥的命令行工具。详见

$ ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default 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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:9c:30:76 brd ff:ff:ff:ff:ff:ff
    inet 192.168.59.128/24 brd 192.168.59.255 scope global noprefixroute dynamic ens33
       valid_lft 1512sec preferred_lft 1512sec
    inet6 fe80::b356:f4d:f6ea:25aa/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: docker0:  mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:52:69:53:be brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:52ff:fe69:53be/64 scope link
       valid_lft forever preferred_lft forever

然后 Docker 在创建容器时,会通过虚拟设备对 veth-pair来将容器与 docker0 连接起来。对于 172.17.0.0/16网段的数据包, Docker 会定义一条 iptables NAT的规则来讲这些数据包的 IP 地址转换成公网 IP 地址,然后通过真实的网络接口(如上图 ens160 接口)发送出去。
启动一个容器,默认使用 bridge 模式

$ docker run -d --name redis -p6379:6379 redis:4
5bd019a047ce

查看网桥状态,已有 veth 连接

$ brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.0242526953be   no      vethed2a70d

查看容器的netns

当容器启动时,Docker 内部会自动为这个容器创建一个 netns用于网络隔离,但当我们使用 ip netns list查看时却看不到数据,是因为 Docker 把 netns创建到了其他地方,而 ip netns list命令只能读目录 /var/run/netns下面的数据。

我们可以通过以下命令来解决这个问题,方便我们学习docker网络。

得到容器对应的进程
pid=docker inspect -f '{{.State.Pid}}' $container_id
手动创建防止文件夹不存在
mkdir -p /var/run/netns/
建立软连接
ln -s /proc/$pid/ns/net /var/run/netns/$container_id

将上面的命令修改为和当前环境一致并验证netns中的网卡。

$ pid=docker inspect -f '{{.State.Pid}}' 5bd019a047ce
$ mkdir -p /var/run/netns/
$ ln -s /proc/$pid/ns/net /var/run/netns/5bd019a047ce
$ ip netns list
5bd019a047ce (id: 0)

$ ip netns exec 5bd019a047ce ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default 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
6: eth0@if7:  mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

可以看到我们成功输出了netns中的网卡信息,并且此信息和从docker容器中看到的一致。

Original: https://www.cnblogs.com/Zioyi/p/15389230.html
Author: Zioyi
Title: Docker Bridge 网络原理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/575862/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Eureka详解系列(二)–如何使用Eureka(原生API,无Spring)

    简介 通过上一篇博客 Eureka详解系列(一)–先谈谈负载均衡器 ,我们知道了 Eureka 是什么以及为什么要使用它,今天,我们开始研究如何使用 Eureka。 在…

    数据库 2023年6月6日
    0110
  • 人的思维定势

    人的思维定势 前段时间,因为咳嗽时间太长,去了医院看”呼吸内科”,检查了一番,最终发现是”变异性咳嗽”,也叫”变异性哮喘…

    数据库 2023年6月9日
    076
  • MySQL主从不生效且无错误

    现象、主从不生效且无错误 前几天配置个MySQL主从,结果MySQL主从不生效,但在show slave status\G还没有错误,当时感觉很奇怪。change master t…

    数据库 2023年6月9日
    0111
  • 编程相关书单

    软工概论软件工程软件工程:实践者的研究方法 职业素养软技能码农翻身技术之瞳程序员修炼之道程序员的职业素养程序员的自我修养 程序设计计算机程序的构造和解释 (SICP) UML软件建…

    数据库 2023年6月11日
    080
  • linux ftp报530 530 Login incorrect pam_unix(crond:account): expired password for user

    今天用FTP登录服务器,要传些数据文件,一直登录不上,重启之后依然无法登陆。 就提交了工单,阿里云的售后居然在网上给我找了两篇处理530的帮助文档,直接无语! 无奈… …

    数据库 2023年6月14日
    0131
  • Docker镜像操作

    Docker镜像操作 Docker 镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端是一个文件引 导系统,即 bootfs,这很像典型的 Linux/Unix 的引导文件系…

    数据库 2023年6月14日
    0117
  • 新版 google 谷歌浏览器跨域问题

    新版本的firefox火狐浏览器限制了 127.0.0.1 本地部署测试的时候,用火狐浏览器需要把 前端的 后台中的服务地址改成 http://localhost:8081 浏览器…

    数据库 2023年6月6日
    099
  • MySQL45讲之InnoDB加锁规则

    前言 本文介绍 MySQL InnoDB 的加锁规则,以及一些需要注意的点。 总结 可重复读隔离级别下,两个原则,两个优化,一个 bug: 原则1:加锁的基本单位是 next-ke…

    数据库 2023年5月24日
    086
  • 2 Java中 == 和 equals 和 hashCode 的区别

    ==是一个比较运算符; 若比较的是基本数据类型,则比较的是值; 若比较的是引用数据类型,则比较的是它们在内存中的内存地址。 说明:对象是存放在堆中,栈中存放的是对象的引用,因此==…

    数据库 2023年6月6日
    099
  • 计算机中内存、cache和寄存器之间的关系及区别

    寄存器是中央处理器内的组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。…

    数据库 2023年6月11日
    0102
  • 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

    面试官: 我看你的简历上写着 精通MySQL,问你个简单的问题, MySQL联合索引有什么特性? 心想,这还不简单,这不是问到我手心里了吗?听我给你背一遍八股文! 我: MySQL…

    数据库 2023年5月24日
    081
  • permgen space解决方案

    原文地址:http://outofmemory.cn/c/java-outOfMemoryError java.lang.OutOfMemoryError这个错误我相信大部分开发人…

    数据库 2023年6月11日
    083
  • 探究MySQL中SQL查询的成本

    成本 什么是成本,即SQL进行查询的花费的时间成本,包含IO成本和CPU成本。 IO成本:即将数据页从硬盘中读取到内存中的读取时间成本。通常1页就是1.0的成本。 CPU成本:即是…

    数据库 2023年5月24日
    0110
  • Logback实现按业务输出到对应日志文件

    一、方案 由于需要按业务生成不同的日志文件,看到按业务来区分,我的第一感觉就是业务其实是可以按包名来区分的。所以其实我们只要实现不同的包下面的日志输出到不同的文件,就能实现需求了。…

    数据库 2023年6月6日
    0278
  • MySQL事务基本使用

    1 事务概述 1.1 事务的支持情况 1.2 事务的特性 1.3 事务的状态 2 使用事务 2.1 显示事务 2.2 隐藏事务 3 事务隔离等级 3.1 数据并发问题 3.2 事务…

    数据库 2023年6月9日
    0108
  • Redis

    一、了解 1、Nosql概述(同sql的区别) 1、存储方式 SQL&…

    数据库 2023年6月6日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球