Docker 網路模式

MowLi 微風
微風飛翔
Published in
7 min readApr 17, 2021

Docker 網路模式可以幫助我們對容器做有效的網路區隔,因此了解容器中各種網路模式的設置對於安全性非常重要的影響。

在這之中,Docker 網路能分為 single-host 與 multi-host 兩種類型。簡單來說,single-host 就是在單一台主機上管理多個容器之間的網路。而本篇主要專注於 single-host 的四種網路模式:none、bridge、container、host,以及比較其中的差異。

共同指令

docker network ls :檢視所有的網路
docker network inspect 網路名稱 :顯示網路的詳細資訊

一、none 模式

主要指令:--net=none

容器沒有對外連網的能力,唯一可用的就是自己的 loopback 127.0.0.1,這也代表外部沒有任何東西有辦法連結到該容器。

最後,ping 外網會得到 Network is unreachable 的結果,證實了容器無法與外部接觸,使用 ifconfig 指令可觀察到 none-mode-01 容器確實只有自己的 loopback。

node-mode-01 容器執行結果

優缺點及適用場景

  1. 僅有內網,獨立性與安全性最高。
  2. 沒有辦法連結外網,對於需要下載更新的情境就不適用。
  3. 若搭配 container 模式可擴大 none 模式的使用情境。

二、bridge 模式

為容器預設的網路模式。連結到同一個 bridge 下的容器們都能互相溝通,而不同 bridge 之間的容器是不能溝通的,除非透過 connect 指令。

舉一個簡單的情境,當你身處在一間房子 (bridge1),你理所當然可以與在房子裡的其他人(container)聊天、吃飯、玩 switch … 等等互動。但是,你突然想到另一個重要的朋友(container),但他正在家裡 (bridge2),很可惜沒辦法跟他分享當下的喜悅。

不過,現在手機那麼方便,直接用視訊就好了 (connect),這樣他就可以享受雖然在家,但也同時跟你們身處在同一個空間裡。

主要指令:--net=bridge名稱docker network create --driver=bridge 要取的bridge名稱

(一) 預設 bridge network

在 docker 中本來就會存在一個預設的 bridge,以下我們直接建立兩個容器來實際操作:

然後,使用 docker network inspect bridge 會發現裡面多了剛剛新增的那兩個容器 。試著拿 bridge-mode-01 容器去 ping 看看外網及另外一個容器看結果會怎樣?

結果 bridge-mode-01 容器 ping 得通外網及 bridge-mode-02 容器,這證明容器具備了外網及與其他容器進行溝通的能力。

二、自己客製的 bridge network

使用 docker network create --driver=bridge <要取的bridge名稱> 來建立自己的 bridge network。以下會建立兩個自己的 bridge network,它們會各別擁有兩個容器:

由於資訊太長了,整理成表格呈現:

照著剛剛的規則,容器 1 跟 2 互通,而容器 3 跟 4 互通,但是如果容器 4 想要跟 my-bridge-01 的容器做跨 bridge 間溝通是沒辦法的。

不同 bridge 之間的溝通

主要指令:docker network connect <容器要連結到的bridge> <哪個容器>

竟然 ping 通了,怎麼會這樣子?其實你自己看 docker network inspect my-bridge-01就知道了。

當容器 4 被 connect 到 my-bridge-01 時,它得到了位於 my-bridge-01 subnet 的新 ip,另外一個是原本在 my-bridge-02 subnet 的 ip,因此才能在兩個 bridge 內之間進行溝通。

有在用 docker-compose 應該會知道 link,據 docker 官方的說法是 link 為connect 舊版。總之,他們是一樣的東西。

優缺點及適用場景

  1. 各個容器能透過 bridge 進行溝通,可以使用外網。
  2. 若其中一個容器受感染的話有可能攻擊其他容器。但也不用擔心,容器有辦法可以關閉被訪問。
  3. 當網路配置的客製化需求大時可使用此模式,例如:DNS 設置、分配容器的 IP 地址範圍、MTU 等設定。

三、container 模式

此種模式可以指定一個容器去「共享」另外一個容器的網路設定。舉例來說,容器 B 指定使用 none 模式的容器 A,那麼容器 B 就會是 none 模式。

主要指令:--net=container:<你要複製的container> --name <新container>

執行結果為 container-mode-01 容器其網路設定確實與 container-04 完全相同。

container-mode-01 容器之網路設定
container-04 容器之網路設定

因此,它也跟 container-04 一樣能 ping 得通不同 bridge-01 跟 02 內的容器哦~反正就是連體雙胞胎的概念啦!

優缺點及適用場景

  1. 兩個容器的接口(interface)共享,所以可能發生衝突問題。
  2. bridge 網路模式的情況會受到防火牆規則的限制,但是 container 模式由於共享的關係,就算關閉防火牆,容器之間一樣可以進行溝通,甚至兩個 none 模式容器也可以。
  3. 可以拿來一個容器來監控另一個容器的網路流量[1]。

四、host 模式

host 模式的容器會直接共用虛擬主機的網路設定。

主要指令:--net=host:<你要複製的container> --name <建立的container>

hmf/nodejs-web 該 image 是一個顯示 「Hello, Nodejs and Docker」 文字的網頁,端口開在 3000,因此只要連到虛擬主機 ip 的 3000 port 就可以看到這段文字。

優缺點及適用場景

  1. 可以完全訪問主機的網路,獨立性及安全性最低。
  2. 除非沒有其它選擇,否則不建議使用。

最後,我們用書籍整理的架構圖來複習一下四種網路模式吧!而第二張圖是補充 bridge 模式的概念圖,容器會透過 container virtual interface 與其他容器溝通。

Docker Network 整體架構圖
補充:Docker Network Bridge 模式之概念圖

總結

single-host 的四種網路模式讓我們知道如何規劃與區隔容器之間的溝通,撰寫一次啟動多個容器 docker-compose 時也可以比較清楚 bridge 的部分在做些什麼事。

參考資料

  1. Nickoloff, J. (2016). Docker in action. Manning Publications Co.

--

--