1. 程式人生 > >宿主機的容器是如何通過docker0通訊的?

宿主機的容器是如何通過docker0通訊的?

一、什麼是容器網路棧

所謂容器能看見的“網路棧”,被隔離在自己的Network Namespace當中

  1. 網絡卡(network interface)
  2. 迴環裝置(loopback device)
  3. 路由表(Routing Table)
  4. iptables規則
    當然 ,容器可以直接宣告使用宿主機的網路棧:-net=host(不開啟Network Namespace),這樣可以為容器提供良好的網路效能,但是也引入了共享網路資源的問題,比如埠衝突。
    大多數情況下,我們希望容器能使用自己的網路棧,擁有屬於自己的IP和埠

二、容器如何和其他不同Network Namespace的容器互動 ?

  1. 將容器看做一臺主機,兩臺主機通訊直接的辦法,就是用一根網線連線,如果是多臺主機之間通訊,就需要用網路將它們連線到一臺交換機上
  2. 在linux中,能夠起到虛擬交換機作用的裝置是網橋(Bridge)
    網橋是一個工作在資料鏈路層的裝置,功能是根據MAC地址學習來將資料包轉發到網橋不同埠上,為了實現上述上的,Docker專案預設在宿主機上建立了一個docker0的網橋,連線在上面的容器,可以通過它來通訊

三、如何把容器連線到docker0網路上

需要一種叫Veth Pair的虛擬裝置。當Veth Pair被創建出來後,總是以兩張虛擬網絡卡(Veth Peer)的形式成對出現 ,而且從其中一個網絡卡出的資料包,可以直接出現在它對應的另一張網絡卡上,即使兩張卡在不同的Network Namespace裡
這就使Veth Pair常常被用作連線不同的Network Namspace的網線

四、示例演示

下面將在宿主機啟動兩個容器,分別是nginx-1和nginx-2演示,nginx-1容器訪問nginx-2是如何通訊的

1. 執行一個nginx-1容器

 docker run -d --name=nginx-1 nginx

2.檢視nginx-1的網路裝置

root@d5bfaab9222e:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
        inet 172.18.0.2 netmask 255.255.0.0 broadcast 172.18.255.255
        ether 02:42:ac:12:00:02 txqueuelen 0 (Ethernet)
        RX packets 3520 bytes 8701343 (8.2 MiB)
        RX errors 0 dropped 0 overruns 0 frame 0
        TX packets 3010 bytes 210777 (205.8 KiB)
        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
        inet 127.0.0.1 netmask 255.0.0.0
        loop txqueuelen 1000 (Local Loopback)
        RX packets 0 bytes 0 (0.0 B)
        RX errors 0 dropped 0 overruns 0 frame 0
        TX packets 0 bytes 0 (0.0 B)
        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

eth0的網絡卡,是Veth Pari裝置的其中一端

3.檢視nginx-1的路由表,通過route命令檢視

root@d5bfaab9222e:/# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.18.0.1 0.0.0.0 UG 0 0 0 eth0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0

所有172.18.0.0/16網段的請求,都交給eth0處理,這是Veth Pair裝置的一端,另一端在宿主機上

5.檢視宿主機的網橋

通過brctl show檢視

root@VM-0-8-ubuntu:/home/ubuntu# brctl show
bridge name bridge id   STP enabled interfaces
docker0 8000.0242c635ddb8   no  veth4d1c130

可以看到,docker0上插入上veth4d1c130網絡卡

6.再執行一個nginx-2

 docker run -d --name=nginx-2 nginx

7.再檢視宿主機網橋

root@VM-0-8-ubuntu:/home/ubuntu# brctl show
bridge name bridge id   STP enabled interfaces
docker0 8000.0242c635ddb8   no  veth4d1c130
       vetha9356e9

可以看到,docker0插上了兩張網絡卡veth4d1c130、 vetha9356e9

此時,當容器nginx-1(172.18.0.2)ping容器nginx-2(172.18.0.3)的時候,就會發現兩個容器是可以連通的

五、nginx-1能訪問nginx-2的原理是什麼?

被限制在Network Namespace的容器程序,是通過Veth Pair裝置+宿主機網橋的方式,實現跟其它容器的資料交換

1.nginx-1訪問nginx-2時,IP地址會匹配到nginx-1容器的每二條路由規則

172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0

凡是匹配這條規則 的IP包,應該經過本機的eth0網絡卡,通過二層網路發往目的主機

2.要通過二層網路到達nginx-2 ,需要有172.18.0.3的MAC地址,找到

nginx-1容器需要通過eth0網絡卡傳送一個ARP廣播,通過IP來檢視對應的MAC地址
這個eth0網絡卡,是一個Veth Pair,它的一端在nginx-1容器的Network Namespace,另一端位於宿主機上(Host Namespace),並且插入在了宿主機的docker0網橋上
一旦虛假網絡卡(veth4d1c130)被插在網橋(docker0)上,呼叫網路的資料包會被轉發給對應的網橋,所以ARC請求會被髮給docker0

3.docker0轉發資料到到相應的nginx-2

docker0會繼續扮演二層交換機的角色,根據資料包的上的MAC地址(nginx-2的MAC地址),在它的CAM表裡查對應的埠,會找到vetha9356e9,然後將資料包發往這個埠,這樣資料包就到了nginx-2容器的Network Namespace裡
nginx-2看到它自己的eth0網絡卡上出現了流入的資料包,然後對請求進行處理,再返回響應給nginx-1

可以開啟iptables的TRACE功能檢視資料包的傳輸過程,通過tail -f /var/log/syslog

# iptables -t raw -A OUTPUT -p icmp -j TRACE
# iptables -t raw -A PREROUTING -p icmp -j TRACE

原理圖如下

相關推薦

宿主容器是如何通過docker0通訊的?

一、什麼是容器網路棧 所謂容器能看見的“網路棧”,被隔離在自己的Network Namespace當中 網絡卡(network interface) 迴環裝置(loopback device) 路由表(Routing Table) iptables規則 當然 ,容器可以直接宣告使用宿主機的網路棧:-net=

基於consul的Docker-overlay跨多宿主容器網路

環境限制必須安裝key-value儲存服務,如consul宿主機已經安裝docker engine宿主機的hostname必須不同核心大於3.16環境準備及角色分配兩臺ubuntu的server主機名ip核心啟動docker容器名稱docker engine版本consul服

Ubuntu之宿主與虛擬機器通訊設定處理

這樣配置就可以了,然後win:ipconfig 檢視VMnet8的IP地址; Ubuntu:ifconfig 檢視ens33的inet地址; 然後二者相互ping一下就可以了

VMware虛擬機器宿主與虛擬機器通訊慢解決方法

    在公司,為了充分利用伺服器效能,我在伺服器上裝了一個VMware Server2.0 ,真是方便,又免費,又穩定,經過一系列調優,速度挺好(具體調優過程,查詢我以前發的博文吧),一臺計算機變了好多臺伺服器(就是硬碟IO受限,回來申請加硬碟)。     近期調測系統時發

docker同宿主容器和不同宿主容器之間怎麽通信?

roc 網卡 命令執行 ip) oss namespace 跨主機通信 進行 work 第一部分 docker有四種網絡模式第一種:bridge 模式當docker進程啟動時,主機上會創建一個名為docker0的虛擬網橋,容器內部會創建一個只能容器內部看到的接口eth0,e

DOCKER容器宿主同網段互相通訊

相關閱讀: 博主最近在解決docker與宿主機同網段通訊的問題,寫此文章記錄一下整個過程。 遇到的問題 博主用兩臺docker容器做datanode,當時配置Docker網路時,使用了Bridge模式,docker0網段(172.

docker命令詳解、宿主容器通訊原理的問題

我的筆記本是window7系統,為了模擬伺服器的環境,安裝了虛擬機器centOS7。 前戲準備     一些操作都需要root許可權操作,從使用者角色轉換到root角色命令:sudo su     啟動docker服務:service docker start    

open vswitch實現不同宿主容器通訊(centos7)

實驗環境: 機器一:192.168.122.222 安裝docker,open vswitch 機器二:192.168.122.247 安裝docker,open vswitch ip a檢視主機的docker0介面為:172.17.0.1/16 一、部署主機

Docker1.12讓容器使用和宿主同一個網段

docker1.12讓容器使用和宿主機同一個網段步驟一:創建網絡$ docker network create -d macvlan --subnet=172.16.0.0/24 --gateway=172.16.0.1 -o parent=eno16777736 mynet548d79fe04c613d3c

VirtualBox實現宿主和虛擬之間網絡的通訊

popu cto 通信 res data rest data- 虛擬網絡 bsp 摘要:實現宿主機和虛擬機之間網絡的通訊 環境: 宿主機操作系統 WindowsXP 虛擬機軟件 VirtualBox 虛

weave實現宿主之間的容器互聯

weave docker weave實現宿主機之間的容器互聯Docker Weave簡介關於weave的原理不做細致的說明,如果想了解weave可以登陸官網:https://www.weave.works/註意:防火墻一定要打開6783端口,否則無法連接註意:開啟路由轉發#vim /etc/sysct

docker從容器裏面拷文件到宿主或從宿主拷文件到docker容器裏面

都是 pad ace lin tex doc text 就是 adding 1、從容器裏面拷文件到宿主機? 答:在宿主機裏面執行以下命令 docker cp 容器名:要拷貝的文件在容器裏面的路徑 要拷貝到宿主機的相應路徑

宿主-免密登錄Docker容器

hub 3.1 目錄 測試 pub emctl lsof 進行 2.3 討論QQ:1586558083 目錄 一、檢查系統內核 二、安裝Docker 2.1 安裝 2.2 查看docker版本 2.3 啟動docker 三、建立docker用戶和組 3.1 

Docker-使用數據卷在宿主容器間的數據共享

功能 gif spa pull 找到 是否 運行命令 如果 res 場景一:現在用Docker創建了N個容器,但是這些容器之間需要數據共享,這個時候我們應該怎麽辦?[參考第四步] 場景二:docker創建了一個容器並進入容器,添加了一些定制功能,此時除了用docker

使Docker容器擁有可被宿主以外的機器直接訪問的獨立IP

我們常用的docker容器都是將ip埠對映到宿主機,通過宿主機IP進行訪問。外部無法直接訪問容器IP,下面簡單介紹下怎麼做到區域網內直接訪問docker容器IP。 自動化指令碼見 https://github.com/liwei128

利用Docker容器的不安全部署獲取宿主許可權

濫用容器( container)及逃逸的方法有多種,本文將討論最基本的一種,即濫用docker socket來逃逸容器並在宿主機上以root身份執行最新資訊程式碼。   實驗環境設定 由於我們將使用手機麻將外掛容器, 因此星力捕魚刷分必須安裝docker。 建立網

Docker容器內部埠對映到外部宿主埠的方法小結

轉自:https://www.cnblogs.com/kevingrace/p/9453987.html   Docker允許通過外部訪問容器或者容器之間互聯的方式來提供網路服務。容器啟動之後,容器中可以執行一些網路應用,通過-p或-P引數來指定埠對映。 注意:宿主機的一個埠只能對映到容器內部

虛擬機器Ubuntu之間相互通訊以及虛擬機器與宿主進行通訊

虛擬機器Ubuntu之間相互通訊以及虛擬機器與宿主機進行通訊 在Vmware workstation上開啟兩臺虛擬機器 1.在設定裡將兩臺虛擬機器改成橋接模式 2.使用命令列靜態配置兩臺虛擬機器的IP地址分別為 虛擬機器Ubuntu1:192.168.0.3 虛擬機器Ubuntu2:19

如何在docker容器宿主之間複製檔案

直接上程式碼 sudo docker cp txcrm2:/home/log/production.log /system/logs ##仔細看 txcrm2是映象id ,後面就是檔案路徑

【docker】docker容器宿主之間檔案互傳,互相拷貝

原文地址:https://www.cnblogs.com/areyouready/p/8973495.html     【注意:命令中符號均為英文符號】 1、從容器裡面拷檔案到宿主機      答:在宿主機裡面執行以下命令