如何在 Docker 容器之間設定網路

Dan Nanni發表於2015-06-02

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

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

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

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

Weave 是如何工作的

讓我們先來看看 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):

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

在每臺宿主機上重複上面的操作。

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

在每臺宿主機上啟動 Weave 路由器

當你想要讓處於在不同宿主機上的容器能夠互相通訊,第一步要做的就是在每臺宿主機上啟動 weave 路由器。

第一臺宿主機,執行下面的命令,就會建立並開啟一個 weave 路由器容器(LCTT 譯註:前面說過了,weave 路由器也是一個容器):

$ sudo weave launch 

第一次執行這個命令的時候,它會下載一個 weave 映象,這會花一些時間。下載完成後就會自動執行這個映象。成功啟動後,終端會輸出這個 weave 路由器的 ID 號。

下面的命令用於檢視路由器狀態:

$ sudo weave status 

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

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

$ docker ps 

第二臺宿主機部署步驟稍微有點不同,我們需要為這臺宿主機的 weave 路由器指定第一臺宿主機的 IP 地址,命令如下:

$ sudo weave launch <first-host-IP-address> 

當你檢視路由器狀態,你會看到兩個 peer 成員:當前宿主機和第一個宿主機。

當你開啟更多路由器,這個 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 run 10.0.0.1/24 -t -i ubuntu 

成功執行後,終端會顯示出容器的 ID 號。你可以使用這個 ID 來訪問這個容器:

hostA:~$ docker attach <container-id> 

在宿主機 hostB 上,也建立一個 Ubuntu 容器,IP 地址為 10.0.0.2:

hostB:~$ sudo weave run 10.0.0.2/24 -t -i ubuntu 

訪問下這個容器的控制檯:

hostB:~$ docker attach <container-id> 

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

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

Weave 的其他高階用法

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

應用分離

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

首先開啟一個容器,執行在 10.0.0.0/24 網路上:

$ sudo weave run 10.0.0.2/24 -t -i ubuntu

然後讓它脫離這個網路:

$ sudo weave detach 10.0.0.2/24 <container-id>

最後將它加入到 10.10.0.0/24 網路中:

$ sudo weave attach 10.10.0.2/24 <container-id> 

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

將 weave 網路與宿主機網路整合起來

有時候你想讓虛擬網路中的容器能訪問物理主機的網路。或者相反,宿主機需要訪問容器。為滿足這個功能,weave 允許虛擬網路與宿主機網路整合。

舉個例子,在宿主機 hostA 上一個容器執行在 10.0.0.0/24 中,執行使用下面的命令:

hostA:~$ sudo weave expose 10.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 服務,它允許你為你的容器命名。如果你決定使用這個好東西,歡迎分享你的使用心得。


via: http://xmodulo.com/networking-between-docker-containers.html

作者:Dan Nanni 譯者:bazz2 校對:校對者ID

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

相關文章