bridge模式是docker的默认网络模式,使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。bridge模式如下图所示:

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器都会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

## 使用busybox启动一个调试容器,开启http服务
[root@localhost ~]# docker run -d --name web01 -v /opt:/test/ -p 81:80 busybox:latest sh -c "httpd -h /test/ -p 80 -f"
9301a015f684565c9cf159eeb5150f629cd73e7e0debeb4fbe943b9212b61a01
[root@localhost ~]#
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9301a015f684 busybox:latest "sh -c 'httpd -h /te…" 10 seconds ago Up 9 seconds 0.0.0.0:81->80/tcp, :::81->80/tcp web01

从上图中我们可以看到,可以看到容器内部和Linux主机都会创建一个新的网卡,而这两个网卡都是成对的。使用的技术就是evth-pair。evth-pair 就是一对的虚拟设备接口,他们是成对出现的,一段连着协议,一段彼此相连。evth-pair充当一个桥梁,连接各种虚拟网络设备。

Docker容器完成bridge网络配置的过程如下:
  1. 在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
   2. Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth9a3cee8这样类似的名字命名,并将这个网络设备加入到docker0网桥中。
   3. 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
从宿主机直接访问容器中的httpd服务,抓取发请求的数据包查看网络链路。

新开一个终端窗口执行tcpdum命令进行抓包

[root@localhost ~]# tcpdump tcp -i veth9a3cee8 -s 0 -c 20  -w 3.cap
tcpdump: listening on veth9a3cee8, link-type EN10MB (Ethernet), capture size 262144 bytes

在另外的终端,对httpd发送请求

[root@localhost ~]# curl 127.0.0.1:81
<HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD>
<BODY><H1>404 Not Found</H1>
The requested URL was not found
</BODY></HTML>
[root@localhost ~]# curl 127.0.0.1:81
<HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD>
<BODY><H1>404 Not Found</H1>
The requested URL was not found
</BODY></HTML>
[root@localhost ~]#

这里虽然返回404但是不要紧,请求和响应已经完成了,我们把抓到的包用wireshark工具打开分析

可以看到在宿主机上向容器服务发送请求,其实就是docker0网桥在与容器内的eth0通信,对127.0.0.1:81 的请求 端口转发到了172.17.0.2:80;

红框部分是三次握手的过程,紧接着就正式发送http get请求了。

。。。

后面再研究容器与容器的通信、不同主机内容器的通信

原文链接:https://blog.csdn.net/CSDN1csdn1/article/details/123961079

docker bridge网络类型研究的更多相关文章

  1. docker单机网络类型

    docker单机网络类型概述 Docker 安装时会自动在 host 上创建三种网络  分别为 bridge    host   none .   可用 docker network ls 命令查看 ...

  2. Docker的网络类型和固定IP设置

    Docker的网络机制 Docker的网络有三种类型(driver): bridge, host 和 null. birdge: 就如同桥接的switch/hub, 使用bridge网络的contai ...

  3. Docker的网络类型

    四种网络类型: None:不为容器配置任何网络功能,--net=noneContainer:与另一个运行中的容器共享Network Namespace,--net=container:containe ...

  4. 12、Docker的网络--bridge

    单机网络 Bridge Network Host Network None Network 多机网络 Overlay Network 12.1 网络命名空间   启动一个容器 docker run - ...

  5. 5、Docker容器网络

    使用Linux进行IP层网络管理的指     http://linux-ip.net/html/ # yum install iproute http://linux-ip.net/html/tool ...

  6. Docker | 自定义网络(网关、子网地址)

    了解 docker network 通过下面的命令来获取帮助 docker network --help Commands: connect Connect a container to a netw ...

  7. 学容器必须懂 bridge 网络 - 每天5分钟玩转 Docker 容器技术(32)

    上一节我们讨论了 none 和 host 类型的容器网络,本节学习应用最广泛也是默认的 bridge 网络. Docker 安装时会创建一个 命名为 docker0 的 linux bridge.如果 ...

  8. Docker:容器的四种网络类型 [十三]

    一.None类型 简介:不为容器配置任何网络功能,--net=none 1.创建容器 docker run -it --network none busubox:latest 2.功能测试 [root ...

  9. docker网络类型访问原理

    • bridge –net=bridge 默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中. • host –net=host 容器不会获得一个独立的netw ...

  10. Docker 网络类型

    Docker 网络类型 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:docker-compose 的使用和负载均衡的初探 1. ...

随机推荐

  1. 【RS】ENVI5.6.3 图像融合

            图像融合是将低空间分辨率的多光谱图像或高光谱数据与高空间分辨率的单波段图像重采样生成一幅高分辨率多光谱图像的遥感图像处理技术,使得处理后的图像既有较高的空间分辨率,又具有多光谱特征.一 ...

  2. 快速把PDF文档里的表格粘贴到excel的方法

    1 打开需要复制的PDf文件,点一下页面上方的"选择文本"按钮(如下图中手图标左边的箭头),以便选中文本 2 ctrl c 需要复制的表格,到excel中ctrl v.这时候所有类 ...

  3. PostgreSQL JDBC 开发指导

    JDBC 驱动程序 目录 设置 JDBC 驱动程序 初始化驱动程序 使用 SSL 发出查询和处理结果 调用存储函数和过程 存储二进制数据 JDBC 转义 PostgreSQL 扩展的 JDBC API ...

  4. clickhouse使用入门

    转载请注明出处(- ̄▽ ̄)-严禁用于商业目的的转载- 导语:同学,你也不想你根本不懂ClickHouse,却赶鸭子上架使用的事情被其他人知道吧? 写在前面:本文旨在让原先有一定SQL基础的人快速简单了 ...

  5. python 将中文数字转换成阿拉伯数字

    日常遇到的中文数字主要有两种情况: 1."二零零一"这种类型,只包含[0-9]对应的十个中文字,需要转换成数字:2001.这种情况的转换十分简单. 2. "三百二十一&q ...

  6. Android 妙用TextView实现左边文字,右边图片

    原文: Android 妙用TextView实现左边文字,右边图片 - Stars-One的杂货小窝 有时候,需要文字在左边,右边有个箭头,我个人之前会有两种做法: 使用线性布局来实现 或者使用约束布 ...

  7. python笔记:第十二章文件

    1.打开文件 位于自动导入的模块IO中,无需手动导入. f = open('D:\M\test.txt') 若文件不存在,则报错 Traceback (most recent call last): ...

  8. String、StringBuffer、StringBuilder 的区别?

    一. 介绍 String.StringBuffer.StringBuilder: 前言: String.StringBuffer.StringBuilder 均在java.lang包下: String ...

  9. linux 字符集与编码格式相关

    字符集:​多个字符的集合. # 书写系统字母与符号的集合. 字符编码:​把 字符集 中的字符 编码为(映射)指定集合中的某一对象. # 以便文本在计算机中存储和通过通信网络的传递 查看文件的的编码格式 ...

  10. React报错:Module not found: Error: Can't resolve 'react-router-dom'

    解决方案 npm install -S react-router-dom@5 参考链接 https://stackoverflow.com/questions/53914013/failed-to-c ...