本小节介绍bridge network模式下,单机上的容器网络拓扑及通信。

1.前言

点击跳转至Docker系列文章

对于单机上的容器,Docker提供了bridge、host、none三种网络。我们首先介绍经典的bridge模式。
Linux bridge是Linux内核中广泛使用的网络虚拟化工具,在OpenStack、Docker、Kubernetes中,常常能看到它的身影。
Docker默认使用Bridge Network。Docker安装时会创建一个名为docker0的bridge,创建容器时如果不指定网络,则默认将容器连接在docker0上,实现容器的网络通信。

2.安装docker,查看网络变化

上一节在虚拟机上安装了docker,我们查看虚拟机上网卡、路由表、网桥等设备的变化。

  • 网卡
    新增了docker0,其地址为172.17.0.1/16
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP
    link/ether 08:00:27:70:b6:ef brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.11/24 brd 192.168.0.255 scope global noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::da96:cef:9147:bcc1/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
    link/ether 02:42:a8:64:6c:32 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
  • 路由表
    执行route -n,docker创建了一条路由:发往172.17.0.0/16的报文,会走到docker0
[root@docker1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    100    0        0 enp0s3
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s3
  • 网桥
    执行brctl show,发现docker0上还没有interface
[root@docker1 ~]# brctl show
bridge name    bridge id       STP enabled interfaces
docker0        8000.0242a8646c32   no      
  • 网络命名空间
    执行ip netns,返回空,此时还没有net namespace。

3.创建一个容器

3.1 创建busybox容器

busybox镜像包含了各种linux工具,我们用该镜像创建容器来做实验。
执行docker run -it -d --name=bbox1 busybox

3.2 查看主机网络变化

  • 网卡
    多了一个veth网卡,从名字可以看出这是一个veth pair设备,并且在docker0上。
5: vethe9a0e73@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
    link/ether 1e:ec:13:2e:96:e4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::1cec:13ff:fe2e:96e4/64 scope link 
       valid_lft forever preferred_lft forever
  • 网桥
    网桥多了一个接口,该接口就是上面的veth的网卡设备
[root@docker1 ~]# brctl show
bridge name    bridge id       STP enabled interfaces
docker0        8000.0242a8646c32   no      vethe9a0e73
  • 网络命名空间
    执行ip netns依然返回空。
    其实docker会为每个容器创建net namespace,只是没挂载在/var/run/netns目录下,所以用ip netns命令查不到。
    小tip:如果想用ip netns查看,可以用ln –s创建软连接,自行搜索吧。

3.3 查看容器内部网络

执行docker exec -it bbox1 sh进入容器

  • 网卡及路由表
[root@docker1 ~]# docker exec -it bbox1 sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
4: eth0@if5: <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 eth0
       valid_lft forever preferred_lft forever
/ # 
/ # route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

可以发现,容器的网卡eth0跟bridge上的vethe9a0e73是一对veth pair设备,并且容器内部的默认路由指向docker0的IP 172.17.0.1。

3.4 容器网络拓扑

结合上面的分析,画出当前网络拓扑如下:

3.5 两个容器

执行docker run -it -d --name=bbox2 busybox,创建一个新容器。
网络拓扑如下:

bbox1 ping bbox2,就是简单的二层转发,过程如下:

  1. 在bbox1内部ping 172.17.0.3,根据bbox1的路由表的默认路由,报文从eth0发出,docker0上的vethe9a0e73收到;
  2. docker0就是虚拟交换机,遵从二层转发,根据目的mac查到对应的端口,将其送出;
  3. bbox2收到报文。

4.小结

  • 安装Docker时,Docker会自动创建一个名为docker0的bridge
  • 每个容器都有自己的net namespace
  • 创建容器,如果不指定网络,则默认使用bridge模式并且连接到docker0
  • 容器与docker0通过veth pair连接

下一节,我们介绍容器与外部的通信。点击此处回到docker系列文章目录

原创文章,如果转载,请声明出处!

-----------------------------------------------------------------------------------------------

本人微信公众号同步更新云计算、容器、网络、编程等文章,欢迎参观!

Docker-Bridge Network 01 容器间通信的更多相关文章

  1. Docker:跨主机容器间通信之overlay [十五]

    一.配置overlay类型网络准备工作 1.在luoahong3主机上 docker run -d -p 8500:8500 -h consul --name consul progrium/cons ...

  2. 容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)

    容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这 ...

  3. WSL docker打通容器间通信和追加端口映射

    最近在docker中搭建一个服务,需要有多个容器通信.这里简单记录一下如何在容器间进行通信,同时说一下已经存在的容器如何追加端口映射. 增加网桥 容器间通信的目的是不适用IP而是使用容器名称进行网络通 ...

  4. Docker 与 K8S学习笔记(九)—— 容器间通信

    容器之间可通过IP.Docker DNS Server或joined三种方式进行通信,今天我们来详细学习一下. 一.IP通信 IP通信很简单,前一篇中已经有所涉及了,只要容器使用相同网络,那么就可以使 ...

  5. 使用docker搭建nfs实现容器间共享文件

    首先介绍下今天的两个主角:nfs和docker nfs 是什么 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TC ...

  6. 【云计算】使用docker搭建nfs实现容器间共享文件

    首先介绍下今天的两个主角:nfs和docker nfs 是什么 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TC ...

  7. docker容器间通信

    现在在我们的docker中已经有了三个容器,分别是DB/API/UI三个容器,三个容器间肯定是要进行互相通信的 可以查看docker的官方文档,https://docs.docker.com/engi ...

  8. docker 不同机器上容器互相通信

    环境说明: 1.系统:centos7 2.docker:Docker version 1.3.2 3.docker启动参数:OPTIONS=--selinux-enabled=false -H fd: ...

  9. Docker网络和容器的通信

    Docker的本地网络实现其实就是利用了Linux上的网络命名空间和虚拟网络设备(特别是veth pair). 基本原理 直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界 ...

随机推荐

  1. js正则校验表单

    /** * 表单校验规则 * 不符合规则时,返回错误文案 * 符合规则时,返回false */ var rules = {} // 是否必填 rules.required = function (va ...

  2. 安装自动化测试工具webdriver与selenium模块

    webdriver是一个驱动,需要与selenium配合使用,selenium是自动化测试和爬虫的专业模块,对于不同的浏览器需要不同的webdriver,这里我用的是ubuntu19.10的系统,以p ...

  3. 实例演示:如何简化生产中的Pod安全策略?

    Pod安全策略对于强化K8S集群安全至关重要.本文将延续之前的文章继续深入介绍Pod安全策略. 首先,简单介绍了如何将Pod与Pod安全策略相关联,并使用RBAC来展示具体步骤.然后介绍如何在Ranc ...

  4. python课程体系是怎么样的?

    好的python课程体系是怎么样的?Python从1991年走到今天,已经有了28年的历史了,在开发行业来说也是老江湖了,那么python为什么可以在开发行业屹立不倒呢?其实python最吸引程序员的 ...

  5. 近期 github 机器学习热门项目 top5

    欢迎大家关注我们的网站和系列教程:http://panchuang.net/ ,学习更多的机器学习.深度学习的知识! 作者:Walker No1:NVIDIA's vid2vid Technique( ...

  6. coding++:拦截器拦截requestbody数据如何防止流被读取后数据丢失

    1):现在开发的项目是基于SpringBoot的maven项目,拦截器的使用很多时候是必不可少的,当有需要需要你对body中的值进行校验,例如加密验签.防重复提交.内容校验等等. 2):当你开开心心的 ...

  7. BP神经网络及异或实现

    BP神经网络是最简单的神经网络模型了,三层能够模拟非线性函数效果. 难点: 如何确定初始化参数? 如何确定隐含层节点数量? 迭代多少次?如何更快收敛? 如何获得全局最优解? ''' neural ne ...

  8. SpringBoot 使用 JSR303 自定义校验注解

    JSR303 是 Java EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是hibernate Validator,有了它,我们可以在实体类的字段上标注不同的注解实现对数 ...

  9. 如何做监控?Google SRE 解密

    监控值班室: @隔壁老王头 SQL执行耗时时间过长,达到了报警阈值[5000ms] 隔壁老王头: @监控值班室 少量报警请忽略,批量关注即可. 监控值班室: @隔壁老王头 订单号[88886666]状 ...

  10. Mac 开发工具信息的备份

    相信大部分程序员都对开发环境的工具都有一些特殊的执念(???),如果在自己不习惯的环境中工作完全无法开展,怎么这个工具没有那个字体难受,我本人就是,换了新的 Mac 电脑后如何快速恢复到之前的开发工具 ...