11-Docker Bridge詳解

11-Docker Bridge詳解

容器之間是如何通信的?

操作前刪除test2的容器。

  1. 查看當前機器上docker的網絡

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

    這條命令會列舉出當前機器上有哪些網絡。其實test1 就是連接到bridge這個網絡上的。

  2. 查看bridge的網絡詳細信息

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

    在結果中找到 Containers 這一項。

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

    說明這個test1 這個容器是連接到bridge網絡上的。

  3. 查看當前機器的網路

    ip a
    

    我們可以找到這兩條,docker0veth01f8da0(可能是不一樣的,但都是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 是如何連接的呢?首先查看 它的網絡

    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的網橋上。

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

    sudo yum install bridge-utils
    

    運行命令

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

    我們可以看到當前機器內只有一個 linux bridge。這里有一個接口 interfaces,不難發現它的名稱和之前本機網絡中的 22: veth01f8da0@if21是一樣的。所以這個接口是連接到docker0的bridge上的。

  4. 再創建一個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容器已經在這個bridge內了。

  5. 本機查看網絡

    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
    

    我們發現又多了一個vethb9d5db9。這是因為我們創建了test2,則必須在主機上再生成一個veth才能連接到docker0上,到這里我們應該可以看出。

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

    再次查看本機的網橋情況

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

    可以看到docker0已經連接了兩個veth接口。

  6. 此時拓撲圖是什么樣的?

    在這里插入圖片描述

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

容器是如何連接互聯網的?

在這里插入圖片描述

其實是通過了 NAT 技術。

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

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

那么 test1 容器想訪問外網,可以通過 docker0這個bridge,然后做一個NAT地址轉換成eth0地址,然后發送到外網。

NAT 是通過iptabels實現的,具體可以自己google

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536035.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536035.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536035.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

12-容器之間link

12-容器之間link 這篇主要講 容器之間如何 link。 需要準備的是&#xff0c;創建兩個容器 test1 和 test2 通過 busybox。 在之前的課程中已經創建的只需要重新啟動即可。 什么情況下需要link 例如有一個容器是 web 服務器&#xff0c;并且跑在一個docker容器內&#xff0c;…

13-容器的端口映射

13-容器的端口映射 部署一個簡單web nginx容器 docker run -d --name web nginxnginx 默認的端口是 80 端口&#xff0c;此時我們是沒有辦法訪問的。 好的&#xff0c;通過前面的學習我們已經知道&#xff0c;這個 web 容器四連接到 bridge 網橋上的&#xff0c;那我們查看一…

14-容器網絡之host和none

14-容器網絡之host和none 在之前的小節&#xff0c;我們有看到過 host 和 none。 通過 docker network ls 查看。 none 網絡 刪除 test1 容器 docker stop test1 && docker rm test1創建 test1 容器并連接到none網絡 docker run -d --name test1 --network none busy…

15-多容器復雜應用的部署

15-多容器復雜應用的部署 此節主要是通過部署一個復雜的應用場景&#xff0c;進而練習容器的網絡相關知識。 創建一個flask-web應用 創建一個 flask-web 文件夾 mkdir flask-web在此文件夾內創建 app.py 文件 cd flask-web touch app.py編寫一個簡單的 web 程序 import os im…

16-多機器通信

16-多機器通信 回顧上節課的思考題。 flask-redis 想訪問 redis&#xff0c;該如何通信&#xff1f; 創建另外一臺linux虛擬機 直接拷貝Vagrantfile文件創建一個 centos 虛擬機 我們創建一個centos7-2文件夾&#xff0c;然后創建虛擬機 vagrant up創建的過程中提示選擇網絡接…

17-Docker的數據持久化介紹

17-Docker的數據持久化介紹 回顧容器與鏡像 容器是在鏡像之上創建的一層運行時層&#xff0c;這一層是可以讀寫的&#xff0c;我們能夠在容器內添加數據&#xff0c;讀取數據。 也就是說我們在創建容器的時候&#xff0c;我們能夠在容器內創建文件&#xff0c;安裝軟件等等&a…

18-數據持久化-Data Volume

18-數據持久化-Data Volume Data Volume 使用場景。一般來講有些容器自己會產生一些數據&#xff0c;我們不想數據隨著容器的銷毀而銷毀&#xff0c;我們想保存數據&#xff0c;正常一般用在數據庫&#xff0c;比如我們想保存數據庫中的數據&#xff0c;這個時候我們就會使用 …

19-數據持久化-Bind Mounting

19-數據持久化-Bind Mounting Bind Mounting 與 Data Volume區別 Data Volume 需要在 Dockerfile 內聲明需要創建的 volume 目錄。 Bind Mounting 則不需要在 Dockerfile 聲明 volume&#xff0c;只需要在創建容器的時候&#xff0c;也就是 run 的時候聲明即可。 如: dock…

go自定義包教程

go自定義包教程 而是環境為 go version go1.11 linux/amd64linux mint 19 創建一個自定義的包 切換到src目錄下&#xff0c;創建demo目錄 cd src mkdir demo再創建smap 文件夾 cd demo mkdir smap創建包文件 cd smap touch map.gomap.go文件內容 package smapimport "…

在Linux中對硬盤進行分區、格式化和掛載

在Linux中對硬盤進行分區、格式化和掛載 我最近有一個全新的4-TB硬盤加入我的電腦。所以我需要在Linux中安裝它。為此&#xff0c;我需要執行以下操作&#xff1a; 分區格式化掛載檢查是否已安裝硬盤驅動器 分區 首先&#xff0c;在通過SATA和電源線將硬盤連接到計算機后&am…

Angular gitlab持續集成之runner配置

gitlab持續集成 安裝Runner 正常安裝 sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64sudo chmod x /usr/local/bin/gitlab-runner sudo useradd --comment GitLab Runner --creat…

javascript編譯壓縮

javascript編譯 js是JavaScript 源碼文件&#xff0c; .min.js是壓縮版的js文件。 .min.js文件經過壓縮&#xff0c;相對編譯前的js文件體積較小&#xff0c;傳輸效率快。經過編碼將變量和函數原命名改為毫無意義的命名&#xff0c;以防止他人窺視和竊取 js 源代碼 在線版 g…

vscode設置中文

vscode設置中文 當我們安裝完成vscode后&#xff0c;會發現它是中文的&#xff0c;因為默認情況下&#xff0c;vscode使用的語言為英文(us)。 那很多同學是不喜歡英文的&#xff0c;不是看不懂&#xff0c;而是不方便哈。 修改語言配置文件 使用快捷鍵組合【CtrlShiftp】 在…

linux下編譯boost

linux下編譯boost 下載boot庫 官方下載地址 下載完成會解壓。 編譯 1.進入解壓后的文件夾內 cd boost_1_69_0 執行下面的語句 ./bootstrap.sh --with-librariesall --with-toolsetgcc–with-libraries 指定編譯哪些boost庫&#xff0c;all的話就是全部編譯&#xff0c;只想…

C++通過原子變量代替互斥量

C通過原子變量代替互斥量 廢話不多說&#xff0c;直接上代碼。 實現類似lock_guard功能 #include <atomic> #include <thread>class ClockGuard { public:ClockGuard(std::atomic_flag & atomic):m_lockedFlag(atomic){lock();}~ClockGuard(){unlock();}voi…

conky安裝配置

conky安裝配置 安裝conky sudo apt-get install conky-all修改配置 在主目錄下創建’.conkyrc’ 文件內容&#xff1a; # set to yes if you want Conky to be forked in the background background no cpu_avg_samples 2 net_avg_samples 2 out_to_console no # X font w…

Windows子系統安裝圖形界面

Windows子系統安裝圖形界面 有很多同學需要使用 linux 系統,但是又不想真正安裝一個 linux 系統。于是微軟大哥就把 ubuntu 系統集成到 windows 內了&#xff0c;你說 微軟 屌不屌&#xff1f; 言歸正傳。 安裝Xlaunch 因為這個是最靠譜的圖形化界面了&#xff0c;所以不解…

C++ 判斷類是否有某變量

C 判斷類是否有某變量 話不多說上代碼。 #define HAS_MEMBER(member)\template<typename T, typename... Args>struct has_member_##member\ {\private:\template<typename U> static auto Check(int) -> decltype(std::declval<U>().member(std::declv…

C++將地址轉換為字符串

C將地址轉換為字符串 有時候在做程序設計的時候&#xff0c;有可能需要做一個類似messageBus的功能&#xff0c;并且需要一個key保證唯一&#xff0c;那么如何實現這個key的唯一呢&#xff1f;大致兩種思路: 使用函數簽名&#xff0c;因為messagebus綁定的是一個函數&#xf…

Angular 8之升級和新功能摘要

Angular 8之升級和新功能摘要 Angular 8已經到來,并帶來了大量的工作流程和性能改進。就像我們之前發布的幾個版本一樣,讓我們回顧一下Angular 8的新功能,以及如何將Angular 7應用程序升級到Angular 8。 Angular 8中明顯的新功能數量有限,但確實還有一些好東西: Differen…