zoukankan      html  css  js  c++  java
  • Docker-Bridge Network 01 容器间通信

    本小节介绍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系列文章目录

     

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

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

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

     

     

     

  • 相关阅读:
    异步、+回调机制、线程queue、线程Event、协程、单线程实现遇到IO切换
    GIL、进/线程池、同/异步、阻/非阻塞
    锁——死锁——单个锁锁死
    网络编程之多线程
    后台Response和异常和日志封装、跨域问题及解决、es6的箭头函数、xadmin后台管理
    pip换源、虚拟环境搭建、
    非对称加密和对称加密的区别
    JWT、多方式登录、django缓存
    自定制频率、自动生成接口文档、JWT、自定制auth认证类
    books系列表接口、表断关联、分页器、根据IP限制频率
  • 原文地址:https://www.cnblogs.com/sunqingliang/p/12728745.html
Copyright © 2011-2022 走看看