11-Docker Bridge详解

容器之间是如何通信的?

操作前删除test2的容器。

  1. 查看当前机器上docker的网络

    docker network ls
    
    NETWORK ID          NAME                DRIVER              SCOPE
    056d0ece100f        bridge              bridge              local
    a78b081f0bda        host                host                local
    51a236124cac        none                null                local
    

    这条命令会列举出当前机器上有哪些网络。其实test1 就是连接到bridge这个网络上的。

  2. 查看bridge的网络详细信息

    docker network inspect 056d0ece100f # 这个是bridge的 NETWORK ID
    

    在结果中找到 Containers 这一项。

    "Containers": {
    "da991beadf34ef53be9cf3de8f0c5ba1599b76f4433f6627f96c46c09751ecf5": {"Name": "test1","EndpointID": "4764dcc3a29b9ee7efb6ea5dc5c905840362c8ddc0d944356a4c0e7b07a99d98","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16","IPv6Address": ""
    }
    

    说明这个test1 这个容器是连接到bridge网络上的。

  3. 查看当前机器的网路

    ip a
    

    我们可以找到这两条,docker0veth01f8da0(可能是不一样的,但都是veth开头, veth是 virtual ethernet)

    4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:57:ac:11:fe brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever
    inet6 fe80::42:57ff:feac:11fe/64 scope link valid_lft forever preferred_lft forever
    22: veth01f8da0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether d2:61:e8:a9:d7:9c brd ff:ff:ff:ff:ff:ff link-netnsid 0inet6 fe80::d061:e8ff:fea9:d79c/64 scope link valid_lft forever preferred_lft forever
    

    docker0是一个本机的network namespace,而 busybox有自己的 network namespace veth01f8da0@if21,它是连接到docker0上的。那么 test1 是如何连接的呢?首先查看 它的网络

    docker exec test1 ip a
    

    其中有这一条

    21: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
    

    其中eth0@if22 和 外面的 veth01f8da0@if21 是一对 veth,然后连接到docker0的网桥上。

    那我们验证一下是否是这样。首先安装一个工具。

    sudo yum install bridge-utils
    

    运行命令

    brctl show
    
    bridge name    bridge id       STP enabled interfaces
    docker0     8000.024257ac11fe   no      veth01f8da0
    

    我们可以看到当前机器内只有一个 linux bridge。这里有一个接口 interfaces,不难发现它的名称和之前本机网络中的 22: veth01f8da0@if21是一样的。所以这个接口是连接到docker0的bridge上的。

  4. 再创建一个test2容器

    docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"
    

    查看本机的bridge情况。

    这个bridge就是通过docker network ls命令获取的。

    docker network inspect 056d0ece100f  # 也可以通过docker network inspect bridge
    
    "Containers": {
    "da991beadf34ef53be9cf3de8f0c5ba1599b76f4433f6627f96c46c09751ecf5": {"Name": "test1","EndpointID": "4764dcc3a29b9ee7efb6ea5dc5c905840362c8ddc0d944356a4c0e7b07a99d98","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16","IPv6Address": ""
    },
    "db730b8fe9ca0a6fcdb215b15b894768e0a14cf45493d413a8b7363403c1c574": {"Name": "test2","EndpointID": "7cbae53c21a06866b140a683c993fddbc80edcf96a9c9b59669934dace123956","MacAddress": "02:42:ac:11:00:03","IPv4Address": "172.17.0.3/16","IPv6Address": ""
    }
    

    我们可以看到test2容器已经在这个bridge内了。

  5. 本机查看网络

    ip a
    
    4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:57:ac:11:fe brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever
    inet6 fe80::42:57ff:feac:11fe/64 scope link valid_lft forever preferred_lft forever
    22: veth01f8da0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether d2:61:e8:a9:d7:9c brd ff:ff:ff:ff:ff:ff link-netnsid 0inet6 fe80::d061:e8ff:fea9:d79c/64 scope link valid_lft forever preferred_lft forever
    26: vethb9d5db9@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 9a:1c:2c:48:04:70 brd ff:ff:ff:ff:ff:ff link-netnsid 1inet6 fe80::981c:2cff:fe48:470/64 scope link valid_lft forever preferred_lft forever
    

    我们发现又多了一个vethb9d5db9。这是因为我们创建了test2,则必须在主机上再生成一个veth才能连接到docker0上,到这里我们应该可以看出。

    为了使容器在主机间通讯,则必须需要有两个veth,而成对的虚拟接口被叫做“peers”,它被链接到主机内核的内部,因此(数据)包能在他们之间传输。

    再次查看本机的网桥情况

    brctl show
    
    bridge name    bridge id       STP enabled interfaces
    docker0     8000.024257ac11fe   no      veth01f8da0vethb9d5db9
    

    可以看到docker0已经连接了两个veth接口。

  6. 此时拓扑图是什么样的?

    图中绿色的方块就是 veth,成对的veth才能连接到docker0。这很像我们现实中的网络,就好比 两个人两台电脑连接到了同一台路由器上,路由器为这两台电脑分配了两个ip。但是此时 test1test2只是组成了局域网,并不能访问互联网。

容器是如何连接互联网的?

其实是通过了 NAT 技术。

首先linux主机是可以访问外网的,比如可以通过eth0访问外网。

eth0,eth1,eth2,代表网卡一,网卡二,网卡三(一般是有线连接),如果是无线网连接是 wlp5s0

那么 test1 容器想访问外网,可以通过 docker0这个bridge,然后做一个NAT地址转换成eth0地址,然后发送到外网。

NAT 是通过iptabels实现的,具体可以自己google

11-Docker Bridge详解相关推荐

  1. mysql int(3)与int(11)的区别详解

    这篇文章主要介绍了mysql int(3)与int(11)的区别详解的相关资料,需要的朋友可以参考下 mysql int(3)与int(11)的区别 总结,int(M) zerofill,加上zero ...

  2. mysql8.0.11 安装顺序_mysql 8.0.11 安装步骤详解

    本文为大家分享了mysql 8.0.11 安装步骤,供大家参考,具体内容如下 第一步:下载安装包 MYSQL官方下载地址:官方下载 这里第一项是在线安装,第二项是离线包安装,我选择的是第二项(不用管你 ...

  3. 图形化管理工具Portaniner安 以及 Docker镜像详解(三)

    文章目录 图形化管理工具Portaniner安装 Docker镜像详解 1 什么是镜像 2 Docker镜像加载原理 3 分层理解 提交镜像 常用容器部署 Nginx部署 图形化管理工具Portani ...

  4. 虚拟化技术之docker技术详解

    文章目录 虚拟化技术之docker技术详解 关于作者 作者介绍 前言 虚拟化技术概述及简介 一 .什么是虚拟化技术? 二.常见的虚拟化技术有哪些? 2.1 KVM 虚拟化技术概念 2.2 ESXI 虚 ...

  5. Docker全面详解(二)

    3. run运行流程图 4. 底层原理 4.1. Docker是怎么工作的 4.2. Docker为什么比VM快? 5. Docker的常用命令(重) 5.1. 帮助命令 5.2. 镜像命令(基础) ...

  6. WindowsMediaPlayer 11 控件详解

    WindowsMediaPlayer 11 控件详解 转载别人的VB内容 C#中大多也通用 都是Microsoft的作品 . 属性/方法名: 说明: [基本属性] URL:String; 指定媒体位置 ...

  7. Docker网络详解——原理篇

    前言 当你开始大规模使用Docker时,你会发现需要了解很多关于网络的知识.Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理.然而,Docker同样有着很多不完 ...

  8. Docker网络资源详解 ---(四种网络模式)

    文章目录 前言 一:Dcker网络资源详解 简单云平台生态环境图 普通单节点 桥接图 1.1:网络资源详解:Docker0网卡与四种网络模式 二 . Docker0网卡的解释 1. host模式 2. ...

  9. docker inspect 详解

    一.功能介绍 docker inspect 会以 json 格式得到 docker 镜像/容器的元数据. 如下,查看mysql镜像的完整元数据: docker inspect mysql:5.7 [{ ...

最新文章

  1. CSS3 @font-face
  2. nginx自定义http头
  3. 使用OpenCV进行人脸识别的三种方法
  4. [bzoj1797][Ahoi2009]Mincut 最小割
  5. setsockopt()函数使用详解
  6. adguard没有核心 core no_业主装修最后悔的五个地方!没有之一
  7. 【复杂系统迁移 .NET Core平台系列】之界面层
  8. 【BZOJ - 4318】OSU!(概率dp,数学期望,期望的线性性)
  9. 构建实时数据仓库首选,云原生数据仓库技术解密
  10. python路径相关小问题
  11. ftp 425 Can't open data connection. 的解决方案
  12. python read文件的r和rb的区别
  13. 基于SSH的房屋租赁系统的设计与实现
  14. mysql 事务一直running_事务一直running?记录一次事务异常导致的下单阻塞
  15. NUC8i7BEH来个黑水果
  16. scikit-learn安装步骤
  17. 5G网络普及提速,你身边的这些行业已经站上了风口
  18. Vivado 2020.1 and 2020.2 错误 arm-none-eabi-ar: *.o: Invalid argument
  19. ToolsOh第6批收录
  20. 台式计算机的辐射,台式电脑哪个部分辐射比较大?

热门文章

  1. c语言程序设计的日志,C语言程序设计教学日志.docx
  2. C语言 函数缺省参数 - C语言零基础入门教程
  3. jq之animate() toggle
  4. 本地创建分支push到github
  5. BugkuCTF-WEB题GET和POST
  6. postman响应html,Postman工具——请求与响应(示例代码)
  7. python 解方程 sympy_用Python和Sympy求解方程并得到数值答案
  8. mysql 字符串类型 分区_MySQL分区类型
  9. android今日头条刷新,仿今日头条刷新vector动画
  10. java处理请求的流程_Java Spring mvc请求处理流程详解