1. docker desktop中的容器與宿主機的區域網絡通信
兩台docker容器做datanode,當時配置Docker網路時,使用了Bridge模式,docker0網段(172.0.1.x),宿主機網段(192.1.1.x),使用外部客戶端請求下載HDFS文件,去指定的datanode上拉去數據時,外部客戶端無法連接到內部的docker容器,拋出的等待超時異常,並重試下載,更換請求的下載地址為可連接的宿主機datanode後, 才成功下載數據。
於是,想要對docker的網路配置進行修改,將docker容器的IP地址設置成與宿主機同網段,並且相互連通。
這里先要來說一下docker網路的四種方式:
1.Host模式:
Host 模式並沒有為容器創建一個隔離的網路環境。
該模式下的Docker 容器會和Host宿主機共享同一個網路namespace, Docker Container可以和宿主機一樣,使用宿主機的eth0,實現和外界的通信。
Host模式特點包括:
容器沒有隔離的 network namespace
容器的 IP 地址同 Docker host 的 IP 地址
注意:容器中服務埠號不能與Host宿主機上已經使用的埠號相沖突
host 模式能夠和其它模式共存
2.Container模式
Container網路模式是 Docker 中一種較為特別的網路的模式。處於這個模式下的 Docker 容器會共享其他容器的網路環境,因此,至少這兩個容器之間不存在網路隔離,而這兩個容器又與宿主機以及除此之外其他的容器存在網路隔離。
3.None模式
None 網路就是什麼都沒有的網路。掛在這個網路下的容器除了 lo,沒有其他任何網卡。需要我們自行去配置。
2. 如何在 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):
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 個贊!
3. 如何在 docker 容器之間設置網路
在使用weave之前,你需要在所有宿主機上安裝Docker環境,參考這些教程,在Ubuntu或CentOS/Fedora發行版中安裝Docker。Docker環境部署完成後,使用下面的命令安裝weave:$wget/zettio/weave/releases/download/latest_release/weave$chmoda+xweave$sudocpweave/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路由器也是一個容器):$sudoweavelaunch第一次運行這個命令的時候,它會下載一個weave鏡像,這會花一些時間。下載完成後就會自動運行這個鏡像。成功啟動後,終端會輸出這個weave路由器的ID號。下面的命令用於查看路由器狀態:$sudoweavestatus第一個weave路由器就緒了,目前為止整個peer對等網路中只有一個peer成員。你也可以使用docker的命令來查看weave路由器的狀態:$dockerps第二台宿主機部署步驟稍微有點不同,我們需要為這台宿主機的weave路由器指定第一台宿主機的IP地址,命令如下:$sudoweavelaunch當你查看路由器狀態,你會看到兩個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:~$sudoweaverun10.0.0.1/24-t-iubuntu成功運行後,終端會顯示出容器的ID號。你可以使用這個ID來訪問這個容器:hostA:~$dockerattach在宿主機hostB上,也創建一個Ubuntu容器,IP地址為10.0.0.2:hostB:~$sudoweaverun10.0.0.2/24-t-iubuntu訪問下這個容器的控制台:hostB:~$dockerattach這兩個容器能夠互相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網路上:$sudoweaverun10.0.0.2/24-t-iubuntu然後讓它脫離這個網路:$sudoweavedetach10.0.0.2/24最後將它加入到10.10.0.0/24網路中:$sudoweaveattach10.10.0.2/24現在這個容器可以與10.10.0.0/24網路上的其它容器進行通信了。這在當你創建一個容器而網路信息還不確定時就很有幫助了。將weave網路與宿主機網路整合起來有時候你想讓虛擬網路中的容器能訪問物理主機的網路。或者相反,宿主機需要訪問容器。為滿足這個功能,weave允許虛擬網路與宿主機網路整合。舉個例子,在宿主機hostA上一個容器運行在10.0.0.0/24中,運行使用下面的命令:hostA:~$sudoweaveexpose10.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個贊
4. 如何在 Docker 容器之間設置網路
在使用 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 個贊!
5. 請教如何修改虛擬網卡docker0的ip和子網掩碼
這個需要根據本地ip規劃
6. docker網路問題 怎麼解決
網路基礎 Docker 現有的網路模型主要是通過使用 Network namespace、Linux Bridge、iptables、veth pair 等技術實現的。(出處8) Network namespace:它主要提供了網路資源的隔離,包括網路設備、IPv4/IPv6 協議棧、IP 路由表、防火牆、/proc/net 目錄、/sys/class/net 目錄、埠(socket)等。 Linux Bridge:功能相當於物理交換機,為連在其上的設備(容器)轉發數據幀,如 docker0 網橋。 Iptables:主要為容器提供 NAT 以及容器網路安全。 veth pair:兩個虛擬網卡組成的數據通道。在 Docker 中,用於連接 Docker 容器和 Linux Bridge。一端在容器中作為 eth0 網卡,另一端在 Linux Bridge 中作為網橋的一個埠。 容器的網路模式 用來設置網路介面的 docker run --net 命令,它的可用參數有四個: none:關閉了 container 內的網路連接。容器有獨立的 Network namespace,但並沒有對其進行任何網路設置,如分配 veth pair 和網橋連接,配置 IP 等。 bridge:通過 veth 介面來連接其他 container。這是 docker 的默認選項。 host:允許 container 使用 host 的網路堆棧信息。容器和宿主機共享 Network namespace。 container:使用另外一個 container 的網路堆棧信息。kubernetes 中的 pod 就是多個容器共享一個 Network namespace。 我們需要從中選一個作為我們的網路方案,實際上只有 bridge 和 host 兩種模式可選。(想了解這四個參數,請翻到附錄B之 Network settings。) 在 docker 默認的網路環境下,單台主機上的容器可以通過 docker0 網橋直接通信,如下圖(圖作者馮明振)所示:
7. docker哪種網路模式比較好
Docker的4種網路模式
我們在使用docker run創建Docker容器時,可以用--net選項指定容器的網路模式,Docker有以下4種網路模式:
host模式,使用--net=host指定。
container模式,使用--net=container:NAME_or_ID指定。
none模式,使用--net=none指定。
bridge模式,使用--net=bridge指定,默認設置。
下面分別介紹一下Docker的各個網路模式。
1、host模式
眾所周知,Docker使用了Linux的Namespaces技術來進行資源隔離,如PID Namespace隔離進程,Mount Namespace隔離文件系統,Network Namespace隔離網路等。一個Network Namespace提供了一份獨立的網路環境,包括網卡、路由、Iptable規則等都與其他的Network Namespace隔離。一個Docker容器一般會分配一個獨立的Network Namespace。但如果啟動容器的時候使用host模式,那麼這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和埠。
例如,我們在10.10.101.105/24的機器上用host模式啟動一個含有web應用的Docker容器,監聽tcp80埠。當我們在容器中執行任何類似ifconfig命令查看網路環境時,看到的都是宿主機上的信息。而外界訪問容器中的應用,則直接使用10.10.101.105:80即可,不用任何NAT轉換,就如直接跑在宿主機中一樣。但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。
2、 container模式
在理解了host模式後,這個模式也就好理解了。這個模式指定新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、埠范圍等。同樣,兩個容器除了網路方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過lo網卡設備通信。
3、none模式
這個模式和前兩個不同。在這種模式下,Docker容器擁有自己的Network Namespace,但是,並不為Docker容器進行任何網路配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。需要我們自己為Docker容器添加網卡、配置IP等。
4、bridge模式
bridge模式是Docker默認的網路設置,此模式會為每一個容器分配Network Namespace、設置IP等,並將一個主機上的Docker容器連接到一個虛擬網橋上。
棧是一種常見的數據結構,它雖然有棧頂和棧底之分,但它只能從一端操作(插入或刪除),從而是一種「先進後出」的操作模式。向棧內進數據稱為壓棧(Push),從棧里取出數據叫出棧(POp)。例如壓棧順序為1、2、3、4、5,著出棧的順序為5、4、3、2、1(只考慮一次性出棧的情況)。
棧按照存儲的方式,又分為順序棧和鏈表棧。順序棧基於數組實現,所以順序棧存儲數據的內存是連續的,在創建棧時規定好棧的大小,這樣對內存的使用效率並不高。而鏈式棧則是採用了鏈表來實現,其元素的存儲地址是不連續的,而且是動態分配內存。順序棧在使用的過程中可能出現 棧滿、棧空的情況,由於鏈式棧基於鏈表設計,因此不會有棧滿的情況(也會棧空)。
8. docker網路怎麼配置/
在你的宿主機啟動docker的時候會多出一個 docker0 的虛擬網卡,然後容器都通過這個和外面通信。容器和docker宿主機之間是NAT的方式共享網路的,也就是說宿主機可以訪問的資源,容器也是可以直接訪問,你要使用apt-get,你就要保證你的宿主機可以上外網,否則免談。
9. 如何在 Docker 容器之間設置網路
注意你的 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. 怎麼設置Docker容器網路不能外網
在你的宿主機啟動docker的時候會多出一個 docker0 的虛擬網卡,然後容器都通過這個和外面通信。