你也許已經(jīng)知道了,Docker 容器技術(shù)是現(xiàn)有的成熟虛擬化技術(shù)的一個(gè)替代方案。它被企業(yè)應(yīng)用在越來越多的領(lǐng)域中,比如快速部署環(huán)境、簡化基礎(chǔ)設(shè)施的配置流程、多客戶環(huán)境間的互相隔離等等。當(dāng)你開始在真實(shí)的生產(chǎn)環(huán)境使用 Docker 容器去部署應(yīng)用沙箱時(shí),你可能需要用到多個(gè)容器部署一套復(fù)雜的多層應(yīng)用系統(tǒng),其中每個(gè)容器負(fù)責(zé)一個(gè)特定的功能(例如負(fù)載均衡、LAMP 棧、數(shù)據(jù)庫、UI 等)。
那么問題來了:有多臺(tái)宿主機(jī),我們事先不知道會(huì)在哪臺(tái)宿主機(jī)上創(chuàng)建容器,如果保證在這些宿主機(jī)上創(chuàng)建的容器們可以互相聯(lián)網(wǎng)?
聯(lián)網(wǎng)技術(shù)哪家強(qiáng)?開源方案找 weave。這個(gè)工具可以為你省下不少煩惱。聽我的準(zhǔn)沒錯(cuò),誰用誰知道。
于是本教程的主題就變成了“如何使用 weave 在不同主機(jī)上的 Docker 容器之間設(shè)置網(wǎng)絡(luò)”。
Weave 是如何工作的
讓我們先來看看 weave 怎么工作:先創(chuàng)建一個(gè)由多個(gè) peer 組成的對(duì)等網(wǎng)絡(luò),每個(gè) peer 是一個(gè)虛擬路由器容器,叫做“weave 路由器”,它們分布在不同的宿主機(jī)上。這個(gè)對(duì)等網(wǎng)絡(luò)的每個(gè) peer 之間會(huì)維持一個(gè) TCP 鏈接,用于互相交換拓?fù)湫畔ⅲ鼈円矔?huì)建立 UDP 鏈接用于容器間通信。一個(gè) weave 路由器通過橋接技術(shù)連接到本宿主機(jī)上的其他容器。當(dāng)處于不同宿主機(jī)上的兩個(gè)容器想要通信,一臺(tái)宿主機(jī)上的 weave 路由器通過網(wǎng)橋截獲數(shù)據(jù)包,使用 UDP 協(xié)議封裝后發(fā)給另一臺(tái)宿主機(jī)上的 weave 路由器。
每個(gè) weave 路由器會(huì)刷新整個(gè)對(duì)等網(wǎng)絡(luò)的拓?fù)湫畔ⅲ梢苑Q作容器的 MAC 地址(如同交換機(jī)的 MAC 地址學(xué)習(xí)一樣獲取其他容器的 MAC 地址),因此它可以決定數(shù)據(jù)包的下一跳是往哪個(gè)容器的。weave 能讓兩個(gè)處于不同宿主機(jī)的容器進(jìn)行通信,只要這兩臺(tái)宿主機(jī)在 weave 拓?fù)浣Y(jié)構(gòu)內(nèi)連到同一個(gè) weave 路由器。另外,weave 路由器還能使用公鑰加密技術(shù)將 TCP 和 UDP 數(shù)據(jù)包進(jìn)行加密。
準(zhǔn)備工作
在使用 weave 之前,你需要在所有宿主機(jī)上安裝 Docker 環(huán)境,參考這些教程,在 Ubuntu 或 CentOS/Fedora 發(fā)行版中安裝 Docker。
Docker 環(huán)境部署完成后,使用下面的命令安裝 weave:
注意你的 PATH 環(huán)境變量要包含 /usr/local/bin 這個(gè)路徑,請(qǐng)?jiān)?/etc/profile 文件中加入一行(LCTT 譯注:要使環(huán)境變量生效,你需要執(zhí)行這個(gè)命令: source /etc/profile):
在每臺(tái)宿主機(jī)上重復(fù)上面的操作。
Weave 在 TCP 和 UDP 上都使用 6783 端口,如果你的系統(tǒng)開啟了防火墻,請(qǐng)確保這兩個(gè)端口不會(huì)被防火墻擋住。
在每臺(tái)宿主機(jī)上啟動(dòng) Weave 路由器
當(dāng)你想要讓處于在不同宿主機(jī)上的容器能夠互相通信,第一步要做的就是在每臺(tái)宿主機(jī)上啟動(dòng) weave 路由器。
第一臺(tái)宿主機(jī),運(yùn)行下面的命令,就會(huì)創(chuàng)建并開啟一個(gè) weave 路由器容器(LCTT 譯注:前面說過了,weave 路由器也是一個(gè)容器):
第一次運(yùn)行這個(gè)命令的時(shí)候,它會(huì)下載一個(gè) weave 鏡像,這會(huì)花一些時(shí)間。下載完成后就會(huì)自動(dòng)運(yùn)行這個(gè)鏡像。成功啟動(dòng)后,終端會(huì)輸出這個(gè) weave 路由器的 ID 號(hào)。
下面的命令用于查看路由器狀態(tài):
第一個(gè) weave 路由器就緒了,目前為止整個(gè) peer 對(duì)等網(wǎng)絡(luò)中只有一個(gè) peer 成員。
你也可以使用 docker 的命令來查看 weave 路由器的狀態(tài):
第二臺(tái)宿主機(jī)部署步驟稍微有點(diǎn)不同,我們需要為這臺(tái)宿主機(jī)的 weave 路由器指定第一臺(tái)宿主機(jī)的 IP 地址,命令如下:
當(dāng)你查看路由器狀態(tài),你會(huì)看到兩個(gè) peer 成員:當(dāng)前宿主機(jī)和第一個(gè)宿主機(jī)。
當(dāng)你開啟更多路由器,這個(gè) peer 成員列表會(huì)更長。當(dāng)你新開一個(gè)路由器時(shí),要指定前一個(gè)宿主機(jī)的 IP 地址,請(qǐng)注意不是第一個(gè)宿主機(jī)的 IP 地址(LCTT 譯注:鏈狀結(jié)構(gòu))。
現(xiàn)在你已經(jīng)有了一個(gè) weave 網(wǎng)絡(luò)了,它由位于不同宿主機(jī)的 weave 路由器組成。
把不同宿主機(jī)上的容器互聯(lián)起來
接下來要做的就是在不同宿主機(jī)上開啟 Docker 容器,并使用虛擬網(wǎng)絡(luò)將它們互聯(lián)起來。
假設(shè)我們創(chuàng)建一個(gè)私有網(wǎng)絡(luò) 10.0.0.0/24 來互聯(lián) Docker 容器,并為這些容器隨機(jī)分配 IP 地址。
如果你想新建一個(gè)能加入 weave 網(wǎng)絡(luò)的容器,你就需要使用 weave 命令來創(chuàng)建,而不是 docker 命令。原因是 weave 命令內(nèi)部會(huì)調(diào)用 docker 命令來新建容器然后為它設(shè)置網(wǎng)絡(luò)。
下面的命令是在宿主機(jī) hostA 上建立一個(gè) Ubuntu 容器,然后將它放到 10.0.0.0/24 網(wǎng)絡(luò)中,分配的 IP 地址為 10.0.0.1:
成功運(yùn)行后,終端會(huì)顯示出容器的 ID 號(hào)。你可以使用這個(gè) ID 來訪問這個(gè)容器:
在宿主機(jī) hostB 上,也創(chuàng)建一個(gè) Ubuntu 容器,IP 地址為 10.0.0.2:
訪問下這個(gè)容器的控制臺(tái):
這兩個(gè)容器能夠互相 ping 通,你可以通過容器的控制臺(tái)檢查一下。
如果你檢查一下每個(gè)容器的網(wǎng)絡(luò)配置,你會(huì)發(fā)現(xiàn)有一塊名為“ethwe”的網(wǎng)卡,你分配給容器的 IP 地址出現(xiàn)在它們那里(比如這里分別是 10.0.0.1 和 10.0.0.2)。
Weave 的其他高級(jí)用法
weave 提供了一些非常巧妙的特性,我在這里作下簡單的介紹。
應(yīng)用分離
使用 weave,你可以創(chuàng)建多個(gè)虛擬網(wǎng)絡(luò),并為每個(gè)網(wǎng)絡(luò)設(shè)置不同的應(yīng)用。比如你可以為一群容器創(chuàng)建 10.0.0.0/24 網(wǎng)絡(luò),為另一群容器創(chuàng)建 10.10.0.0/24 網(wǎng)絡(luò),weave 會(huì)自動(dòng)幫你維護(hù)這些網(wǎng)絡(luò),并將這兩個(gè)網(wǎng)絡(luò)互相隔離。另外,你可以靈活地將一個(gè)容器從一個(gè)網(wǎng)絡(luò)移到另一個(gè)網(wǎng)絡(luò)而不需要重啟容器。舉個(gè)例子:
首先開啟一個(gè)容器,運(yùn)行在 10.0.0.0/24 網(wǎng)絡(luò)上:
然后讓它脫離這個(gè)網(wǎng)絡(luò):
最后將它加入到 10.10.0.0/24 網(wǎng)絡(luò)中:
現(xiàn)在這個(gè)容器可以與 10.10.0.0/24 網(wǎng)絡(luò)上的其它容器進(jìn)行通信了。這在當(dāng)你創(chuàng)建一個(gè)容器而網(wǎng)絡(luò)信息還不確定時(shí)就很有幫助了。
將 weave 網(wǎng)絡(luò)與宿主機(jī)網(wǎng)絡(luò)整合起來
有時(shí)候你想讓虛擬網(wǎng)絡(luò)中的容器能訪問物理主機(jī)的網(wǎng)絡(luò)。或者相反,宿主機(jī)需要訪問容器。為滿足這個(gè)功能,weave 允許虛擬網(wǎng)絡(luò)與宿主機(jī)網(wǎng)絡(luò)整合。
舉個(gè)例子,在宿主機(jī) hostA 上一個(gè)容器運(yùn)行在 10.0.0.0/24 中,運(yùn)行使用下面的命令:
這個(gè)命令把 IP 地址 10.0.0.100 分配給宿主機(jī) hostA,這樣一來宿主機(jī) hostA 也連到了 10.0.0.0/24 網(wǎng)絡(luò)上了。顯然,你在為宿主機(jī)選擇 IP 地址的時(shí)候,需要選一個(gè)沒有被其他容器使用的地址。
現(xiàn)在 hostA 就可以訪問 10.0.0.0/24 上的所有容器了,不管這些容器是否位于 hostA 上。好巧妙的設(shè)定啊,32 個(gè)贊!
總結(jié)
如你所見,weave 是一個(gè)很有用的 docker 網(wǎng)絡(luò)配置工具。這個(gè)教程只是它強(qiáng)悍功能的冰山一角。如果你想進(jìn)一步玩玩,你可以試試它的以下功能:多跳路由功能,這個(gè)在 multi-cloud 環(huán)境(LCTT 譯注:多云,企業(yè)使用多個(gè)不同的云服務(wù)提供商的產(chǎn)品,比如 IaaS 和 SaaS,來承載不同的業(yè)務(wù))下還是很有用的;動(dòng)態(tài)重路由功能是一個(gè)很巧妙的容錯(cuò)技術(shù);或者它的分布式 DNS 服務(wù),它允許你為你的容器命名。
新聞熱點(diǎn)
疑難解答
圖片精選