Docker Network 容器間的通訊

容器間的通訊方式

一個分佈式應用,多個容器之間每每須要通訊,好比 HTTP 服務容器每每須要與數據庫容器進行通訊。容器的通訊方式有如下幾種:docker

  • 經過 docker run 起一個容器時帶上 --link 參數指定該容器與其餘容器進行相關聯 (即將廢棄,原理就不描述了)
  • 經過 docker network 系統來創建通訊
  • docker-compose

Docker Network

網絡驅動模式

Docker Network 有多種驅動模式,默認爲 bridge,即橋接模式。bridge network 原理是新建 network 時創建一個網橋(網關),全部加入此 network 的容器須要彼此通訊時經過該網橋進行轉發。每個 bridge network(包含網關及其下的容器)都有一個獨立的 IP 網段,不一樣網段間的容器沒法通訊,這也就是指定 bridge network 進行容器間網絡隔離的原理。數據庫

默認 Network

$ docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
9c9d4fd4f950        bridge              bridge              local
3ce82c0caf70        host                host                local
f1a111712ad4        none                null                local

Docker 內置了一個默認 bridge network(名爲 bridge,第一行),全部未指定 network 的容器,默認鏈接到此 network 中,其網段爲 172.17.0.X。因此,兩個未進行任何鏈接操做的容器是能夠經過 IP 地址互相通訊的,由於他們同在一個 network 下,但通信只能經過 IP 地址進行(好比 ping 172.17.0.5),不能夠經過容器名通訊(好比 ping container-name)。但自定義建立的網絡能夠經過容器名進行通訊。網絡

Screen Shot 2019-10-31 at 11.13.33 PM.png

圖中 docker0 即爲默認 bridge 網絡的網橋,它負責連通全部未指定 network 的容器,而且連通外網。分佈式

自定義網絡

$ docker network create NAME
  • 不指定 -d 參數,默認建立 bridge 驅動模式的 network。
  • 自定義的 bridge network 會有本身專屬的一個網段,與其餘 network 隔離。
  • 能夠經過 docker network connect 指令將容器鏈接到一個 network,也能夠在起容器(docker run 指令)時加入 --network 參數指定即將建立的容器加入到哪一個 network,還能夠經過 docker network disconnect 命令將容器移出自定義的 network。
  • 加入到同一個自定義 bridge network 的容器間能夠經過容器名(充當 hostname)進行通訊,會自動進行 DNS 解析,但前提是須要給容器指定名稱,隨機分配的容器名沒法被解析。也能夠經過 IP 進行通訊,由於屬於同一個網段。
  • 同一個容器能夠同時加入到多個 network 下,此時該容器擁有多個虛擬網卡(能夠經過 ifconfig 查看)。

參考