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

 

原創文章,若是轉載,請聲明出處!

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

本人微信公衆號同步更新雲計算、容器、網絡、編程等文章,歡迎參觀!

相關文章
相關標籤/搜索