Docker網路管理(容器的四種網路模式)
下面,我們來學習Docker的網路管理。
Docker 在啟動時會建立一個虛擬網橋 docker0,預設地址為 172.17.0.1/16,容器啟動後都會被橋接到 docker0 上,並自動分配到一個 IP 地址 .
- docker0預設地址
- 網橋
- 容器橋接docker0後,自動分配ip地址
一、容器的四種網路模式
Docker在建立容器時有四種網路模式,bridge為預設不需要用–net去指定,其他三種模式需要在建立容器時使用–net去指定。
- bridge模式,使用–net=bridge指定,預設設定。
- none模式,使用–net=none指定。
- host模式,使用–net=host指定。
- container模式,使用–net=container:容器名稱或ID指定
以下是docker網路初始化過程:
1、Bridge 橋接模式
Bridge 橋接模式的實現步驟主要如下:
(1) Docker Daemon 利用 veth pair 技術,在宿主機上建立兩個虛擬網路介面裝置,假設為
veth0 和 veth1。而 veth pair 技術的特性可以保證無論哪一個 veth 接收到網路報文,都會將報文傳輸給另一方。
(2) Docker Daemon 將 veth0 附加到 Docker Daemon 建立的 docker0 網橋上。保證宿主機的網路報文可以發往 veth0;
(3) Docker Daemon 將 veth1 新增到 Docker Container 所屬的 namespace 下,並被改名為 eth0。如此一來,保證宿主機的網路報文若發往 veth0,則立即會被 eth0 接收,實現宿主機到Docker Container 網路的聯通性;同時,也保證 Docker Container 單獨使用 eth0,實現容器網路環境的隔離性。
bridge 橋接模式下的 Docker Container 在使用時,並非為開發者包辦了一切。最明顯的是,該模式下 Docker Container 不具有一個公有 IP,即和宿主機的 eth0 不處於同一個網段。導致的結果是宿主機以外的世界不能直接和容器進行通訊。雖然 NAT 模式經過中間處理實現了這一點,但是 NAT 模式仍然存在問題與不便,如:容器均需要在宿主機上競爭埠,容器內部服務的訪問者需要使用服務發現獲知服務的外部埠等。另外 NAT 模式由於是在三層網路上的實現手段,故肯定會影響網路的傳輸效率。
2、Host 模式
Host 網路模式
host 模式是 bridge 橋接模式很好的補充。採用 host 模式的 Docker Container,可以直接使用宿主機的 IP 地址與外界進行通訊,若宿主機的 eth0 是一個公有 IP,那麼容器也擁有這個公有 IP。同時容器內服務的埠也可以使用宿主機的埠,無需額外進行 NAT 轉換。當然,有這樣的方便,肯定會損失部分其他的特性,最明顯的是 Docker Container 網路環境隔離性的弱化,即容器不再擁有隔離、獨立的網路棧。另外,使用 host 模式的 Docker Container 雖然可以讓容器內部的服務和傳統情況無差別、無改造的使用,但是由於網路隔離性的弱化,該容器會與宿主機共享競爭網路棧的使用;另外,容器內部將不再擁有所有的埠資源,原因是部分埠資源已經被宿主機本身的服務佔用,還有部分埠已經用以 bridge 網路模式容器的埠對映。
3、Container 模式
Container 網路模式
(1) 查詢 other container(即需要被共享網路環境的容器)的網路 namespace;
(2) 將新建立的 Docker Container(也是需要共享其他網路的容器)的 namespace,使用other container 的 namespace。
Docker Container 的 other container 網路模式,可以用來更好的服務於容器間的通訊。
在這種模式下的 Docker Container 可以通過 localhost 來訪問 namespace 下的其他容器,傳輸效率較高。雖然多個容器共享網路環境,但是多個容器形成的整體依然與宿主機以及其他容器形成網路隔離。另外,這種模式還節約了一定數量的網路資源。但是需要注意的是,它並沒有改善容器與宿主機以外世界通訊的情況。
4、None 模式
網路環境為 none,即不為 Docker Container 任何的網路環境。一旦 Docker Container 採用了none 網路模式,那麼容器內部就只能使用 loopback 網路裝置,不會再有其他的網路資源。可以說 none 模式為 Docker Container 做了極少的網路設定,但是俗話說得好“
少即是多”,在沒有網路配置的情況下,作為 Docker 開發者,才能在這基礎做其他無限多可能的網路定製開發。這也恰巧體現了 Docker 設計理念的開放。
在 none 網路模式下分配固定 ip:
netns 是在 linux 中提供網路虛擬化的一個專案,使用 netns 網路空間虛擬化可以在本地虛擬化出多個網路環境,目前 netns 在 lxc 容器中被用來為容器提供網路。使用 netns 建立的網路空間獨立於當前系統的網路空間,其中的網路裝置及 iptables 規則等都是獨立的,就好像進入了另外一個網路一樣。
二、Docker的四種模式部署
1、Bridge 橋接模式
[[email protected] ~]# docker run -it --name vm1 ubuntu
2、Host 模式
[[email protected] ~]# docker run -it --name vm2 ubuntu
[[email protected] ~]# docker run -it --name vm3 --net host ubuntu
3、Container 模式
[[email protected] ~]# docker run -it --name vm4 --net container:vm3 ubuntu
[[email protected] ~]# docker run -it --name vm5 --net container:vm1 ubuntu
4、None 模式
[[email protected] ~]# docker run -it --name vm6 --net none ubuntu
補充:
[[email protected]ation51 ~]# docker ps
[[email protected] ~]# docker rm -f `docker ps -aq` ##刪除所有執行的容器