4、容器虛擬化網絡概述

Docker 網絡

Docker 的網絡實現其實就是利用了 Linux 上的網絡名稱空間和虛擬網絡設備(特別是 veth pair)。

Linux 網絡命名空間:https://www.jianshu.com/p/369e50201bce

Linux虛擬網絡設備之veth:?https://segmentfault.com/a/1190000009251098

監控和調整Linux網絡堆棧:接收數據:https://blog.packagecloud.io/eng/2016/06/22/monitoring-tuning-linux-networking-stack-receiving-data/

Linux網絡-數據包的發送過程:https://segmentfault.com/a/1190000008926093

Docker網絡核心原理? ?http://blog.51cto.com/ganbing/2087598

?

基本原理

首先,要實現網絡通信,機器需要至少一個網絡接口(物理接口或虛擬接口)來收發數據包;此外,如果不同子網之間要進行通信,需要路由機制。

Docker 中的網絡接口默認都是虛擬的接口。虛擬接口的優勢之一是轉發效率較高。Linux 通過在內核中進行數據復制來實現虛擬接口之間的數據轉發,發送接口的發送緩存中的數據包被直接復制到接收接口的接收緩存中。

對于本地系統和容器內系統看來就像是一個正常的以太網卡,只是它不需要真正同外部網絡設備通信,速度要快很多。

Docker 容器網絡就利用了這項技術。它在本地主機和容器內分別創建一個虛擬接口,并讓它們彼此連通(這樣的一對接口叫做?veth pair)。

?

veth設備的特點

?

  • veth和其它的網絡設備都一樣,一端連接的是內核協議棧。
  • veth設備是成對出現的,另一端兩個設備彼此相連
  • 一個設備收到協議棧的數據發送請求后,會將數據發送到另一個設備上去。

?

參考自??http://blog.51cto.com/ganbing/2087598? ??https://segmentfault.com/a/1190000009251098

使用docker run命令創建一個執行shell(/bin/bash)的Docker容器,假設容器名稱為con1。
? ? ?在con1容器中可以看到它有兩個網卡lo和eth0。lo設備不必多說,是容器的回環網卡;eth0即為容器與外界通信的網卡,eth0的ip 為 172.17.0.2/16,和宿主機上的網橋docker0在同一個網段。

? ? ?查看con1的路由表,可以發現con1的默認網關正是宿主機的docker0網卡,通過測試, con1可以順利訪問外網和宿主機網絡,因此表明con1的eth0網卡與宿主機的docker0網卡是相互連通的。

? ? ?這時再來查看(ifconfig)宿主機的網絡設備,會發現有一塊以"veth"開頭的網卡,如veth60b16bd,我們可以大膽猜測這塊網卡肯定是veth設備了,而veth pair總是成對出現的。veth pair通常用來連接兩個network namespace,

? ? ?那么另一個應該是Docker容器con1中的eth0了。之前已經判斷con1容器的eth0和宿主機的docker0是相連的,那么veth60b16bd也應該是與docker0相連的,不難想到,docker0就不只是一個簡單的網卡設備了,而是一個網橋。

? ? ?真實情況正是如此,下圖即為Docker默認網絡模式(bridge模式)下的網絡環境拓撲圖,創建了docker0網橋,并以eth pair連接各容器的網絡,容器中的數據通過docker0網橋轉發到eth0網卡上。

? ? 這里的網橋概念等同于交換機,為連在其上的設備轉發數據幀。網橋上的veth網卡設備相當于交換機上的端口,可以將多個容器或虛擬機連接在上面,這些端口工作在二層,所以是不需要配置IP信息的。

? ? 圖中docker0網橋就為連在其上的容器轉發數據幀,使得同一臺宿主機上的Docker容器之間可以相互通信。


? ? 大家應該注意到docker0既然是二層設備,它上面怎么設置了IP呢?docker0是普通的linux網橋,它是可以在上面配置IP的,可以認為其內部有一個可以用于配置IP信息的網卡接口

? ?(如同每一個Open vSwitch網橋都有一個同名的內部接口一樣)。在Docker的橋接網絡模式中,docker0的IP地址作為連于之上的容器的默認網關地址存在。

在Linux中,可以使用brctl命令查看和管理網橋(需要安裝bridge-utils軟件包),比如查看本機上的Linux網橋以及其上的端口:

# yum install bridge-utils

# brctl show? ?//四個虛擬接口

bridge name    bridge id            STP enabled    interfaces
docker0        8000.02428f0e6a12    no             veth6a95f3bveth6d97324veth7314b3evethb2e752fvethdb62bce

更多關于brctl命令的功能和用法,大家通過man brctl或brctl --help查閱。

? ? docker0網橋是在Docker daemon啟動時自動創建的,其IP默認為172.17.0.1/16,之后創建的Docker容器都會在docker0子網的范圍內選取一個未占用的IP使用,并連接到docker0網橋上。

? ? 除了使用docker0網橋外,還可以使用自己創建的網橋,比如創建一個名為br0的網橋,配置IP:

# ip link show? ? //veth7314b3e和if8是一對

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000link/ether 00:0c:29:ee:53:1e brd ff:ff:ff:ff:ff:ff
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 02:42:8f:0e:6a:12 brd ff:ff:ff:ff:ff:ff
9: veth7314b3e@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether 42:a0:eb:96:15:cf brd ff:ff:ff:ff:ff:ff link-netnsid 0
11: vethb2e752f@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether 5a:8e:fa:1c:7f:8d brd ff:ff:ff:ff:ff:ff link-netnsid 1
13: veth6d97324@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether 4a:2f:07:20:53:15 brd ff:ff:ff:ff:ff:ff link-netnsid 2
17: vethdb62bce@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether 8a:1a:78:56:07:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 3
19: veth6a95f3b@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether aa:02:b6:a3:44:87 brd ff:ff:ff:ff:ff:ff link-netnsid 4

?

iptables規則
?Docker安裝完成后,將默認在宿主機系統上增加一些iptables規則,以用于Docker容器和容器之間以及和外界的通信,可以使用iptables-save命令查看。其中nat表中的POSTROUTING鏈有這么一條規則:

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

參數說明:
-s :源地址172.17.0.0/16
-o:指定數據報文流出接口為docker0
-j :動作為MASQUERADE(地址偽裝)

?? 上面這條規則關系著Docker容器和外界的通信,含義是:將源地址為172.17.0.0/16的數據包(即Docker容器發出的數據),當不是從docker0網卡發出時做SNAT。

? ? 這樣一來,從Docker容器訪問外網的流量,在外部看來就是從宿主機上發出的,外部感覺不到Docker容器的存在。
?? 那么,外界想到訪問Docker容器的服務時該怎么辦呢?我們啟動一個簡單的web服務容器,觀察iptables規則有何變化。

?

OVS:全稱是Open VSwitch,就是一個虛擬交換機,用于虛擬機VM環境。在虛擬化環境中,一個虛擬交換機主要有兩個作用:傳遞虛擬機VM之間的通信,以及實現VM和外界網絡的通信。

OVS主要由以下4層組成:

虛擬網卡:位于虛擬機內,在虛擬機創建后,會掛載在OVS上,每個虛擬網卡都有不同的MAC地址。

虛擬交換層:通過2個ovs虛擬交換機完成通信。OVS除提供基本網絡交換外,還提供一些高級功能,如NetFlow等。

bond層:bond是由linux提供的將多個物理網卡綁定在一起的技術,另一種說法叫trunk。Bond模式主要有:負載平衡、主備模式。目前主要使用的是主備模式,在主備模式下,有一個網卡是主用狀態,其它網卡均是備用狀態。這一層是可選的,如果沒有這一層,物理網卡可以直接掛在ovs上。

物理網卡:真正執行收發包的物理設備,一般都會掛載在trunk上,常見的物理網卡有Intel 82599 10G網卡、Intel 82576 1G網卡、Intel I350 1G網卡、SIGMA mellanox 10G網卡。

按照這樣的解釋,應該就比較清楚了。

OVS與傳統的硬件交換機工作原理也沒什么區別,就是基于MAC地址實現報文的交換。

host? ?https://blog.csdn.net/wangguohe/article/details/81535942

容器不會獲得一個獨立的network namespace,而是與宿主機共用一個。
這里寫圖片描述

在容器中使用ifconfig查看網絡發現顯示的是宿主機的網絡

host

父進程在創建子進程時,如果不使用```CLONE_NEWNET```這個參數標志,那么創建出的子進程會與父 進程共享同一個網絡namespace。

Docker就是采用了這個簡單的原理,在創建進程啟動容器的過程中,沒有傳入CLONE_NEWNET參數標志,實現Docker Container與宿主機共享同一個網絡環境,即實現host網絡模式。

優勢:

  • 可以直接使用宿主機的IP地址與外界進行通信,若宿主機的eth0是一個公有IP,那么容器也擁有這個公有IP。
  • 同時容器內服務的端口也可以使用宿主機的端口,無需額外進行NAT轉換。

缺陷:

  • 最明顯的是Docker Container網絡環境隔離性的弱化,即容器不再擁有隔離、獨立的網絡棧。
  • 使用host模式的Docker Container雖然可以讓容器內部的服務和傳統情況無差別、無改造的使用,但是由于網絡隔離性的弱化,該容器會與宿主機共享競爭網絡棧的使用;
  • 容器內部將不再擁有所有的端口資源,原因是部分端口資源已經被宿主機本身的服務占用,還有部分端口已經用以bridge網絡模式容器的端口映射。

none

獲取獨立的network namespace,但不為容器進行任何網絡配置,之后用戶可以自己進行配置,容器內部只能使用loopback網絡設備,不會再有其他的網絡資源。

創建docker網絡

# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
5ebae7e509fa        bridge              bridge              local    //默認網絡
b255b50dc21e        host                host                local
db26f5263d07        none                null                local

# docker container run --help

?--network string? ? ? ? ? ? ? ? ?Connect a container to a network (default "default")? ?//string指明要使用哪個網絡,默認是bridge

# docker network inspect bridge? ? //查看bridge的信息

# docker container inspect web1? ?//查看容器web1的詳細信息

?

轉載于:https://www.cnblogs.com/hanshanxiaoheshang/p/10397966.html

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

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

相關文章

Linux whoami命令、Linux su命令、Linux w命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux whoami命令用于顯示自身用戶名稱。 顯示自身的用戶名稱&#xff0c;本指令相當于執行"id -un"指令。 語法 whoami […

Weekly 10

Algorithm 1.Remove Element What 移除數組中的指定元素,返回處理后的長度sum,并且數組前sum長度的元素為處理后的元素,不用額外數組&#xff0c;O(1)。How 用快慢指針,快指針遍歷,遇到不等于指定元素的替換掉慢指針,然后慢指針前進一位即可。Key Codesclass Solution {public …

大數據計算:如何僅用1.5KB內存為十億對象計數

摘要&#xff1a;AddThis的數據分析副總監Matt Abrams在High Scalability上發表了一篇文章&#xff0c;介紹了他們公司如何應對大數據。Matt Abrams表示&#xff0c;AddThis僅僅用了1.5KB內存的內存就計算了十億個不同的對象&#xff0c;這與他們所使用的計算方法分不開的。 A…

C#關鍵字的個人理解與注釋

C#關鍵字注釋&#xff1a;abstract&#xff1a;抽象as&#xff1a;類型轉換&#xff08;返回轉換結果&#xff09;base&#xff1a;基類bool&#xff1a;布爾類型break&#xff1a;條件中斷語句byte&#xff1a;字節case&#xff1a;條件語句catch&#xff1a;異常捕獲后執行ch…

Linux declare命令、Linux tail 命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux declare命令用于聲明 shell 變量。 declare為shell指令&#xff0c;在第一種語法中可用來聲明變量并設置變量的屬性([rix]即為變…

詳解Nagios配置文件的邏輯關系

1.主配置文件/usr/local/nagios/etc/nagios.cfg a.定義了用戶和組 b.定義了某些具體參數 c.定義了配置文件和可以存放配置文件的文件夾 d.通過開頭的#號去注釋選項以達到關閉配置的效果 e.更改配置后&#xff0c;可以通過命令 /usr/local/nagios/bin/nagios –v /usr/local/na…

10 步讓你成為更優秀的程序員

這篇文章要介紹的&#xff0c;是我作為專業程序員這些年來學到的能真正提高我的代碼質量和整體工作效率的10件事情。 1. 永遠不要復制代碼 不惜任何代價避免重復的代碼。如果一個常用的代碼片段出現在了程序中的幾個不同地方&#xff0c;重構它&#xff0c;把它放到一個自己的函…

《流浪地球》 電影全集

《流浪地球》 電影全集 《流浪地球》是由郭帆導演&#xff0c;吳京特別出演&#xff0c;屈楚蕭、李光潔、吳孟達等人主演的科幻片《流浪地球》宣布定檔2019大年初一。同時&#xff0c;影片發布了一款定檔預告片&#xff0c;預告片開頭傳來一段廣播聲音&#xff1a;“太陽急速老…

kotlin之plus、copyOf、reverse、forEach、filter、map、reduce、fold等函數解釋和使用

kotlin之::函數調用、plus&#xff08;增加元素&#xff09;、copyOf&#xff08;復制數組&#xff09;、reverse&#xff08;翻轉數組&#xff09;、forEach&#xff08;遍歷數組&#xff09;、filter&#xff08;過濾數組&#xff09;、map函數操作及擴展、reduce函數、fold函…

linux 常用命令 雜記

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.cat cat 命令用于連接文件并打印到標準輸出設備上。 使用權限 所有使用者 2.Linux chgrp命令用于變更文件或目錄的所屬群組。 3.Linux…

C程序員要學C++嗎?

最近網友問到這一問題&#xff0c;但我更希望被問的是“C程序員需要學面向對象編程嗎&#xff1f;”&#xff0c;那就讓我先從回答這一問題開始&#xff0c;并做適當的擴展。 就我的成長經歷來看&#xff0c;C程序員必須學習面向對象編程&#xff01;面向對象編程語言有其天然的…

追女生心理研究(本人母胎單身,就是想做準備,并無其他意思)

聊天話題&#xff1a; 1。興趣愛好&#xff1a;美食&#xff0c;旅游&#xff0c;寵物等 2。現在和曾經的自己&#xff0c;分享自己的經歷 3。我變成我們&#xff0c;未來規劃 4。分析隱私&#xff0c;比如一些小秘密 5。價值觀&#xff0c;對未來的規劃等 聊天話題技巧 …

dlopen 和 dlsym 動態調用函數

Linux/unix 提供了使用 dlopen 和 dlsym 方法動態加載庫和調用函數&#xff0c;這套方法在 macOS 和 iOS 上也支持。dlopen 打開一個庫&#xff0c;獲取句柄。dlsym 在打開的庫中查找符號的值。dlclose 關閉句柄。dlerror 返回一個描述最后一次調用dlopen、dlsym&#xff0c;或…

通過騰訊地圖服務獲取行政區劃信息

接口說明地址&#xff1a; https://lbs.qq.com/webservice_v1/guide-region.html 以下是源代碼及表創建腳本。 源碼及相關文件下載轉載于:https://www.cnblogs.com/challengesoflife/p/10405366.html

情感學習聊天方法

1.非正常聊天法 出人意料的聊天技巧&#xff0c;展示幽默感&#xff0c;讓對方對自己產生興趣 比如對方說&#xff1a;你的朋友圈好多美女啊。回答還好了&#xff0c;沒有了。場面會一度尷尬 但可以這么說&#xff1a;你這樣是在間接夸自己是美女。或者&#xff1a;還好啦&a…

面向對象設計的優點

一旦明白了軟件設計的真諦&#xff08;參見《軟件設計的真諦》&#xff09;&#xff0c;我們就更能理解面向對象設計的優點。簡單說來&#xff0c;它更便于我們在軟件中構建更真實的虛擬世界。 首先&#xff0c;對象的引入方便了在軟件虛擬世界中模擬現實世界。現實世界是由很…

利用SVD-推薦未嘗過的菜肴2

推薦未嘗過的菜肴-基于SVD的評分估計 實際上數據集要比我們上一篇展示的myMat要稀疏的多。 from numpy import linalg as la from numpy import * def loadExData2():return[[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],[0, 0, 0, 0, 4, 0, 0, 1, 0,…

在圖像中截取小圖并保存

實現以橫向步長step_row、縱向步長step_col&#xff0c;在一幅大圖上剪裁寬度為width、高度為height的小圖像&#xff0c;圖像命名形式為“數字(遞增)_大圖名”格式&#xff0c;將小圖保存在argv[6]的文件夾中。 #include <opencv2/opencv.hpp> #include <string> …

Linux 文件與目錄管理、ls、cd、pwd、mkdir、rmdir、cp、 rm

見&#xff1a;http://www.runoob.com/linux/linux-file-content-manage.html我們知道Linux的目錄結構為樹狀結構&#xff0c;最頂級的目錄為根目錄 /。 其他目錄通過掛載可以將它們添加到樹中&#xff0c;通過解除掛載可以移除它們。 在開始本教程前我們需要先知道什么是絕對路…

軟件設計的真諦

假設我們身邊的一切都是用制造材料加以描述的&#xff1a;“空調”不是“空調”&#xff0c;而是“由金屬和塑料做成的物體”&#xff1b;“書”不是“書”&#xff0c;而是“由纖維和墨做成的物體”。溝通時我們也不用“空調”和“書”這樣的詞匯&#xff0c;而是“金屬和塑料…