Docker Bridge網絡機制深刻剖析-Docker商業環境實戰

專一於大數據及容器雲核心技術解密,可提供全棧的大數據+雲原平生臺諮詢方案,請持續關注本套博客。若有任何學術交流,可隨時聯繫。更多內容請關注《數據雲技術社區》公衆號。 html

1 網絡模式

  • Docker 經過網絡驅動來支持容器的網絡通訊,默認狀況下,Docker 提供兩種網絡驅動供咱們使用,一個是 bridge,一個是 overlay。
  • Docker 安裝時會自動在 host 上建立三個網絡,咱們可用docker network ls命令查看:
root@ubuntu:~# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
fe6e820d51e2        bridge              bridge              local
e91fa0de345b        host                host                local
9fea16767e7a        none                null                local
複製代碼

2 none 網絡

  • none 網絡就是什麼都沒有的網絡。掛在這個網絡下的容器除了 lo,沒有其餘任何網卡。容器建立時,能夠經過--network=none指定使用 none 網絡。
docker run -it --network=none busybox
複製代碼

3 host 網絡

  • host 網絡的容器共享 Docker host 的網絡棧,容器的網絡配置與 host 徹底同樣。能夠經過--network=host指定使用 host 網絡。
docker run -it --network=host busybox
複製代碼
  • 使用 Docker host 的網絡最大的好處就是性能,若是容器對網絡傳輸效率有較高要求,則能夠選擇 host 網絡。固然不便之處就是犧牲一些靈活性,好比要考慮端口衝突問題,Docker host 上已經使用的端口就不能再用了。
  • Docker host 的另外一個用途是讓容器能夠直接配置 host 網路。好比某些跨 host 的網絡解決方案,其自己也是以容器方式運行的,這些方案須要對網絡進行配置,好比管理 iptables。

4 bridge 網絡

  • bridge 是一個很特殊的網絡,Docker 安裝時會建立一個 命名爲 docker0 的 linux bridge,若是不指定 --network,建立的容器默認都會掛到 docker0 上。
  • 接口 docker0 是一個虛擬的以太網橋,用於鏈接容器和本地宿主網絡。
root@ubuntu:~# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242f47922c9       no
複製代碼
  • Docker 每建立一個容器就會建立一組互聯的網絡接口。這組接口就像管道的兩端(就是說,從一端發送的數據會在另外一端接收到)。這組接口其中一端做爲容器裏的 eth0 接口,而領一端統一命名爲相似 vethxxxx 這種名字,做爲宿主機的一個端口。能夠把 veth 接口認爲是虛擬網線的一端。這個虛擬網線一端插在名爲 docker0 的網橋上,另外一端插到容器裏。
  • 經過把每一個 veth 接口綁定到 docker0 網橋,Docker 建立了一個虛擬子網,這個子網由宿主機和全部的 Docker 容器共享。

5 User-defined 網絡

5.1 建立 my_bridge 網絡

  • Docker 自己提供兩種網絡驅動:bridge 和 overlay。bridge 只能用於單機網絡模式,overlay 用於建立跨主機的網絡,咱們可經過 bridge 驅動建立相似前面默認的 bridge 網絡。
root@ubuntu:~# docker network create -d bridge my_bridge
423b660fbdbd5cfacc4cbf591bdf2bc977e7865261349efb6482dbdadxcda3
root@ubuntu:~# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
fe6e820d51e2        bridge              bridge              local
e91fa0de345b        host                host                local
423b660fbdbd        my_bridge           bridge              local
9fea16767e7a        none                null                local

查看一下當前 host 的網絡結構變化,新增了一個網橋 br-423b660fbdbd
root@ubuntu:~# brctl show
bridge name     bridge id               STP enabled     interfaces
br-423b660fbdbd 8000.0242cb3347fd       no
docker0         8000.0242f47922c9       no              vethcd8f150
複製代碼

5.2 自定義網絡 IP 段

  • 若是要自定義網絡 IP 段,只需在建立網段時指定--subnet和--gateway參數:
root@ubuntu:~# docker network create -d bridge --subnet 192.168.31.0/24 --gateway 192.168.31.1 my_bridge2
43043f6bbc1a74106bef92e158daec3ea376748de2f8695541c8e93964303b5b

容器要使用新的網絡,須要在啓動時經過--network指定:
root@ubuntu:~# docker run -it --network=my_bridge2 --name busybox1 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
42: eth0@if43: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:c0:a8:1f:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.2/24 scope global eth0
       valid_lft forever preferred_lft forever
複製代碼

5.3 給容器指定分配靜態 IP

  • 在啓動容器的時候,能夠經過參數 --ip 來指定特定的 IP,只有使用--subnet建立的 User-defined 網絡才能指定靜態 IP。
root@ubuntu:~# docker run -it --network=my_bridge2 --ip 192.168.31.25 --name busybox2 busybox
複製代碼

5.4 不一樣網橋下的容器互通

  • 如何才能讓 busybox 與 httpd 通訊呢?爲 httpd 容器添加一塊 net_bridge2 的網卡。這個能夠經過docker network connect 命令實現。
查看 httpd 容器的 ID。
root@ubuntu:~# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES
488e6019f780        busybox             "sh"                 About an hour ago   Up 31 minutes                           busybox2
7bf37788f011        busybox             "sh"                 About an hour ago   Up 36 minutes                           busybox1
c14ec27277f6        httpd               "httpd-foreground"   3 hours ago         Up 3 hours 
docker network connect my_bridge2 c14ec27277f6

參考:https://blog.51cto.com/wzlinux/2047243,感謝原做者
參考:https://www.techgrow.cn/posts/e6921476.html,感謝原做者
複製代碼

6 總結

專一於大數據及容器雲核心技術解密,可提供全棧的大數據+雲原平生臺諮詢方案,請持續關注本套博客。若有任何學術交流,可隨時聯繫。更多內容請關注《數據雲技術社區》公衆號。 linux

相關文章
相關標籤/搜索