Docker-Bridge Network 01 容器间通讯

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

1.前言

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

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

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

  • 网卡
    新增了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 busyboxdocker

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进入容器shell

  • 网卡及路由表
[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,就是简单的二层转发,过程以下:app

  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系列文章目录工具

 

原创文章,若是转载,请声明出处!

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

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

相关文章
相关标签/搜索