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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

11-Docker Bridge详解

發(fā)布時間:2025/3/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 11-Docker Bridge详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

11-Docker Bridge詳解

容器之間是如何通信的?

操作前刪除test2的容器。

  • 查看當(dāng)前機器上docker的網(wǎng)絡(luò)

    docker network ls NETWORK ID NAME DRIVER SCOPE 056d0ece100f bridge bridge local a78b081f0bda host host local 51a236124cac none null local

    這條命令會列舉出當(dāng)前機器上有哪些網(wǎng)絡(luò)。其實test1 就是連接到bridge這個網(wǎng)絡(luò)上的。

  • 查看bridge的網(wǎng)絡(luò)詳細信息

    docker network inspect 056d0ece100f # 這個是bridge的 NETWORK ID

    在結(jié)果中找到 Containers 這一項。

    "Containers": { "da991beadf34ef53be9cf3de8f0c5ba1599b76f4433f6627f96c46c09751ecf5": {"Name": "test1","EndpointID": "4764dcc3a29b9ee7efb6ea5dc5c905840362c8ddc0d944356a4c0e7b07a99d98","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16","IPv6Address": "" }

    說明這個test1 這個容器是連接到bridge網(wǎng)絡(luò)上的。

  • 查看當(dāng)前機器的網(wǎng)路

    ip a

    我們可以找到這兩條,docker0 與 veth01f8da0(可能是不一樣的,但都是veth開頭, veth是 virtual ethernet)

    4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:57:ac:11:fe brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever inet6 fe80::42:57ff:feac:11fe/64 scope link valid_lft forever preferred_lft forever 22: veth01f8da0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether d2:61:e8:a9:d7:9c brd ff:ff:ff:ff:ff:ff link-netnsid 0inet6 fe80::d061:e8ff:fea9:d79c/64 scope link valid_lft forever preferred_lft forever

    docker0是一個本機的network namespace,而 busybox有自己的 network namespace veth01f8da0@if21,它是連接到docker0上的。那么 test1 是如何連接的呢?首先查看 它的網(wǎng)絡(luò)

    docker exec test1 ip a

    其中有這一條

    21: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever

    其中eth0@if22 和 外面的 veth01f8da0@if21 是一對 veth,然后連接到docker0的網(wǎng)橋上。

    那我們驗證一下是否是這樣。首先安裝一個工具。

    sudo yum install bridge-utils

    運行命令

    brctl show bridge name bridge id STP enabled interfaces docker0 8000.024257ac11fe no veth01f8da0

    我們可以看到當(dāng)前機器內(nèi)只有一個 linux bridge。這里有一個接口 interfaces,不難發(fā)現(xiàn)它的名稱和之前本機網(wǎng)絡(luò)中的 22: veth01f8da0@if21是一樣的。所以這個接口是連接到docker0的bridge上的。

  • 再創(chuàng)建一個test2容器

    docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"

    查看本機的bridge情況。

    這個bridge就是通過docker network ls命令獲取的。

    docker network inspect 056d0ece100f # 也可以通過docker network inspect bridge "Containers": { "da991beadf34ef53be9cf3de8f0c5ba1599b76f4433f6627f96c46c09751ecf5": {"Name": "test1","EndpointID": "4764dcc3a29b9ee7efb6ea5dc5c905840362c8ddc0d944356a4c0e7b07a99d98","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16","IPv6Address": "" }, "db730b8fe9ca0a6fcdb215b15b894768e0a14cf45493d413a8b7363403c1c574": {"Name": "test2","EndpointID": "7cbae53c21a06866b140a683c993fddbc80edcf96a9c9b59669934dace123956","MacAddress": "02:42:ac:11:00:03","IPv4Address": "172.17.0.3/16","IPv6Address": "" }

    我們可以看到test2容器已經(jīng)在這個bridge內(nèi)了。

  • 本機查看網(wǎng)絡(luò)

    ip a 4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:57:ac:11:fe brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever inet6 fe80::42:57ff:feac:11fe/64 scope link valid_lft forever preferred_lft forever 22: veth01f8da0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether d2:61:e8:a9:d7:9c brd ff:ff:ff:ff:ff:ff link-netnsid 0inet6 fe80::d061:e8ff:fea9:d79c/64 scope link valid_lft forever preferred_lft forever 26: vethb9d5db9@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 9a:1c:2c:48:04:70 brd ff:ff:ff:ff:ff:ff link-netnsid 1inet6 fe80::981c:2cff:fe48:470/64 scope link valid_lft forever preferred_lft forever

    我們發(fā)現(xiàn)又多了一個vethb9d5db9。這是因為我們創(chuàng)建了test2,則必須在主機上再生成一個veth才能連接到docker0上,到這里我們應(yīng)該可以看出。

    為了使容器在主機間通訊,則必須需要有兩個veth,而成對的虛擬接口被叫做“peers”,它被鏈接到主機內(nèi)核的內(nèi)部,因此(數(shù)據(jù))包能在他們之間傳輸。

    再次查看本機的網(wǎng)橋情況

    brctl show bridge name bridge id STP enabled interfaces docker0 8000.024257ac11fe no veth01f8da0vethb9d5db9

    可以看到docker0已經(jīng)連接了兩個veth接口。

  • 此時拓撲圖是什么樣的?

    圖中綠色的方塊就是 veth,成對的veth才能連接到docker0。這很像我們現(xiàn)實中的網(wǎng)絡(luò),就好比 兩個人兩臺電腦連接到了同一臺路由器上,路由器為這兩臺電腦分配了兩個ip。但是此時 test1test2只是組成了局域網(wǎng),并不能訪問互聯(lián)網(wǎng)。

  • 容器是如何連接互聯(lián)網(wǎng)的?

    其實是通過了 NAT 技術(shù)。

    首先linux主機是可以訪問外網(wǎng)的,比如可以通過eth0訪問外網(wǎng)。

    eth0,eth1,eth2,代表網(wǎng)卡一,網(wǎng)卡二,網(wǎng)卡三(一般是有線連接),如果是無線網(wǎng)連接是 wlp5s0

    那么 test1 容器想訪問外網(wǎng),可以通過 docker0這個bridge,然后做一個NAT地址轉(zhuǎn)換成eth0地址,然后發(fā)送到外網(wǎng)。

    NAT 是通過iptabels實現(xiàn)的,具體可以自己google

    總結(jié)

    以上是生活随笔為你收集整理的11-Docker Bridge详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。