日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[头脑风暴] 解读Docker Bridge网络模型

發布時間:2023/12/4 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [头脑风暴] 解读Docker Bridge网络模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景

這幾天在研究Kubernetes, 遇到一個有意思的nodejs鏡像:luksa/kubia

# 不帶端口映射啟動容器 docker run -it -d luksa/kubia # 連接到默認的Bridge網橋,容器IP是 172.17.0.2

之后,在宿主機使用容器IP和8080 端口可訪問該容器nodejs服務

對此我有幾個疑問,這幾個疑問在我看來有點與我之前對docker 網絡的認知相沖突。
Q1. 不是說如果容器沒有端口映射,容器內外隔離嗎,怎么在宿主機使用容器IP還可以訪問?
Q2. ?使用容器IP:8080可以訪問nodejs服務,這個8080從哪里來?

頭腦風暴

首先排除一些同事說法:這個容器是以host網絡模型連到宿主機,所以可以在宿主機通過容器IP訪問。這個新建容器肯定還是連接到默認的bridge網橋上。

  • All containers without a --network specified, are attached to the default bridge network.

  • In terms of Docker, a bridge network uses a software bridge which allows containers connected to the same bridge network to communicate, while providing isolation from containers which are not connected to that bridge network.

對于Q1,我有個誤區:沒有端口映射,容器內外網絡隔離,宿主機是無法訪問容器的。
A:? 實際上,對于加入同一bridge網橋上的容器,網橋內外網絡確實是隔離的,網橋上的容器都可以相互連接。
而我們的宿主機也在這個默認的bridge網橋設備上,其IP地址是網橋設備的網關(172.17.0.1)。

Q3.那端口映射到底起什么作用呢?
A:網橋模型確保了網橋內容器可相互訪問,但除此網橋之外的網絡均不能訪問容器, 這也正是bridge網絡隔離的效果。
端口映射-p表示容器綁定宿主機的網卡端口來實現轉發訪問,綁定的網卡決定了你對外暴露的程度。

  • 綁定宿主機的回環地址127.0.0.1

  • docker run -it -d -p 127.0.0.1:8080:8080 luksa/kubia

    那么在宿主機內只能使用127.0.0.1:8080訪問容器

  • 綁定宿主機的物理地址 10.201.80.126

  • docker run -it -d -p 10.201.80.126:8080:8080 luksa/kubia

    那么可使用宿主機物理IP10.201.80.126:8080訪問容器,這樣局域網機器就能訪問到容器了?3. 不寫IP,這樣會綁定到0.0.0.0,也就是宿主機所有的網卡。

    docker run -it -d -p 8080:8080 luksa/kubia

    很顯然,宿主機內回環地址和物理地址均可以訪問該容器了。

    再回到上面的Q2問題,通過容器IP:8080訪問容器,8080是哪里來的?

    8080是容器內nodejs進程的監聽端口,我們在構建鏡像時本就無所謂使用expose指令

    The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published.

    所以在docekr ps時候,并不會在PORTS列顯示任何內容,但是通過容器IP可直接連通容器內進程監聽端口。

    為啥訪問容器IP:8080 就可以訪問容器內nodejs提供的服務?

    這是因為容器鏡像在構建的時候,一般在0.0.0.0地址上監聽請求,這意味著程序在所有地址的8080端口上監聽請求。

    這樣就延伸出一個有趣的現象,讓我們進入容器內部:

    docker exec -it 3cc9f428fc25 bashcurl 127.0.0.1:8080curl 127.0.0.2:8080curl 127.0.1:8080curl 172.17.0.2:8080curl 172.17.2:8080

    幾個看起來錯誤的IP竟然也可以訪問nodejs服務, 這正是nodejs在http://0.0.0.0:8080地址監聽請求的結果。

    # 截取自該鏡像構建源碼:https://github.com/luksa/kubia-qps/blob/master/kubia-qps/app.js var www = http.createServer(handler); www.listen(8080);# nodejs: server.listen([port[, host[, backlog]]][, callback]) api If host is omitted, the server will accept connections on the unspecified IPv6 address (::) when IPv6 is available, or the unspecified IPv4 address (0.0.0.0) otherwise.

    猜想+?驗證+ 源碼支持,回應了一開始的幾個疑問,對容器Bridge的網絡認知進一步加深。

    總結輸出

  • bridge網橋內容器通過容器IP相互訪問,外部網絡隔離

  • docker run -p 參數通過端口映射,讓bridge網橋外網絡可以訪問容器

  • 一般情況下,對外提供web服務的docker鏡像會在0.0.0.0 地址上監聽請求

    • https://en.wikipedia.org/wiki/0.0.0.0

    • https://github.com/luksa/kubia-qps/blob/master/kubia-qps/app.js

    • https://linuxize.com/post/check-listening-ports-linux/

    推薦閱讀

    ●?程序員應對瀏覽器同源策略的姿勢

    ●?一文掌握Cookies前世今生

    ●?ASP.NET Core跨平臺技術內幕

    ●?TPL Dataflow組件應對高并發,低延遲要求

    ●?實例解讀Docker Swarm

    ●?基于docker-compose的Gitlab CI/CD實踐&排坑指南

    總結

    以上是生活随笔為你收集整理的[头脑风暴] 解读Docker Bridge网络模型的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。