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)

大家都在看

  • mybatis缓存

    加上flushCache=”true”后,再次运行结果如下 2.二级缓存 mybatis的二级缓存默认开启,但真正使用需要在mapper文件中添加相应的缓存…

    数据库 2023年6月16日
    079
  • 线程简介

    线程简介以多线程在Windows操作系统中的运行模式为例:Windows操作系统是 多任务操作系统,它以进程为 单位。每个独立执行的程序都被称为 进程( 比如正在运行的QQ是一个进…

    数据库 2023年6月16日
    0114
  • HackerRank第一趴–Basic Select

    ID number NAME VARCHAR2(17) COUNTRYCODE VARCHAR2(3) DISTRICT VARCHAR2(20) POPULATION numbe…

    数据库 2023年6月16日
    085
  • Activiti 7 源码学习

    启动分析 源码版本是 7.1.0.M6 首先从 ProcessEngineAutoConfiguration 开始 ProcessEngineAutoConfiguration 是…

    数据库 2023年6月14日
    089
  • Java面试题(二)–MySQL

    1 存储引擎 1、简单描述一个Mysql的内部结构? MySQL的基本架构示意图:大体来说,MySQL可以分为 server层和 存储引擎层两部分。 ① server层包括连接器、…

    数据库 2023年5月24日
    089
  • Spring MVC的生命周期与简单三大组件的简单介绍

    1.说到Spring MVC就会想到它是基于MVC设计模式的思想来设计的: 那么MVC设计模式是什么呢? 下面来介绍一下 MVC 设计模式 MVC是模型(model)-视图(vie…

    数据库 2023年6月6日
    078
  • Zabbix-(1)安装

    环境: VMware Workstation Pro 16.0 版本 系统 Centos7 …

    数据库 2023年6月14日
    065
  • MySQL的B+树索引和hash索引的区别

    简述一下索引: 索引是数据库表中一列或多列的值进行排序的一种数据结构;索引分为聚集索引和非聚集索引,聚集索引查询类似书的目录,快速定位查找的数据,非聚集索引查询一般需要再次回表查询…

    数据库 2023年5月24日
    076
  • 工具 | 常用 MySQL 内核 Debug 技巧

    作者:柯煜昌 顾问软件工程师目前从事 RadonDB MySQL 容器化研发,华中科技大学研究生毕业,有多年的数据库内核开发经验。 掌握 MySQL 内核源码的阅读和调试能力,不仅…

    数据库 2023年5月24日
    0105
  • mysql使用存储过程批量给表加字段

    背景:在一个项目中,您需要将相同的字段添加到数百个表中,这很难手动添加,因此您计划使用存储过程来实现。 [En] Background: in a project, you nee…

    数据库 2023年5月24日
    0107
  • 从源码角度谈谈open_files_limit的生成逻辑及”Too many open files”的解决思路

    “Too many open files”是一个比较常见的错误,不仅仅是在 MySQL 中。只要是在 Linux 中启动的进程,都有可能遇到这个错误。 究其…

    数据库 2023年6月11日
    0132
  • SQLZOO练习5–join(表的连接)

    game表: idmdatestadiumteam1team2 1001 8 June 2012 National Stadium, Warsaw POL GRE 1002 8 J…

    数据库 2023年6月16日
    072
  • Linux 常用命令

    Linux 常用命令 free -h:查看服务器下内存 df -lh:查看磁盘空间 du -sh *:查看文件夹下文件占用多少空间 uname -a:查看系统版本 which ja…

    数据库 2023年6月6日
    075
  • 今日🎸吉他练到这儿

    本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:https://www.cnblogs.com/ukzq/p/16750421.html Or…

    数据库 2023年6月11日
    088
  • Mysql面试总结

    转载自:https://www.cxyxiaowu.com/16302.html Q1:MySQL 的逻辑架构了解吗? 第一层是服务器层,主要提供连接处理、授权认证、安全等功能。 …

    数据库 2023年5月24日
    088
  • InnoDB数据存储结构

    MySQL服务器上 存储引擎负责对表中数据的读取和写入工作,不同存储引擎中 &#x5…

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