摘要:容器與主機共享同一,共享同一套網絡協議棧路由表及規則等。基本網絡配置平臺下,容器網絡資源通過內核的機制實現隔離,不同的有各自的網絡設備協議棧路由表防火墻規則等,反之,同一下的進程共享同一網絡視圖。設計的網絡模型。
整理自《Docker進階與實戰》
Docker網絡現狀為了解決容器網絡性能低下、功能不足的問題,Docker啟動了子項目“Libnetwork”。Libnetwork提出了新的容器網絡模型(Container Network Model,簡稱CNM),定義了標準的API用于為容器配置網絡,其底層可以適配各種網絡驅動(如圖Docker-network01所示)。CNM有三個:
沙盒
沙盒是一個隔離的網絡運行環境,保存了容器網絡棧的配置,包括了對網絡接口、路由表和DNS配置的管理。在Linux平臺上,沙盒是用Linux Network Namespace實現的,在其他平臺上可能是不同的概念,如FreeBSD Jail。一個沙盒可以包括來自多個網絡的多個Endpoint(端點)。
Endpoint
Endpoint將沙盒加入一個網絡,Endpoint的實現可以是一對veth pair或者OVS內部端口,當前的Libnetwork使用的是veth pair。一個Endpoint只能隸屬于一個沙盒及一個網絡。通過給沙盒增加多個Endpoint可以將一個沙盒加入多個網絡。
網絡
網絡包括一組能互相通信的Endpoint。網絡的實現可以是Linux bridge、vlan等。
從CNM的概念角度講,Libnetwork的出現使得Docker具備了跨主機多子網的能力,同一個子網內的不同容器可以運行在不同主機上。比如,同屬于192.168.0.0/24子網IP地址分別為192.168.0.1和192.168.0.2的容器可以位于不同的主機上且可以直接通信,而持有IP 192.168.1.1的容器即使與IP為192.168.0.1的容器處于同一主機也不能互通。
Libnetwork已經實現了五種驅動(driver):
bridge
Docker默認的容器網絡驅動。Container通過一對veth pair連接到docker0網橋上,由Docker為容器動態分配IP及配置路由、防火墻規則等。
host
容器與主機共享同一Network Namespace,共享同一套網絡協議棧、路由表及iptables規則等。容器與主機看到的是相同的網絡視圖。
null
容器內網絡配置為空,需要用戶手動為容器配置網絡接口及路由等。
remote
Docker網絡插件的實現。Remote driver使得Libnetwork可以通過HTTP RESTful API對接第三方的網絡方案,類似SocketPlane的SDN方案只要實現了約定的HTTP URL處理函數及底層的網絡接口配置方法,就可以替換Docker原生的網絡實現。
overlay
Docker原生的跨主機多子網網絡方案。主要通過使用Linux bridge和vxlan隧道實現,底層通過類似于etcd或consul的KV存儲系統實現多機的信息同步。overlay驅動當前還未正式發布,但開發者可以通過編譯實驗版的Docker來嘗試使用,Docker實驗版同時提供了額外的network和service子命令來進行更靈活的網絡操作,不過,需要內核版本>=3.16才可正常使用。
以上五種驅動已經隨Docker 1.8一同發布。
基本網絡配置Linux平臺下,Docker容器網絡資源通過內核的Network Namespace機制實現隔離,不同的Network Namespace有各自的網絡設備、協議棧、路由表、防火墻規則等,反之,同一Network Namespace下的進程共享同一網絡視圖。通過對Network Namespace的靈活操縱,Docker提供了五種容器網絡模式。
none
不為容器配置任何網絡功能。
在該模式下,需要以-–net=none參數啟動容器
$ docker run --net=none -ti ubuntu:latest ip addr show
使用-–net=none啟動容器之后,仍然可以手動為容器配置網絡。
container
與另一個運行中的容器共享Network Namespace,共享相同的網絡視圖。
舉個例子,首先以默認網絡配置(bridge模式)啟動一個容器,設置hostname為dockerNet,dns為8.8.4.4。
$ docker run -h dockerNet --dns 8.8.4.4 -tid ubuntu:latest bash 964286222ab53c67b2d6fb1882b2364c745be718a4a13530b016fe51b4968054
然后以–-net=container:96428方式啟動另一個容器
$ docker run --net=container:96428 -ti ubuntu:latest bash
進入容器,通過ip addr show命令可以發現兩個容器的IP地址、DNS、hostname都是相同的。實質上兩個容器是共享同一個Network Namespace的,網絡配置自然也是完全相同的。
host
與主機共享Root Network Namespace,容器有完整的權限可以操縱主機的協議棧、路由表和防火墻等,所以被認為是不安全的。
相應的,host模式啟動時需要指定-–net=host參數。舉個例子
$ docker run -ti --net=host ubuntu:latest bash
host模式下,容器可以操縱主機的網絡配置,這是危險的,除非萬不得已,應該盡可能避免使用host模式。
bridge
Docker設計的NAT網絡模型。
Docker daemon啟動時會在主機創建一個Linux網橋(默認為docker0,可通過-b參數手動指定)。容器啟動時,Docker會創建一對veth pair(虛擬網絡接口)設備,veth設備的特點是成對存在,從一端進入的數據會同時出現在另一端。Docker會將一端掛載到docker0網橋上,另一端放入容器的Network Namespace內,從而實現容器與主機通信的目的。bridge模式下的網絡拓撲圖如圖docker-network02所示:
在橋接模式下,Docker容器與Internet的通信,以及不同容器之間的通信,都是通過iptables規則控制的。總之,Docker網絡的初始化動作包括:創建docker0網橋、為docker0網橋新建子網及路由、創建相應的iptables規則等。Bridge模式是Docker默認的容器運行模式,以bridge模式啟動的容器,默認會從172.17.42.1/16子網內分配IP。
overlay
Docker原生的跨主機多子網模型。
overlay網絡模型比較復雜,底層需要類似consul或etcd的KV存儲系統進行消息同步,核心是通過Linux網橋與vxlan隧道實現跨主機劃分子網。如圖Docker-network03所示,每創建一個網絡,Docker會在主機上創建一個多帶帶的沙盒,沙盒的實現實質上是一個Network Namespace。在沙盒中,Docker會創建名為br0的網橋,并在網橋上增加一個vxlan接口,每個網絡占用一個vxlan ID,當前Docker創建vxlan隧道的ID范圍為256~1000,因而最多可以創建745個網絡。當添加一個容器到某一個網絡上時,Docker會創建一對veth網卡設備,一端連接到此網絡相關沙盒內的br0網橋上,另一端放入容器的沙盒內,并設置br0的IP地址作為容器內路由默認的網關地址,從而實現容器加入網絡的目的。
以圖Docker-network03為例,容器1和容器4同屬一個網絡,容器1需要通過256號vxlan隧道訪問另一臺主機的容器4。Docker通過vxlan和Linux網橋實現了跨主機的虛擬子網功能。
使用shell命令查看overlay網絡拓撲
# 創建網絡 $ docker network create -d overlay dev # 顯示網絡列表 $ docker network ls 9101d162c6db bridge bridge fcd0327f5104 dev overlay f5f9c8723777 none null eb81445767e1 host host # fcd0327f5104實質上是dev網絡的網絡ID,創建軟鏈接的目的是為了能夠使用ip命令操縱名字空間。 # ln -s /var/run/docker/netns/fcd0327f5104 /var/run/netns/fcd0327f5104 # 查看端口詳細信息 $ ip netns exec fcd0327f5104 ip addr show # 查看網橋信息 $ ip netns exec fcd0327f5104 brctl show # 查看vxlan詳細信息 $ ip netns exec fcd0327f5104 ip -d link show vxlan1
綜上所述,Docker的整個網絡模型,是建立在Network Namespace、Linux網橋、vxlan隧道、iptables規則之上的,也正是由于過于依賴網橋與iptables,導致Docker的網絡效率不高。
Docker網絡相關參數關于Docker網絡相關參數請參考“Docker(1.11.1)命令”。
待續···
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26627.html
摘要:在版本之后,引入了一套子命令來管理網絡。具體來說,網絡是通過一個叫的東西來進行管理的,用命令對網絡進行操作實際上是與進行交互。內置有五種網絡驅動,分別是驅動驅動驅動驅動驅動。這些網絡驅動為提供了多種網絡模式。 libnetwork docker在1.9版本之后,引入了一套docker network子命令來管理docker網絡。這允許用戶可以根據他們應用的拓撲結構創建虛擬網絡并將容器接...
摘要:使用相同網橋的容器有自己的子網,并且可以相互通信默認情況下。在虛擬接口上來自主機的流量捕獲將顯示容器在特定子網上發送的所有流量規則用于阻止不同的網絡有時網絡中的主機使用過濾器表進行通信。 我使用docker至今已有一段時間了,與絕大部分的人一樣,我被docker強大的功能和易用性深深的折服。簡單方便是docker的核心之一,它強大的功能被抽象成了非常簡單的命令。當我在使用和學習dock...
摘要:型網絡這是容器的默認網絡類型,網橋模式意味著容器間可以互相通信,而對外的通信需要借助宿主機,這一形式通常表現為端口號的映射。 以下記錄 Docker 中的常用操作、指令,使得大家能夠快速地使用 Docker。 為什使用 Docker? 為什么要使用 Docker?就個人而言,Docker 能提供的最大便利在于這種技術面對程序環境遷移時所表現的卓越性。 這種性能使得我們不必在分享代碼或項...
摘要:基礎入門之網絡容器篇本篇文章來自于官方基于文檔的指南學習整理如果英語好的同學其實可以看文檔,更加詳細。網絡篇結束下面是我在學習途中遇到的一些問題而尋找的答案。 基礎入門之網絡容器篇 Author:zhaojunlike@ Email:zhaojunlike@gmail.com 本篇文章來自于官方基于文檔的指南學習整理 如果英語好的同學其實可以看文檔,更加詳細。傳送門 Step1:...
摘要:后續將其他節點加入集群都會用到這個值將節點加入集群查看節點信息相關命令創建服務更新服務刪除服務減少服務實例增加服務實例查看所有服務查看服務的容器狀態查看服務的詳細信息。前言本篇是Docker第十三篇,Docker的使用至此就介紹完成,接下來繼續Kubernetes。Docker系列文章:為什么要學習DockerDocker基本概念Docker鏡像基本原理Docker容器數據卷Dockerfi...
閱讀 1630·2021-10-27 14:13
閱讀 1867·2021-10-11 10:59
閱讀 3366·2021-09-24 10:26
閱讀 1925·2019-08-30 12:48
閱讀 3040·2019-08-30 12:46
閱讀 2032·2019-08-30 11:16
閱讀 1414·2019-08-30 10:48
閱讀 2740·2019-08-29 16:54