11-Docker Bridge详解

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12-容器之间link

12-容器之间link 这篇主要讲 容器之间如何 link。 需要准备的是&#xff0c;创建两个容器 test1 和 test2 通过 busybox。 在之前的课程中已经创建的只需要重新启动即可。 什么情况下需要link 例如有一个容器是 web 服务器&#xff0c;并且跑在一个docker容器内&#xff0c;…

13-容器的端口映射

13-容器的端口映射 部署一个简单web nginx容器 docker run -d --name web nginxnginx 默认的端口是 80 端口&#xff0c;此时我们是没有办法访问的。 好的&#xff0c;通过前面的学习我们已经知道&#xff0c;这个 web 容器四连接到 bridge 网桥上的&#xff0c;那我们查看一…

14-容器网络之host和none

14-容器网络之host和none 在之前的小节&#xff0c;我们有看到过 host 和 none。 通过 docker network ls 查看。 none 网络 删除 test1 容器 docker stop test1 && docker rm test1创建 test1 容器并连接到none网络 docker run -d --name test1 --network none busy…

15-多容器复杂应用的部署

15-多容器复杂应用的部署 此节主要是通过部署一个复杂的应用场景&#xff0c;进而练习容器的网络相关知识。 创建一个flask-web应用 创建一个 flask-web 文件夹 mkdir flask-web在此文件夹内创建 app.py 文件 cd flask-web touch app.py编写一个简单的 web 程序 import os im…

16-多机器通信

16-多机器通信 回顾上节课的思考题。 flask-redis 想访问 redis&#xff0c;该如何通信&#xff1f; 创建另外一台linux虚拟机 直接拷贝Vagrantfile文件创建一个 centos 虚拟机 我们创建一个centos7-2文件夹&#xff0c;然后创建虚拟机 vagrant up创建的过程中提示选择网络接…

17-Docker的数据持久化介绍

17-Docker的数据持久化介绍 回顾容器与镜像 容器是在镜像之上创建的一层运行时层&#xff0c;这一层是可以读写的&#xff0c;我们能够在容器内添加数据&#xff0c;读取数据。 也就是说我们在创建容器的时候&#xff0c;我们能够在容器内创建文件&#xff0c;安装软件等等&a…

18-数据持久化-Data Volume

18-数据持久化-Data Volume Data Volume 使用场景。一般来讲有些容器自己会产生一些数据&#xff0c;我们不想数据随着容器的销毁而销毁&#xff0c;我们想保存数据&#xff0c;正常一般用在数据库&#xff0c;比如我们想保存数据库中的数据&#xff0c;这个时候我们就会使用 …

19-数据持久化-Bind Mounting

19-数据持久化-Bind Mounting Bind Mounting 与 Data Volume区别 Data Volume 需要在 Dockerfile 内声明需要创建的 volume 目录。 Bind Mounting 则不需要在 Dockerfile 声明 volume&#xff0c;只需要在创建容器的时候&#xff0c;也就是 run 的时候声明即可。 如: dock…

go自定义包教程

go自定义包教程 而是环境为 go version go1.11 linux/amd64linux mint 19 创建一个自定义的包 切换到src目录下&#xff0c;创建demo目录 cd src mkdir demo再创建smap 文件夹 cd demo mkdir smap创建包文件 cd smap touch map.gomap.go文件内容 package smapimport "…

在Linux中对硬盘进行分区、格式化和挂载

在Linux中对硬盘进行分区、格式化和挂载 我最近有一个全新的4-TB硬盘加入我的电脑。所以我需要在Linux中安装它。为此&#xff0c;我需要执行以下操作&#xff1a; 分区格式化挂载检查是否已安装硬盘驱动器 分区 首先&#xff0c;在通过SATA和电源线将硬盘连接到计算机后&am…

Angular gitlab持续集成之runner配置

gitlab持续集成 安装Runner 正常安装 sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64sudo chmod x /usr/local/bin/gitlab-runner sudo useradd --comment GitLab Runner --creat…

javascript编译压缩

javascript编译 js是JavaScript 源码文件&#xff0c; .min.js是压缩版的js文件。 .min.js文件经过压缩&#xff0c;相对编译前的js文件体积较小&#xff0c;传输效率快。经过编码将变量和函数原命名改为毫无意义的命名&#xff0c;以防止他人窥视和窃取 js 源代码 在线版 g…

vscode设置中文

vscode设置中文 当我们安装完成vscode后&#xff0c;会发现它是中文的&#xff0c;因为默认情况下&#xff0c;vscode使用的语言为英文(us)。 那很多同学是不喜欢英文的&#xff0c;不是看不懂&#xff0c;而是不方便哈。 修改语言配置文件 使用快捷键组合【CtrlShiftp】 在…

linux下编译boost

linux下编译boost 下载boot库 官方下载地址 下载完成会解压。 编译 1.进入解压后的文件夹内 cd boost_1_69_0 执行下面的语句 ./bootstrap.sh --with-librariesall --with-toolsetgcc–with-libraries 指定编译哪些boost库&#xff0c;all的话就是全部编译&#xff0c;只想…

C++通过原子变量代替互斥量

C通过原子变量代替互斥量 废话不多说&#xff0c;直接上代码。 实现类似lock_guard功能 #include <atomic> #include <thread>class ClockGuard { public:ClockGuard(std::atomic_flag & atomic):m_lockedFlag(atomic){lock();}~ClockGuard(){unlock();}voi…

conky安装配置

conky安装配置 安装conky sudo apt-get install conky-all修改配置 在主目录下创建’.conkyrc’ 文件内容&#xff1a; # set to yes if you want Conky to be forked in the background background no cpu_avg_samples 2 net_avg_samples 2 out_to_console no # X font w…

Windows子系统安装图形界面

Windows子系统安装图形界面 有很多同学需要使用 linux 系统,但是又不想真正安装一个 linux 系统。于是微软大哥就把 ubuntu 系统集成到 windows 内了&#xff0c;你说 微软 屌不屌&#xff1f; 言归正传。 安装Xlaunch 因为这个是最靠谱的图形化界面了&#xff0c;所以不解…

C++ 判断类是否有某变量

C 判断类是否有某变量 话不多说上代码。 #define HAS_MEMBER(member)\template<typename T, typename... Args>struct has_member_##member\ {\private:\template<typename U> static auto Check(int) -> decltype(std::declval<U>().member(std::declv…

C++将地址转换为字符串

C将地址转换为字符串 有时候在做程序设计的时候&#xff0c;有可能需要做一个类似messageBus的功能&#xff0c;并且需要一个key保证唯一&#xff0c;那么如何实现这个key的唯一呢&#xff1f;大致两种思路: 使用函数签名&#xff0c;因为messagebus绑定的是一个函数&#xf…

Angular 8之升级和新功能摘要

Angular 8之升级和新功能摘要 Angular 8已经到来,并带来了大量的工作流程和性能改进。就像我们之前发布的几个版本一样,让我们回顾一下Angular 8的新功能,以及如何将Angular 7应用程序升级到Angular 8。 Angular 8中明显的新功能数量有限,但确实还有一些好东西: Differen…