日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Docker 网络之进阶篇

發(fā)布時(shí)間:2025/3/21 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Docker 网络之进阶篇 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

筆者在《Docker 基礎(chǔ) : 網(wǎng)絡(luò)配置》一文中簡(jiǎn)單介紹了容器網(wǎng)絡(luò)的基本用法,當(dāng)時(shí)網(wǎng)絡(luò)的基本使用方式還處于 --link 階段。時(shí)過(guò)境遷,隨著 docker 的快速發(fā)展,其網(wǎng)絡(luò)架構(gòu)也在不斷的演進(jìn)。本文主要介紹 docker 的 CNM 網(wǎng)絡(luò)模型以及新引入的 network 子命令。

Docker 網(wǎng)絡(luò)架構(gòu)

Docker 在 1.9 版本中引入了一整套的 docker network 子命令和跨主機(jī)網(wǎng)絡(luò)支持。這允許用戶可以根據(jù)他們應(yīng)用的拓?fù)浼軜?gòu)創(chuàng)建虛擬網(wǎng)絡(luò)并將容器接入其所對(duì)應(yīng)的網(wǎng)絡(luò)。其實(shí),早在 docker 1.7 版本中,網(wǎng)絡(luò)部分代碼就已經(jīng)被抽離并單獨(dú)成為了 docker 的網(wǎng)絡(luò)庫(kù),即 libnetwork。在此之后,容器的網(wǎng)絡(luò)模式也被抽象變成了統(tǒng)一接口的驅(qū)動(dòng)。
為了標(biāo)準(zhǔn)化網(wǎng)絡(luò)驅(qū)動(dòng)的開(kāi)發(fā)步驟和支持多種網(wǎng)絡(luò)驅(qū)動(dòng),docker 公司在 libnetwork 中使用了 CNM(Container Network Model)。CNM 定義了構(gòu)建容器虛擬化網(wǎng)絡(luò)的模型,同時(shí)還提供了可以用于開(kāi)發(fā)多種網(wǎng)絡(luò)驅(qū)動(dòng)的標(biāo)準(zhǔn)化接口和組件。Libnetwork 和 docker daemon 及各個(gè)網(wǎng)絡(luò)驅(qū)動(dòng)的關(guān)系可以通過(guò)下圖形象的表示:

上圖中,docker daemon 通過(guò)調(diào)用 libnetwork 對(duì)外提供的 API 完成網(wǎng)絡(luò)的創(chuàng)建和管理等功能。Libnetwork 內(nèi)部則使用了 CNM 來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)功能。CNM 中主要有沙盒(sandbox)、端點(diǎn)(endpoint)網(wǎng)絡(luò)(network) 3 種組件。Libnetwork 中內(nèi)置的 5 種驅(qū)動(dòng)則為 libnetwork 提供了不同類型的網(wǎng)絡(luò)服務(wù)。下面分別對(duì) CNM 中的 3 個(gè)核心組件和 libnetwork 中的 5 種內(nèi)置驅(qū)動(dòng)進(jìn)行介紹。

CNM 中的 3 個(gè)核心組件如下

  • 沙盒:一個(gè)沙盒包含了一個(gè)容器網(wǎng)絡(luò)棧的信息。沙盒可以對(duì)容器的接口(interface)、路由和 DNS 設(shè)置等進(jìn)行管理。沙盒的實(shí)現(xiàn)可以是 Linux network namespace、FreeBSD Jail 或者類似的機(jī)制。一個(gè)沙盒可以有多個(gè)端點(diǎn)和多個(gè)網(wǎng)絡(luò)。
  • 端點(diǎn):一個(gè)端點(diǎn)可以加入一個(gè)沙盒和一個(gè)網(wǎng)絡(luò)。端點(diǎn)的實(shí)現(xiàn)可以是 veth pair、Open vSwitch 內(nèi)部端口或者相似的設(shè)備。一個(gè)端點(diǎn)可以屬于一個(gè)網(wǎng)絡(luò)并且只屬于一個(gè)沙盒。
  • 網(wǎng)絡(luò):一個(gè)網(wǎng)絡(luò)是一組可以直接互相聯(lián)通的端點(diǎn)。網(wǎng)絡(luò)的實(shí)現(xiàn)可以是 Linux bridge、VLAN等。一個(gè)網(wǎng)絡(luò)可以包含多個(gè)端點(diǎn)。

Libnetwork 中的 5 中內(nèi)置驅(qū)動(dòng)如下
bridge 驅(qū)動(dòng):這是 docker 設(shè)置的默認(rèn)驅(qū)動(dòng)。當(dāng)使用 bridge 驅(qū)動(dòng)時(shí),libnetwork 將創(chuàng)建出來(lái)的 docker 容器連接到 docker0 網(wǎng)橋上。對(duì)于單機(jī)模式,bridge 驅(qū)動(dòng)已經(jīng)可以滿足基本的需求了。但是這種模式下容器使用 NAT 方式與外界通信,這就增加了通信的復(fù)雜性。
host 驅(qū)動(dòng):使用 host 驅(qū)動(dòng)的時(shí)候,libnetwork 不會(huì)為容器創(chuàng)建網(wǎng)絡(luò)協(xié)議棧,即不會(huì)創(chuàng)建獨(dú)立的 network namespace。Docker 容器中的進(jìn)程處于宿主機(jī)的網(wǎng)絡(luò)環(huán)境中,相當(dāng)于容器和宿主機(jī)共用同一個(gè) network namespace,容器共享使用宿主機(jī)的網(wǎng)卡、IP 和端口等資源。Host 模式很好的解決了容器與外界通信的地址轉(zhuǎn)換問(wèn)題,可以直接使用宿主機(jī)的 IP 進(jìn)行通信,不存在虛擬化網(wǎng)絡(luò)帶來(lái)的開(kāi)銷(xiāo)。但是 host 驅(qū)動(dòng)也降低了容器與容器之間、容器與宿主機(jī)之間網(wǎng)絡(luò)的隔離性,引起網(wǎng)絡(luò)資源的競(jìng)爭(zhēng)和沖突。因此可以認(rèn)為 host 驅(qū)動(dòng)適用于對(duì)容器集群規(guī)模不大的場(chǎng)景。
overlay 驅(qū)動(dòng):overlay 驅(qū)動(dòng)采用 IETF 標(biāo)準(zhǔn)的 VXLAN 方式,并且是 VXLAN 中被普遍認(rèn)為最適合大規(guī)模的云計(jì)算虛擬化環(huán)境的 SDN controller 模式。在使用的過(guò)程中,還需要一個(gè)額外的配置存儲(chǔ)服務(wù),比如 Consul、etcd 或 ZooKeeper 等。并且在啟動(dòng) docker daemon 的時(shí)候需要添加額外的參數(shù)來(lái)指定所使用的配置存儲(chǔ)服務(wù)地址。
remote 驅(qū)動(dòng):這個(gè)驅(qū)動(dòng)實(shí)際上并未做真正的網(wǎng)絡(luò)服務(wù)實(shí)現(xiàn),而是調(diào)用了用戶自行實(shí)現(xiàn)的網(wǎng)絡(luò)驅(qū)動(dòng)插件,是 libnetwork 實(shí)現(xiàn)了驅(qū)動(dòng)的插件化,更好地滿足了用戶的多樣化需求。用戶只要根據(jù) libnetwork 提供的協(xié)議標(biāo)準(zhǔn)實(shí)現(xiàn)其接口并注冊(cè)即可。
null 驅(qū)動(dòng):使用這種驅(qū)動(dòng)的時(shí)候,docker 容器擁有字段的 network namespace,但是并不為 docker 容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說(shuō),這個(gè)容器除了 network namespace 自帶的 loopback 網(wǎng)卡外,沒(méi)有任何其它網(wǎng)卡、IP、路由等信息,需要用戶為該容器添加網(wǎng)卡、配置 IP 等。這種模式如果不進(jìn)行特定的配置是無(wú)法正常使用網(wǎng)絡(luò)的,但是優(yōu)點(diǎn)也非常明顯,它給了用戶最大的自由度來(lái)自定義容器的網(wǎng)絡(luò)環(huán)境。

CNM 網(wǎng)絡(luò)示例

這里我們介紹一個(gè) libnetwork 示例的搭建過(guò)程,并在搭建成功后對(duì)其中容器之間的連通性進(jìn)行驗(yàn)證。下圖展示了 CNM 網(wǎng)絡(luò)示例的組成結(jié)構(gòu):

在本例中,我使用 docker 默認(rèn)的 bridge 驅(qū)動(dòng)創(chuàng)建了一個(gè)網(wǎng)絡(luò)拓?fù)鋺?yīng)用:

  • 它有兩個(gè)網(wǎng)絡(luò),其中 backend network 為后端網(wǎng)絡(luò),frontend network 則為前端網(wǎng)絡(luò),兩個(gè)網(wǎng)絡(luò)互不連通。
  • 其中 con1 和 con3 各擁有一個(gè)端點(diǎn),并且分別加入到后端網(wǎng)絡(luò)和前端網(wǎng)絡(luò)中。而 con2 則有兩個(gè)端點(diǎn),它們分別加入到后端網(wǎng)絡(luò)和前端網(wǎng)絡(luò)中。

下面的命令分別創(chuàng)建名為 backend 和 frontend 的兩個(gè)網(wǎng)絡(luò):

$ docker network create backend $ docker network create frontend $ docker network ls

上圖中除了剛才創(chuàng)建的 backend 和 frontend 之外,還有三個(gè)網(wǎng)絡(luò) bridge、host 和 none。這三個(gè)網(wǎng)絡(luò)是 docker daemon 默認(rèn)創(chuàng)建的,我們無(wú)法通過(guò) docker network rm 命令進(jìn)行刪除。
在創(chuàng)建了所需的兩個(gè)網(wǎng)絡(luò)之后,我們來(lái)創(chuàng)建三個(gè)容器 con1、con2 和 con3,并分別把 con1 和 con2 加入到 backend 網(wǎng)絡(luò)中,把 con3 加入到 frontend 網(wǎng)絡(luò)中:

$ docker run -it --name con1 --net backend busybox $ docker run -it --name con2 --net backend busybox $ docker run -it --name con3 --net frontend busybox

接下來(lái)分別在 con1 和 con3 中 ping con2,因?yàn)?con1 和 con2 都在 backend 網(wǎng)絡(luò)中,所以兩者可以連通。但是 con3 和 con2 不在一個(gè)網(wǎng)絡(luò)中,所以它們之間不能連通。
我們查看 con2 中的網(wǎng)卡及其配置:

可以看到,此時(shí)容器中只有一塊名為 eth0 的網(wǎng)卡,并且配置了和網(wǎng)橋 backend 同在一個(gè) IP 段的 IP 地址,這個(gè)網(wǎng)卡就是 CNM 模型中的端點(diǎn)。然后我們通過(guò)下面的命令把 con2 也加入到 frontend 網(wǎng)絡(luò)中:

$ docker network connect frontend con2

再來(lái)查看 con2 中的網(wǎng)卡及其配置:

這次發(fā)現(xiàn)多了一塊名為 eth1 的網(wǎng)卡,并且其 IP 和網(wǎng)橋 frontend 同在一個(gè) IP 段。用 ping 命令測(cè)試 con2 與 con3 的連通性:

此時(shí)兩者已經(jīng)連通。由此可知,docker network connect 命令會(huì)在所連接的容器中創(chuàng)建新的網(wǎng)卡,以完成容器與所指定網(wǎng)絡(luò)的連接

總結(jié)

通過(guò) CNM(Container Network Model),docker 為網(wǎng)絡(luò)驅(qū)動(dòng)的開(kāi)發(fā)建立了標(biāo)準(zhǔn)。對(duì)于基本的網(wǎng)絡(luò)應(yīng)用場(chǎng)景,使用默認(rèn)的網(wǎng)絡(luò)驅(qū)動(dòng)就能滿足需求。如果用戶有特殊的需求,完全可以依據(jù) CNM 標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn)自定義的網(wǎng)絡(luò)驅(qū)動(dòng)。

參考:
《docker 容器與容器云》

總結(jié)

以上是生活随笔為你收集整理的Docker 网络之进阶篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。