簡體   English   中英

docker BRIDGE 和 HOST 驅動程序的區別?

[英]difference between docker BRIDGE and HOST driver?

你能給我一份指南或圖表來理解其中的區別嗎?

我問這個問題的原因是我無法使用以下方法打開網站:

docker network create -d bridge mybridge 
docker run -d --net mybridge --name db redis 
docker run -d --net mybridge -e DB=db -p 8000:5000 --name web chrch/web 

但是我可以用下面的方法打開網站:

docker run --rm -d --network host --name my_nginx nginx

我用的是google雲平台VM實例,自己安裝docker。

根據有關橋接網絡docker 文檔

就 Docker 而言,橋接網絡使用軟件橋接器,允許連接到同一橋接網絡的容器進行通信,同時提供與未連接到該橋接網絡的容器的隔離。

根據有關主機網絡docker文檔

如果您為容器使用主機網絡驅動程序,則該容器的網絡堆棧不會與 Docker 主機隔離。 例如,如果您運行綁定到端口 80 的容器並使用主機網絡,則容器的應用程序將在主機 IP 地址的端口 80 上可用。

如果您想部署多個容器,它們之間使用私有內部網絡連接,請使用橋接網絡。 如果你想部署一個容器連接到與主機相同的網絡堆棧(並訪問與主機相同的網絡),請使用主機網絡。 如果您只是想發布一些端口,請使用--publish-p選項運行容器,例如-p 8080:80

在您的第一個示例中,我希望應用程序可以通過主機的 IP 地址在端口 8000(重新映射的端口)和第二個端口 5000(主機網絡沒有重新映射選項)訪問。 如果有某種配置或防火牆問題阻止了它的工作,你應該解決這個問題,而不是用--net host破解它。


Bridge 網絡是 Docker 的標准網絡模式。 如果可能,您應該更喜歡它。 令人困惑的是,它有兩種不同的模式,但是您使用顯式docker network create顯示的表單是最佳實踐,您應該盡可能使用它。 主機網絡完全禁用了 Docker 的網絡隔離。 這意味着容器可以看到並使用與主機可用的網絡接口完全相同的網絡接口,而無需中間的 NAT 層。

對於橋接網絡,您需要docker run -p選項來使特定端口在 Docker 之外可見。 作為操作員,您可以重新映射端口、綁定到多宿主系統上的特定接口,或者干脆拒絕讓其他主機看到服務。 顯式的docker network create形式允許容器使用它們的docker run --name作為主機名相互連接。 如果您在同一主機上運行多個應用程序堆棧,則可以通過使用單獨的網絡將它們彼此部分隔離。 每個容器都有自己獨立的網絡空間, localhost意思是“這個容器”。 這種模式也是多主機系統(如 Docker Swarm 或 Kubernetes)中網絡模型的一個簡單步驟。

使用主機網絡,以上都不起作用; 您不能使用docker run --net host -p ...並且您無法選擇端口的暴露位置或方式。 您無法訪問其他容器,除非它們被配置為自己發布端口。 由於您使用的是主機的網絡,因此localhost表示主機對其自身的看法。

對於 SO 答案中經常推薦的所有內容,很少需要--net host 我能想到的兩種情況是針對需要詢問主機網絡堆棧的服務(例如,像 Consul 這樣的服務發現系統需要知道主機正在偵聽的每個端口以進行通告)或針對服務它使用的端口集很大或不一致。 如果您使用--net host是因為您在應用程序中對localhost進行了硬編碼,那么最好將其設置為可配置..

Feature Bridge Host
司機 Bridge.network 由 Bridge 驅動程序提供 host.network 由主機驅動程序提供。
默認 bridge 是 default.network 並由 bridge 驅動程序提供 主機不默認。
連通性 網橋驅動程序為同一台機器上運行的所有容器提供容器間連接。 主機驅動程序指示 Docker 不要為附加的容器創建任何特殊的網絡命名空間或資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM