就網絡而言,橋接網絡(bridge network,也叫網橋)是一種鏈路層設備,用于轉發網段之間的流量。 bridge 可以是硬件設備或在主機內核中運行的軟件設備。
對 Docker 而言,橋接網絡使用允許容器連接到同一個橋接網絡來通信的軟件網橋,同時提供與未連接到該橋接網絡的容器的隔離。Docker bridge 驅動程序自動在主機中安裝規則使不同橋接網絡上的容器不能直接相互通信。
橋接網絡用于在同一個 Docker 守護進程上運行的容器通信。對于不同 Docker 守護進程的容器,可以在操作系統層級管理路由或使用 overlay 網絡來實現通信。
啟動 Docker 時,會自動創建默認的橋接網絡,新啟動的容器如果沒有特別指定都會連接到這個默認橋接網絡。也可以創建用戶自定義的橋接網絡,且用戶自定義的橋接網絡比默認的優先級要高。
1. 用戶自定義 bridge 和默認 bridge 的差別
1.1 用戶定義網橋提供更好的隔離和容器化應用之間的互操作性
連接到同一個用戶自定義網橋的容器會自動互相暴露所有端口,并且不會暴露到外部。這會讓容器化應用之間的通信更方便,而不會意外開放進入外部世界。
假設一個應用包含 web 前端和數據庫后端。外部需要訪問前端(可能是 80 端口),但是只有前端需要訪問數據庫后端。使用用戶自定義網橋,只需要將前端的端口暴露到外部,數據庫應用不需要開啟任何端口,因為 web 前端可以通過用戶自定義網橋直接訪問到。
如果在默認網橋上運行同一個應用堆棧,需要同時打開 web 前端和數據庫后端的端口,每次都需要使用 -p 或 --publish 標志。在意味著 Docker 主機需要通過其他方式來限制對數據庫后端端口的訪問。
1.2 用戶自定義 bridge 提供容器間自動 DNS 解析(automatic DNS resolution)
默認網橋上的容器只能通過 IP 地址互相訪問,除非你使用 --link 選項,這被認為是遺留的。在用戶自定義網橋中,容器之間可以通過名字會別名互相訪問。
這里還是用上面的例子分析,web 前端和數據庫后端。如果容器稱為 web 和 db,web 容器可以連接到 db 上的 db 容器(the web container can connect to the db container at db),不管這個應用堆棧運行在哪個 Docker 主機上。
如果在默認網橋上運行相同應用堆棧,需要人工創建容器之間的連接(使用遺留的 --link)標志。這些連接需要雙向創建,所以當需要通信的容器個數大于 2 個時復雜度會呈指數增長。或者,你可以編輯容器內的 /etc/hosts 文件,但這會產生難以調試的問題。
1.3 容器可以在運行中與用戶自定義網絡連接和斷開
在一個容器的生命周期中,可以在容器運行中將容器與用戶自定義網絡連接和斷開。要從默認網橋中移除容器,需要停止容器并且通過不同的網絡選項重新創建。
1.4 每個用戶自定義網絡創建一個可配置的橋
如果你的容器使用默認網橋,你可以配置它,但是所有容器都使用了相同設置,例如 MTU 和 iptables 規則。此外,對默認網橋的配置發生在 Docker 之外,需要重啟 Docker。
用戶自定義網橋通過 docker network create 來創建和配置。如果應用程序的不同分組有不同的網絡需求,可以獨立配置每個用戶自定義網橋,就像獨立創建一樣。
1.5 默認網橋中連接的容器共享環境變量
最初,在兩個容器之間共享環境變量的唯一方法是使用 --link 標志連接它們。用戶自定義網絡中無法使用這種類型的變量共享方式。然而,共享環境變量有更好的方式。一些想法:
多個容器可以使用 Docker volume 卷掛載用于共享信息的同一個文件或目錄。 可以通過 docker-compose 同時啟動多個容器,compose 文件可以定義共享變量。 可以使用 swarm 服務代替獨立的容器,可以利用 swarm 的共享的 secrets 和 configs。新聞熱點
疑難解答