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