天天看點

linux下docker網絡配置,如何在 Docker 容器之間設定網絡

你也許已經知道了,Docker 容器技術是現有的成熟虛拟化技術的一個替代方案。它被企業應用在越來越多的領域中,比如快速部署環境、簡化基礎設施的配置流程、多客戶環境間的互相隔離等等。當你開始在真實的生産環境使用 Docker 容器去部署應用沙箱時,你可能需要用到多個容器部署一套複雜的多層應用系統,其中每個容器負責一個特定的功能(例如負載均衡、LAMP 棧、資料庫、UI 等)。

那麼問題來了:有多台主控端,我們事先不知道會在哪台主控端上建立容器,如果保證在這些主控端上建立的容器們可以互相聯網?

聯網技術哪家強?開源方案找 weave。這個工具可以為你省下不少煩惱。聽我的準沒錯,誰用誰知道。

于是本教程的主題就變成了“如何使用 weave 在不同主機上的 Docker 容器之間設定網絡”。

Weave 是如何工作的

linux下docker網絡配置,如何在 Docker 容器之間設定網絡

讓我們先來看看 weave 怎麼工作:先建立一個由多個 peer 組成的對等網絡,每個 peer 是一個虛拟路由器容器,叫做“weave 路由器”,它們分布在不同的主控端上。這個對等網絡的每個 peer 之間會維持一個 TCP 連結,用于互相交換拓撲資訊,它們也會建立 UDP 連結用于容器間通信。一個 weave 路由器通過橋接技術連接配接到本主控端上的其他容器。當處于不同主控端上的兩個容器想要通信,一台主控端上的 weave 路由器通過網橋截獲資料包,使用 UDP 協定封裝後發給另一台主控端上的 weave 路由器。

每個 weave 路由器會重新整理整個對等網絡的拓撲資訊,可以稱作容器的 MAC 位址(如同交換機的 MAC 位址學習一樣擷取其他容器的 MAC 位址),是以它可以決定資料包的下一跳是往哪個容器的。weave 能讓兩個處于不同主控端的容器進行通信,隻要這兩台主控端在 weave 拓撲結構内連到同一個 weave 路由器。另外,weave 路由器還能使用公鑰加密技術将 TCP 和 UDP 資料包進行加密。

準備工作

在使用 weave 之前,你需要在所有主控端上安裝 Docker 環境,參考這些教程,在 Ubuntu 或 CentOS/Fedora 發行版中安裝 Docker。

Docker 環境部署完成後,使用下面的指令安裝 weave:

$ wget https://github.com/zettio/weave/releases/download/latest_release/weave

$ chmod a+x weave

$ sudo cp weave/usr/local/bin

注意你的 PATH 環境變量要包含 /usr/local/bin 這個路徑,請在 /etc/profile 檔案中加入一行(LCTT 譯注:要使環境變量生效,你需要執行這個指令: source /etc/profile):

exportPATH="$PATH:/usr/local/bin"

在每台主控端上重複上面的操作。

Weave 在 TCP 和 UDP 上都使用 6783 端口,如果你的系統開啟了防火牆,請確定這兩個端口不會被防火牆擋住。

在每台主控端上啟動 Weave 路由器

當你想要讓處于在不同主控端上的容器能夠互相通信,第一步要做的就是在每台主控端上啟動 weave 路由器。

第一台主控端,運作下面的指令,就會建立并開啟一個 weave 路由器容器(LCTT 譯注:前面說過了,weave 路由器也是一個容器):

$ sudo weave launch

第一次運作這個指令的時候,它會下載下傳一個 weave 鏡像,這會花一些時間。下載下傳完成後就會自動運作這個鏡像。成功啟動後,終端會輸出這個 weave 路由器的 ID 号。

下面的指令用于檢視路由器狀态:

$ sudo weave status

linux下docker網絡配置,如何在 Docker 容器之間設定網絡

第一個 weave 路由器就緒了,目前為止整個 peer 對等網絡中隻有一個 peer 成員。

你也可以使用 docker 的指令來檢視 weave 路由器的狀态:

$ docker ps

linux下docker網絡配置,如何在 Docker 容器之間設定網絡

第二台主控端部署步驟稍微有點不同,我們需要為這台主控端的 weave 路由器指定第一台主控端的 IP 位址,指令如下:

$ sudo weave launch

當你檢視路由器狀态,你會看到兩個 peer 成員:目前主控端和第一個主控端。

linux下docker網絡配置,如何在 Docker 容器之間設定網絡

當你開啟更多路由器,這個 peer 成員清單會更長。當你新開一個路由器時,要指定前一個主控端的 IP 位址,請注意不是第一個主控端的 IP 位址(LCTT 譯注:鍊狀結構)。

現在你已經有了一個 weave 網絡了,它由位于不同主控端的 weave 路由器組成。

把不同主控端上的容器互聯起來

接下來要做的就是在不同主控端上開啟 Docker 容器,并使用虛拟網絡将它們互聯起來。

假設我們建立一個私有網絡 10.0.0.0/24 來互聯 Docker 容器,并為這些容器随機配置設定 IP 位址。

如果你想建立一個能加入 weave 網絡的容器,你就需要使用 weave 指令來建立,而不是 docker 指令。原因是 weave 指令内部會調用 docker 指令來建立容器然後為它設定網絡。

下面的指令是在主控端 hostA 上建立一個 Ubuntu 容器,然後将它放到 10.0.0.0/24 網絡中,配置設定的 IP 位址為 10.0.0.1:

hostA:~$ sudo weave run10.0.0.1/24-t-i ubuntu

成功運作後,終端會顯示出容器的 ID 号。你可以使用這個 ID 來通路這個容器:

hostA:~$ docker attach

在主控端 hostB 上,也建立一個 Ubuntu 容器,IP 位址為 10.0.0.2:

hostB:~$ sudo weave run10.0.0.2/24-t-i ubuntu

通路下這個容器的控制台:

hostB:~$ docker attach

這兩個容器能夠互相 ping 通,你可以通過容器的控制台檢查一下。

linux下docker網絡配置,如何在 Docker 容器之間設定網絡

如果你檢查一下每個容器的網絡配置,你會發現有一塊名為“ethwe”的網卡,你配置設定給容器的 IP 位址出現在它們那裡(比如這裡分别是 10.0.0.1 和 10.0.0.2)。

linux下docker網絡配置,如何在 Docker 容器之間設定網絡

Weave 的其他進階用法

weave 提供了一些非常巧妙的特性,我在這裡作下簡單的介紹。

應用分離

使用 weave,你可以建立多個虛拟網絡,并為每個網絡設定不同的應用。比如你可以為一群容器建立 10.0.0.0/24 網絡,為另一群容器建立 10.10.0.0/24 網絡,weave 會自動幫你維護這些網絡,并将這兩個網絡互相隔離。另外,你可以靈活地将一個容器從一個網絡移到另一個網絡而不需要重新開機容器。舉個例子:

首先開啟一個容器,運作在 10.0.0.0/24 網絡上:

$ sudo weave run10.0.0.2/24-t-i ubuntu

然後讓它脫離這個網絡:

$ sudo weave detach10.0.0.2/24

最後将它加入到 10.10.0.0/24 網絡中:

$ sudo weave attach10.10.0.2/24

linux下docker網絡配置,如何在 Docker 容器之間設定網絡

現在這個容器可以與 10.10.0.0/24 網絡上的其它容器進行通信了。這在當你建立一個容器��網絡資訊還不确定時就很有幫助了。

将 weave 網絡與主控端網絡整合起來

有時候你想讓虛拟網絡中的容器能通路實體主機的網絡。或者相反,主控端需要通路容器。為滿足這個功能,weave 允許虛拟網絡與主控端網絡整合。

舉個例子,在主控端 hostA 上一個容器運作在 10.0.0.0/24 中,運作使用下面的指令:

hostA:~$ sudo weave expose10.0.0.100/24

這個指令把 IP 位址 10.0.0.100 配置設定給主控端 hostA,這樣一來主控端 hostA 也連到了 10.0.0.0/24 網絡上了。顯然,你在為主控端選擇 IP 位址的時候,需要選一個沒有被其他容器使用的位址。

現在 hostA 就可以通路 10.0.0.0/24 上的所有容器了,不管這些容器是否位于 hostA 上。好巧妙的設定啊,32 個贊!

總結

如你所見,weave 是一個很有用的 docker 網絡配置工具。這個教程隻是它強悍功能的冰山一角。如果你想進一步玩玩,你可以試試它的以下功能:多跳路由功能,這個在 multi-cloud 環境(LCTT 譯注:多雲,企業使用多個不同的雲服務提供商的産品,比如 IaaS 和 SaaS,來承載不同的業務)下還是很有用的;動态重路由功能是一個很巧妙的容錯技術;或者它的分布式 DNS 服務,它允許你為你的容器命名。如果你決定使用這個好東西,歡迎分享你的使用心得。

Docker 的詳細介紹:請點這裡

Docker 的下載下傳位址:請點這裡

本文由 LCTT 原創翻譯,Linux中國 榮譽推出

linux下docker網絡配置,如何在 Docker 容器之間設定網絡