宿主機的容器是如何通過docker0通訊的?
一、什麼是容器網路棧
所謂容器能看見的“網路棧”,被隔離在自己的Network Namespace當中
- 網絡卡(network interface)
- 迴環裝置(loopback device)
- 路由表(Routing Table)
- iptables規則
當然 ,容器可以直接宣告使用宿主機的網路棧:-net=host(不開啟Network Namespace),這樣可以為容器提供良好的網路效能,但是也引入了共享網路資源的問題,比如埠衝突。
大多數情況下,我們希望容器能使用自己的網路棧,擁有屬於自己的IP和埠
二、容器如何和其他不同Network Namespace的容器互動 ?
- 將容器看做一臺主機,兩臺主機通訊直接的辦法,就是用一根網線連線,如果是多臺主機之間通訊,就需要用網路將它們連線到一臺交換機上
- 在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、從容器裡面拷檔案到宿主機 答:在宿主機裡面執行以下命令