Bridge network 是利用的是 Docker Host 上的 software bridge 來達成讓 container 可以對外連線的目的,並透過此 bridge 可以讓同一個 bridge 的 container 之間相互進行通訊,同時與未連接到該 bridge 的 container 隔離。並且 docker bridge driver 會自動在 Host 上設定相對應的 rule (iptables, network namespace),讓不同 bridge 上的 container 無法直接互相通訊。
Bridge network 是處理在單一 docker daemon 上運行的 container 之間的相互通訊,若是要處理多個 docker daemon 上的 container 通訊,可以在 OS 級別管理路由,或是使用 Overlay network。
當 docker 啟動時,會自動創建一個預設的 bridge network(預設名稱為 docker0 或 Bridge),docker0 會和 host 中的對外網卡(eth0)相連,解此取得對外連線的能力。除非另外設定,不然預設啟動的 container 將連接到這個 bridge network 並被分配一個 IP。如果想要自定義 Network 也可以自行設定,使用自定義的 bridge network 會比預設的 bridge 好一些。
172.17.0.0/16
代表子網路(Subnet),是指一網路的網段從 172.17.0.1 ~ 172.17.255.255
,子網路的主機可以互相通訊。/16
是指 16 bits 的子網路遮罩 255.255.0.0
。172.17.0.1
代表閘道器(Gateway)也就是 docker0 網路介面卡(虛擬網卡)。假設一個外部 192.168.0.5
的設備要訪問我們的主機的 container_1 ,我們要設定-p
,把container 內的 port 暴露出來,這參數會自動設定內外部 network 的轉換 NAT (Network Address Translation )。
舉例來說,當我們使用參數 -p 8080:80
開啟 container_1 port 8080 時,從外部 192.168.0.5
訪問 192.168.0.2:8080
就會透過 NAT 轉到容器的 172.17.0.2:80
。
Bridge network 有以下使用方法:
使用預設 bridge network(不推薦)
使用 --link
參數
docker run -it ubuntu:18.04
docker run -it --link <container_1 name or id> ubuntu:18.04
使用 --link
參數是在系統目錄 /etc/hosts
內新增目標 container 的 IP address 來連結目標 container ID 和 name,因此也可以在之後再進入 container 系統目錄新增 IP address 來連結 container 之間。使用 ping <container name or id>
測試連接狀態。
不使用 --link
參數
docker run -it ubuntu:18.04
docker run -it ubuntu:18.04
事實上就算不使用 --link
參數,container 之間也已經在同一個 bridge 之下,因此就算不使用 --link
參數,也可以直接使用 ping <container IP address>
測試連接狀態。
使用自訂 bridge network
新增一個 bridge network
docker network create -d bridge <custom bridge>
新增的 network 會被分配到不同的網段(如:172.18.0.0/16
),與原先的 docker0 (bridge) 不同(如:172.17.0.0/16
)。
使用預設 container name
docker run -it --net=<custom bridge> ubuntu:18.04
docker run -it --net=<custom bridge> ubuntu:18.04
使用自訂 bridge network 方法可以讓 network 中的 container 可以用 IP 或 ID 來互相連線,使用 ping <container IP or ID>
測試連接狀態。
使用自訂 container name
docker run -it --net=<custom bridge> --name=container_1 ubuntu:18.04
docker run -it --net=<custom bridge> --name=container_2 ubuntu:18.04
使用自訂 bridge network 及自訂 container name 方法可以讓 network 中的 container 可以用 IP 或 ID 或 name 來互相連線,使用 ping <container IP or ID or name>
測試連接狀態。
因為 docker 對於自訂的 docker network 會提供 automatic service discovery 的功能,讓 container 之間可以透過 name 或 ID 來與對方通訊
bridge network 就是在 container 之間架起一座橋樑,各自的 container 擁有各自的 IP 並利用 IP 進行互相溝通。
以預設 docker0 為例, host 以 172.17.0.1
來與 container (172.17.0.2 ~ 172.17.255.254
) 溝通,也就是透過虛擬網卡來達到和 container 同一區域網路的目的。