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)

大家都在看

  • MySQL查询性能优化七种武器之索引下推

    前面已经讲了MySQL的其他查询性能优化方式,没看过可以去了解一下: MySQL查询性能优化七种武器之索引潜水 MySQL查询性能优化七种武器之链路追踪 今天要讲的是MySQL的另…

    数据库 2023年5月24日
    099
  • Tomcat总体架构(二)

    目录 八、PipeLine 和 Valve 九、Connector 十、Executor 十一、Bootstrap 和 Catalina 十二、组件总结 N、结束 视频 八、Pip…

    数据库 2023年6月11日
    0109
  • Linux–>磁盘分区,挂载

    对于IDE硬盘,驱动器标识符为 “hdx~”,其中”hd”表明分区所在设备类型,这里是指IDE硬盘 “x”为…

    数据库 2023年6月14日
    0100
  • django-Celery分布式队列简单使用

    介绍: Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。 它是一个专注于实时处理的任务队列,同时也支持任务调度。 worker…

    数据库 2023年6月6日
    0100
  • sql_mode详解,bug修复!!!!!

    处理MySQL数据库工作中遇到关于sql_mode的情况,特学习记录一下 废话不多说直接上错误提示,哈哈哈 bug开始!!!! INSERT INTO mmb_user (open…

    数据库 2023年5月24日
    082
  • 给小白的 PG 容器化部署教程(下)

    作者:王志斌编辑:钟华龙 本文来自社区小伙伴 王志斌 的投稿。从小白的角度,带你一步步实现将 RadonDB PostgreSQL 集群部署到 Kubernetes 上。文章分为上…

    数据库 2023年5月24日
    0107
  • Linux中的grep,sed,find的使用方法

    提取指定文件到指定目录/文件 语法:tar xvf test.tar test1(只提取test.tar 包中的test1文件到当前路径) 语法:tar xvf test.tar …

    数据库 2023年6月16日
    079
  • Mysql的读写分离中间件该怎么写?听我来说。

    网上有很多读写分离的中间件,像proxy,mycat等等,由于本人比较懒,懒得去读各种开源的东西,还是想造轮子来得快。 1、了解mysql通信协议,其中有分4.1之前和4.1版本的…

    数据库 2023年5月24日
    0126
  • MySQL自带的四个系统数据库

    MySQL系统数据库mysql、information_schema、performance_schema、sys的结构和作用。 MySQL四个自带的数据库为mysql、infor…

    数据库 2023年6月11日
    094
  • MySQL

    数据库:英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。数据库管理系统:…

    数据库 2023年6月16日
    068
  • 配置中心Nacos(服务发现)

    服务演变之路 单体应用架构 在刚开始的时候,企业的用户量、数据量规模都⽐较⼩,项⽬所有的功能模块都放在⼀个⼯程中编码、编译、打包并且部署在⼀个Tomcat容器中的架构模式就是单体应…

    数据库 2023年6月9日
    0116
  • [LeetCode]1221. 分割平衡字符串

    在一个「平衡字符串」中,’L’ 和 ‘R’ 字符的数量是相同的。 给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。 返回…

    数据库 2023年6月9日
    091
  • 国内访问github很慢或者访问不了,解决办法

    国内因为某些问题,会屏蔽国外一些网站。有时GitHub访问的时候会出现错误,无法访问。解决办法 进入https://fastly.net.ipaddress.com/(全球最好的I…

    数据库 2023年6月6日
    0121
  • 线程的生命周期

    线程的生命周期​ 线程具有生命周期,其中包含 5种状态(出生状态,就绪状态,运行状态、暂停状态、死亡状态)。 出生状态就是线程被创建时的状态:当线程对象调用 start()方法 后…

    数据库 2023年6月16日
    0115
  • Hosts映射

    Hosts映射 思考:如何通过主机名能够找到(ping)某个linux系统? 前言 Hosts:是一个文本文件,用来记录IP和Hostname的映射关系 DNS:是互联网上作为域名…

    数据库 2023年6月11日
    098
  • mac(m1)配置my.cnf

    今天开始学习了数据库,在安装MySQL之后启动一直报错,然后在网上找了很多解决方法,最后用以下方法解决 对于习惯了windows的小伙伴来说,直接去安装目录里边修改my.ini就可…

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