A. docker網路問題 怎麼解決
網路基礎 Docker 現有的網路模型主要是通過使用 Network namespace、Linux Bridge、iptables、veth pair 等技術實現的。(出處8) Network namespace:它主要提供了網路資源的隔離,包括網路設備、IPv4/IPv6 協議棧、IP 路由表、防火牆、/proc/net 目錄、/sys/class/net 目錄、埠(socket)等。 Linux Bridge:功能相當於物理交換機,為連在其上的設備(容器)轉發數據幀,如 docker0 網橋。 Iptables:主要為容器提供 NAT 以及容器網路安全。 veth pair:兩個虛擬網卡組成的數據通道。在 Docker 中,用於連接 Docker 容器和 Linux Bridge。一端在容器中作為 eth0 網卡,另一端在 Linux Bridge 中作為網橋的一個埠。 容器的網路模式 用來設置網路介面的 docker run --net 命令,它的可用參數有四個: none:關閉了 container 內的網路連接。容器有獨立的 Network namespace,但並沒有對其進行任何網路設置,如分配 veth pair 和網橋連接,配置 IP 等。 bridge:通過 veth 介面來連接其他 container。這是 docker 的默認選項。 host:允許 container 使用 host 的網路堆棧信息。容器和宿主機共享 Network namespace。 container:使用另外一個 container 的網路堆棧信息。kubernetes 中的 pod 就是多個容器共享一個 Network namespace。 我們需要從中選一個作為我們的網路方案,實際上只有 bridge 和 host 兩種模式可選。(想了解這四個參數,請翻到附錄B之 Network settings。) 在 docker 默認的網路環境下,單台主機上的容器可以通過 docker0 網橋直接通信,如下圖(圖作者馮明振)所示:
B. 四、Docker網路揭秘
Docker 之所以功能這么強大,其實就是充分利用了Linux Kernel的特性:NameSpace、CGroups、UnionFileSystem。通過這些特性實現了資源隔離、限制與分層等。本文這次就來揭曉Docker中的容器是如何做到網路互通的。
兩台機器如果要實現通信,其實就是通過底層的網卡進行數據傳輸,每個網卡都有一個唯一的MAC地址,網卡又會綁定一個ip地址,只要兩台機器的網路可以互通,那麼這兩台機器就可以進行通信。
想要實現通信,就得有兩個同一網段的網卡,兩個網卡必須是可以 ping 通的。
Docker在安裝成功後,會在宿主機創建一個docker0網卡,這個網卡就是負責容器與宿主機之間通信的橋梁。
通過Docker創建一個容器之後,會在宿主機再創建一個網卡,也就是上面的 veth3543ea3@if7 ,容器內也會創建一個網卡。
一般成對的網卡,網卡組件名稱後面的數字是連續的,比如宿主機的 @if7 和容器內的 @if8 ,正是這成對的網卡,才實現了容器與宿主機之間的通信。這其實是利用 Linux Kernel 的特性 NameSpace 實現的網卡隔離,不同NameSpace下的網卡是獨立的,就像Java程序中的 package 一樣。
從上面的例子中看到容器與宿主機之間的通信好像並不是通過docker0網卡實現的?
其實這只是單容器的狀態,可能看不出docker0的作用。用圖來表示一下單容器的網卡通信情況。
通過docker生成的 eth0 和 veth 兩個網卡實現同一網段內的通信,而這個網卡又是橋接在docker0網卡上的。
再看下有多個容器的情況。
兩個容器之間可以互相通信的原因就是因為docker0的存在,因為它們的網卡都是橋接在docker0上,所以也就有了和另一個容器通信的橋。
我們來驗證一下是不是這樣!
這種網路連接方法我們稱為Bridge,這也是docker中默認的網路模式。可以通過命令查看docker中的網路模式:
通過 docker network ls 命令查看到,docker提供了3種網路模式,brige模式我們已經知道了,那 host 和 none 又是什麼意思呢?不妨來驗證一下:
這種模式只會創建一個本地的環路網卡,無法與其他容器或宿主機進行通信。
在創建自己的network之前先來解釋一下為什麼要創建新的network。
我們用一個例子來演示一下不同容器之間的通信。
容器之間通過 ip 是可以正常訪問的,但是有沒有這種情況:如果一個容器出問題了,我們重啟之後它的ip變了,那是不是其他用到這個容器的項目配置是不是都得改。
有沒有可能直接通過容器名稱來訪問呢?來驗證一下:
發現並不能 ping 通,但是可以使用別的手段來達到這個目的。
通過上面這種方式就可以做到以容器名來 ping 通其他容器,其實它就跟windows系統中在 hosts 文件里加了個映射是一樣的。
可以看到創建自定義的 network 自動幫我們實現了這個功能,而且使用自定義的 network 也方便管理,不同業務類型的容器可以指定不同的 network。
不同的 network ip網段也不一樣,這樣也可以增加單機中可以創建的容器的數量。
在創建一個容器的時候,一般都需要講容器需要暴露的埠映射到物理主機的相同埠或其他埠,因為在外網環境下是不方便直接連接到容器的,所以需要通過映射埠的方式,讓外網訪問宿主機的映射埠來訪問容器。
如果想建立多個容器,勢必需要埠映射,以滿足不同容器使用相同埠的情況。
以上這些內容都是在單容器進行操作,容器之間通信也只是通過 docker0 實現的橋接模式。
如果要實現多機之間的docker通信,其實還是通過網卡,只不過需要其他的技術來實現了。
本章節就不在演示,到後面的章節再來分析!
C. k8s 網路基礎
author:sufei
說明:本文主要記錄在學習k8s網路方面的相關知識
Linux在內核網路棧中引入網路命名空間,將 獨立的網路協議棧隔離 到不同的命令空間中,彼此間無法通信;
1、Linux操作系統,解析和封裝網路包是通過一個網路協議棧完成,下層為上層服務,這個 協議棧中即包括如軟體也包括硬體網路設 備。網路命名空間就是以軟體方式隔離出單獨的網路棧信息;
2、不同network namespace的軟硬體資源相互不可見,好像處在物理隔離的不同物理機上一樣,彼此隔離;
3、不同的網路命名空間會有自己獨立的網卡、路由表、ARP 表、iptables 等和網路相關的資源
4、實驗:可以藉助 ip netns 命令來完成對 Network Namespace 的各種操作,如:
問題 :什麼是轉移設備?
可以在不同的 Network Namespace 之間轉移設備(如veth)。由於一個設備只能屬於一個 Network Namespace ,所以轉移後在這個 Network Namespace 內就看不到這個設備了。 veth設備屬於可轉移設備 ,而很多其它設備(如lo、bridge等)是不可以轉移的。
veth pair 全稱是 Virtual Ethernet Pair,是一個成對的埠,所有從這對埠一 端進入的數據包都將從另一端出來,反之也是一樣。而veth pair就是為了在不同的 Network Namespace 直接進行通信,利用它可以直接將兩個 Network Namespace 連接起來。
實驗
veth pair打破了 Network Namespace 的限制,實現了不同 Network Namespace 之間的通信。但veth pair有一個明顯的缺陷,就是只能實現兩個網路介面之間的通信。如果我們想實現多個網路介面之間的通信,就可以使用下面介紹的網橋(Bridge)技術( 類似於物理交換機 )。
簡單來說,網橋就是把一台機器上的若干個網路介面「連接」起來。其結果是,其中一個網口收到的報文會被復制給其他網口並發送出去。以使得網口之間的報文能夠互相轉發。
網橋是一個二層網路設備,通過網橋可以將linux支持的不同的埠連接起來,並實現類似交換機那樣的多對多的通信。
實驗:
Netfilter負責在內核中執行各種掛接的規則(過濾、修改、丟棄等),運行在內核 模式中;Iptables模式是在用戶模式下運行的進程,負責協助維護內核中Netfilter的各種規則表;通過二者的配合來實現整個Linux網路協議棧中靈活的數據包處理機制。
iptables/netfilter(簡稱iptables)組成了Linux平台下的包過濾防火牆,可以完成封包過濾、封包重定向和網路地址轉換(NAT)等功能。這部分主要了解兩部分知識:
應用層不管是要發送還是接收網路消息,都需要通過linux內核提供的一系列關卡。每個」關卡「擔負著不同的工作。這里的」關卡「被稱為」鏈「。如下圖:
Docker啟動一個容器時會根據Docker網橋的網段分配給容器一個IP地址,稱為Container-IP,同時Docker網橋是每個容器的默認網關(如上面的172.17.0.1)。因為在同一宿主機內的容器都接入同一個網橋,這樣容器之間就能夠通過容器的Container-IP直接通信。
Docker網橋是宿主機虛擬出來的,並不是真實存在的網路設備,外部網路是無法定址到的,這也意味著外部網路無法通過直接Container-IP訪問到容器。如果容器希望外部訪問能夠訪問到,可以通過映射容器埠到宿主主機(埠映射),即docker run創建容器時候通過 -p 或 -P 參數來啟用,訪問容器的時候就通過[宿主機IP]:[容器埠]訪問容器。
下面具體來說說docker容器的幾種網路模式,以便後續學習k8s網路。
在host模式下( –net=host),容器不會去建立新的網路命名空間,而直接使用宿主機的網路設備以及網路協議棧。這樣自然不會虛擬出自己的網卡,配置自己的IP等。其特點如下:
這個模式就是在創建容器時,指定網路(–net=container:NAME_or_ID)與之前容器在同一個網路命名空間中,而不是和宿主機共享(這也就是k8s中pod內各容器的一種網路模式)。下面說明幾點:
none模式(–net=none)Docker容器擁有自己的Network Namespace,但是,並不為Docker容器進行任何網路配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。需要我們自己為Docker容器添加網卡、配置IP等。
bridge模式是docker容器的默認模式,當Docker進程啟動時,會在主機上創建一個名為docker0的虛擬網橋,此主機上啟動的Docker容器在bridge模式下會連接到這個虛擬網橋上,並由網橋自動分配ip。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網路中。
下面說明這個模式下的工作方式:
首先我們來看看k8s想要一個什麼樣的網路,也就是k8s網路設計的要求,具體如下:
下面簡單從幾中不同的通信要求來看看k8s網路實現。
在 Kubernetes 的世界裡,IP 是以 Pod 為單位進行分配的。一個 Pod 內部的所有容器共享一個網路堆棧。實際上就是docker container網路模式。可以直接通過本地localhost進行網路訪問。這個模式在mysql容器化中就是agent容器與mysql容器的網路通信方式。
Pod1和Pod2都是通信veth pair連接到同一個docker0網橋上,它們的IP地址都是從docker0網段上動態獲取的,它們和網橋本身的IP是同一個網段的。可以通過docker0作為交換機進行通信,也就是採用的docker bridge網路模式進行通信。
由於在同一個網橋docker0上即可以保證分配的pod IP不會沖突,且可以相互通信,而如果需要跨Node物理節點,則無法通過docker網路直接滿足要求了,那這些要求具體有哪些呢?
解決方案
方法一:k8s中通過在etcd中記錄正在運行中pod的IP分配信息,這樣我們就可以滿足Pod IP與Node IP之間映射關系的記錄;
方法二:可以在etcd中規劃配置好所有主機docker0網橋的子網范圍,從而滿足Pod IP不沖突的要求;如:
方法三:要實現Pod跨Node通信,以k8s默認網路Flannel為例,就是採用overlay(覆蓋網路)實現。具體下面說明:
問題:什麼是覆蓋網路?
覆蓋網路就是應用層網路,是指建立在另一個網路上的網路。怎麼理解呢?簡單理解就是將TCP數據包裝在另一種網路包裡面進行路由轉發和通信,另一種網路包目前可以是UDP、VxLAN、AWS VPC和GCE路由等數據轉發方式。默認以UDP為例來說明flannel工作方式。
下面看看具體實現
問題 :為保證各node內docker容器分配的ip地址不沖突,每個節點上的Docker會使用不同的IP地址段?如何實現的呢?
問題 :為什麼在發送節點上的數據會從docker0路由到flannel0虛擬網卡,在目的節點會從flannel0路由到docker0虛擬網卡?
D. Linux裡面k8s有幾種網路模式
1、單機網路模式:Bridge 、Host、Container、None
2、多機網路模式:一類是 Docker 在 1.9 版本中引入Libnetwork項目,對跨節點網路的原生支持;一類是通過插件(plugin)方式引入的第三方實現方案,比如 Flannel,Calico 等等。
E. docker 的container模式
Docker網路container模式是指,創建新容器的時候,通過 --net container 參數,指定其和已經存在的某個容器共享一個 Network Namespace。如下圖所示,右方黃色新創建的container,其網卡共享左邊容器。因此就不會擁有自己獨立的 IP,而是共享左邊容器的 IP 172.17.0.2,埠范圍等網路資源,兩個容器的進程通過 lo 網卡設備通信。
但這兩個容器在其他的資源上,如文件系統、進程列表等還是隔離的。
使用busybox鏡像新建bb容器,bb容器網路模型默認採用的bridge模式
使用Nginx鏡像新建nginx容器,並用 --net container:bb 參數,指定該容器的網路模型為container模式,和bb容器共用相同的網路命名空間。
進入bb容器
使用命令查看網路埠情況
可以看到,nginx容器的80埠已經映射到了bb容器的80埠
在bb容器內部訪問bb容器本機的80商品,我們可以看到實際上可以訪問到nginx容器的
查看bb容器的ip地址,並退出bb容器
使用上面得到IP地址,從雲環境主機的環境,去訪問
也會得到
總結
Docker container網路模式,這種模式可以節約一定的網路資源,並能降低容器間的通信的難度。container網路模式使多個容器共享網路環境,在這種模式下容器可以通過訪問localhost來訪問 namespace下的其他容器,網路性能高
F. 怎麼查看docker所在的網路模式
docker inspect可以查看當前容器所有信息 裡面就包含網路內容 可以看下linux就該這么學 網站上不少docker資料
G. Docker 使用筆記
啟動docker:進入launchpad,雙擊docker圖標即可啟動
鏡像:一個特殊的文件系統,提供容器運行所需的程序、庫、資源等。可以把它看作一個類。
容器:容器的實質是進程,每個進程最好佔用一個容器,比如 jenkins,wiki,jira,gitlab單獨放在不同容器中。可以把它看作是鏡像的一個實例。
倉庫:相當於git的遠程倉庫,有公開的,也有私有的,表現形式是 倉庫名>:標簽>,每個標簽即為一個遠程鏡像。
網路:Docker 允許通過外部訪問容器或者容器互聯的方式來提供網路服務。有多種網路模式。
數據管理:分為數據卷(volume)和掛載主機兩種方式
安裝docker的時候已經提到如何啟動docker
docker search 鏡像名> 在官方倉庫查找鏡像
docker pull [選項] [Docker Registry 地址[:埠號]/]倉庫名[:標簽]
docker run [選項] IMAGE [命令][參數..]
docker image ls 列出全部鏡像
docker image ls 鏡像名> 列出部分鏡像
docker system df
倉庫名和標簽都為 的鏡像
docker image ls -f dangling=true 查看虛擬鏡像
docker image prune 刪除虛擬鏡像
docker image rm [選項] 鏡像1> [鏡像2> ...] 刪除本地鏡像
docker image rm $(docker image ls -q image_name) 成批刪除鏡像,用在某個鏡像可能有不同tag,但想全部刪除的情況
作用:定製鏡像
構建鏡像:docker build [上下文路徑/URL/-],(docker build -t 鏡像名> -f . 是常用命令)
Dockerfile 常用指令:
FROM 鏡像名> 指定基礎鏡像
RUN 命令> 執行命令
COPY [--chown= : ] 源路徑>... 目標路徑> 復制文件
ADD [--chown= : ] 源路徑>... 目標路徑> 比COPY更高級的復制文件
CMD 容器啟動命令
H. 容器網路:盤點,解釋與分析
雖然許多人傾向用Overlays作為解決跨主機容器網路的實現方法,但是如果您想根據您的環境做出正確的網路選型,容器網路的功能和類型差異還是很大的,值得更深入的理解。 有些類型的網路是容器引擎不可知的,有些類型的網路被鎖定到特定的平台供應商或引擎。 一些類型主要關注組網的簡單性,另一些類型可能關注功能的廣度或IPv6支持以及組播能力。 哪一個適合您取決於您的應用程序需求,性能要求,工作負載布局(私有或公共雲)等。讓我們回顧一下目前比較常見的容器網路。
本文主要關注當前容器網路類型的細分,包括:
•None
•Overlay
•Underlay
曾經的容器網路隨著容器技術的進步與發展。 下面兩種模式的網路方案經消失。
Links and Ambassadors
在使用Swarm實現多主機網路支持和編排之前,Docker從單主機網路開始,通過links促成網路連接,作為允許容器通過環境變數或/ etc / hosts文件條目發現彼此的機制,並傳輸容器之間的信息。 links的能力通常與 ambassador pattern 相結合,以便於跨主機連接容器,並降低被寫死links的脆弱性。 這種方法的最大的問題是太靜態了。 一旦創建了容器並定義了環境變數,如果相關的容器或服務移動到新的IP地址,則不可能更新這些變數的值。
Container-Mapped Networking
在這種網路模式下,一個容器重用(映射到)另一個容器的網路命名空間。這種聯網模式只能用以下運行Docker容器的方式使用:-net:container:some_container_name_or_id。
這個運行命令標志告訴Docker將這個容器的進程放在已經在另一個容器中創建的網路棧中。當與第一個容器共享相同的IP和MAC地址和埠號時,新容器的進程仍然局限於自己的文件系統,進程列表和資源限制。這兩個容器上的進程將能夠通過loopback介面相互連接。
這種聯網方式對正在運行的容器執行診斷有用,並且容器缺少必要的診斷工具(例如curl或dig)。可以創建具有必要診斷工具的臨時容器並將其附加到第一容器的網路。
容器映射網路可以用於模擬pod式聯網,其中多個容器共享相同的網路命名空間。諸如共享本地主機通信和共享同一IP地址的優點是容器在同一個pod中運行的概念所固有的,這是rkt容器的行為。
現在的容器網路None
None 是比較直接的容器接收一個網路堆棧,但是缺少外部網路介面。 然而,它會接收一個loopback介面。 當使用無網路或空網路時,rkt和Docker容器項目均提供類似的行為。 這種容器網路的模式具有許多用途,包括測試容器,為稍後的網路連接分配容器,並且分配給不需要外部通信的容器。
Bridge
Linux網橋提供了主機內部網路,其中同一主機上的容器可以通信,但是分配給每個容器的IP地址不能從主機外部訪問。 Bridge網路利用iptables進行NAT和埠映射,從而提供單主機網路。橋接網路是默認的Docker網路類型(即,docker0),其中虛擬網路介面對的一端連接在網橋和容器之間。
這里有一個創建流程的例子:
1.在主機上設置網橋。
2.每個容器的命名空間都在該網橋中提供。
3.容器的ethX被映射到私有網橋介面。
4.使用帶有NAT的iptables來映射每個私有容器和主機的公共介面。
NAT用於提供主機之外的通信。雖然橋接網路解決埠沖突問題並為在一台主機上運行的容器提供網路隔離,但是會帶來一些NAT相關的性能成本。
Host
在這種方法中,新創建的容器與主機共享其網路命名空間,提供更高的性能(接近裸機),並且消除對NAT的需要; 然而,它確實遭受埠沖突問題。 雖然容器可以訪問所有主機的網路介面,但除非在特權模式下部署,容器可能不會重新配置主機的網路堆棧。
主機網路是Mesos中使用的默認類型。 換句話說,如果框架沒有指定網路類型,新的網路命名空間將不會與容器相關聯,而是與主機網路相關聯。 有時稱為本地網路,主機網路在概念上很簡單,使其更容易被理解,故障排除和使用。
Overlay
Overlays使用網路隧道在主機之間傳遞通信。這允許容器通過從一個主機到下一個主機隧道網路子網表現得好像它們在同一台機器上;實質上是一個網路跨越多個主機。目前存在許多隧道技術,例如虛擬可擴展區域網VXLAN。
VXLAN是Docker libnetwork的首選隧道技術,其多主機網路在1.9版本中作為原生功能。隨著這種能力的引入,Docker選擇利用HashiCorp的Serf作為gossip協議,選擇它的鄰居表交換和收斂時間的效率。
對於那些需要支持其他隧道技術的需求,Flannel可能是一個選擇。它支持udp,vxlan,host-gw,aws-vpc或gce。每個雲提供商隧道類型為您的帳戶或者VPC在提供商的路由表中創建路由。對公共雲的支持對於overlay驅動尤其重要,因為overlay能比較好的解決混合雲場景,並提供擴展和冗餘,而無需打開公共埠。
多主機網路在啟動Docker守護程序以及鍵值存儲時需要額外的參數。某些overlay依賴於分布式鍵值存儲。如果你正在做容器編排,你已經有一個分布式的鍵值存儲。
overlay層側重於跨主機通信挑戰。在同一主機上連接到兩個不同overlay網路的容器不能通過本地網橋彼此通信 - 它們是彼此分段的。
Underlays
底層網路驅動將主機介面(即,eth0處的物理網路介面)直接暴露給在主機上運行的容器或VM。 兩個這樣的底層驅動就是MACVLAN和IPVLAN。 網路工程師非常熟悉MACVLAN和IPVLAN驅動的操作和功能。 這兩個網路驅動在概念上比橋接網路更簡單,不需要埠映射,並且更高效。 此外,IPVLAN具有與許多網路工程師比較青睞的L3模式。 考慮到大多數公共雲中的限制(或缺乏能力),當您有本地工作負載,安全問題,流量優先順序或合規要求時,底層特別有用。 不同於每個VLAN需要一個網橋,底層網路允許每個子介面一個VLAN。
MACVLAN
MACVLAN允許在主機的單個物理介面後面創建多個虛擬網路介面。每個虛擬介面具有唯一的MAC和IP地址分配,有一個限制:IP地址需要在與物理介面相同的廣播域。雖然許多網路工程師可能更熟悉子介面這個術語(不要與輔助介面混淆),但用於描述MACVLAN虛擬介面的說法通常是上層或下層介面。 MACVLAN網路是一種消除對LINUX網橋需要的方式,NAT和埠映射,允許您直接連接到物理介面。
MACVLAN每個容器使用唯一的MAC地址,這可能導致啟用了防止MAC欺騙的這種安全策略(每個物理交換機介面僅允許一個MAC地址)的網路交換機出現問題。
容器流量被過濾掉,不能與底層主機通信,將主機和它上面運行的容器完全隔離。主機無法到達容器。容器與主機隔離。這對服務提供者或多租戶場景有用,並且具有比網橋模型更好的隔離。
MACVLAN需要混雜模式; MACVLAN有四種工作模式,Docker 1.12隻支持橋接模式。 MACvlan橋接模式和IPvlan L2模式在功能上等效。兩種模式都允許廣播和組播流量進入。這些底層協議的設計考慮了內部使用案例。您的公有雲里程將有所不同,因為它們的虛擬機介面上大多數不支持混合模式。
注意事項:MACVLAN橋接模式為每個容器分配唯一的MAC地址或許是跟蹤網路流量和端到端可見性的福音; 然而,對於具有512個唯一MAC地址的上限的典型網路介面卡(NIC),例如BR OADCOM,應該考慮這個上限。
IPVLAN
IPVLAN與MACVLAN類似,它創建新的虛擬網路介面並為每個IP地址分配一個唯一的IP地址。區別在於,相同的MAC地址用於主機上的所有pod和容器 - 物理介面的相同MAC地址。對這種行為的需要主要由以下事實驅動:許多交換機的通常配置的安全狀態是關閉具有來自多於一個MAC地址的業務的交換機埠。
最佳運行內核是4.2或更新版本,IPVLAN可以在L2或L3模式下運行。像MACVLAN一樣,IPVLAN L2模式要求分配給子介面的IP地址與物理介面在同一子網中。然而,IPvlan L3模式要求容器網路和IP地址在與父物理介面不同的子網上。
Linux主機上的802.1q配置(使用IP Link創建時)是短暫的,因此大多數運營商使用網路啟動腳本來保持配置。對於運行底層驅動程序和暴露API的程序化配置VLAN的容器引擎,自動化可以對其改進。例如,當在機架交換機頂部創建新VLAN時,這些VLAN可以通過暴露的容器引擎API.ico被推入Linux主機。
MACVLAN AND IPVLAN
當在這兩種底層類型之間進行選擇時,請考慮是否需要網路才能看到單個容器的MAC地址。
對於地址解析協議(ARP)和廣播通信,無論是底層驅動程序的L2模式,就像連接到交換機的伺服器那樣,通過將大量使用802.1D分組學習操作。然而,在IPVLAN L3模式中,網路堆棧在容器內處理,不允許多播或廣播流量。在這個意義之上,IPVLAN L3模式會按照您期望L3路由器的行為運行。
注意,上游L3路由器需要知道使用IPvlan創建的網路。網路廣告和重新分配網路仍然需要完成。今天,Docker正在嘗試邊界網關協議(BGP)。雖然靜態路 由可以在機架交換機的頂層創建,就像goBGP項目如雨後春筍般成立作為一個容器生態友好的方式來提供對等鄰居和路由交換功能。
盡管在給定主機上支持多種聯網模式,但是MACVLAN和IPVLAN不能同時在相同的物理介面上使用。總之,如果你習慣於在主機上運行trunks,可以用L2模式。如果你主要關注規模,L3則具有大規模的潛力。
DIRECT ROUTING
出於同樣的原因,IPVLAN L3模式被網路工程師所青睞,他們可能選擇專注於在第3層解決定址網路復雜性。這種方法受益於利用現有的網路基礎設施來管理容器網路。集中在L3的容器網路解決方案使用路由協議提供連接,這可以說更容易與現有的數據中心基礎設施,連接容器,VM和裸機伺服器進行相互操作。此外,L3網路擴展和提供在過濾和隔離網路流量方面的細粒度控制。
CALICO就是一個這樣的項目,使用BGP為每個網路分配路由 - 特別是對使用/ 32的工作負載,這允許它與現有的數據中心基礎設施無縫集成,並且不需要Overlays。沒有Overlays或封裝帶來的開銷,結果是可以組建具有卓越的性能和規模的網路。容器的可路由IP地址將IP地址與埠暴露於外部世界。被培訓並習慣於使用路由協議部署,診斷和操作網路的網路工程師可能發現直接路由更容易消化。然而,值得注意的是,CALICO不支持重疊的IP地址。
FAN NETWORKING
Fan網路是實現訪問更多IP地址的一種方式,從一個分配的IP地址擴展到250個IP地址。 這是一種獲得更多IP而不需要重疊網路的高效方法。 當在公有雲中運行容器時,這種類型的網路特別有用,其中單個IP地址被分配給主機並且啟動附加網路是禁止的,或者運行另一個負載均衡實例是昂貴的。
POINT-TO-POINT
點對點可能是CoreOS rkt使用的最簡單的網路類型和默認網路。 默認情況下,使用NAT或IPMASQ,它將創建一個虛擬乙太網對,將一個放在主機上,另一個放在容器pod中。 點到點網路利用iptables不僅為入站流量提供埠轉發,而且通過loopback介面為pod中的其他容器之間的內部通信提供埠轉發。
Capabilities在連接性之外,需要考慮對其他網路功能和網路服務的支持。容器網路的許多模式利用NAT和埠轉發或有意避免它們的使用。選擇網路時,IP地址管理IPAM,組播,廣播,IPv6,負載均衡,服務發現,策略,服務質量,高級過濾和性能都是需要額外考慮的。
問題是這些能力是否受到支持。即使您的runtime,編排引擎或插件支持容器網路功能,您的基礎架構也可能不支持該功能。雖然一些2級公有雲提供商提供對IPv6的支持,但是在頂級公有雲中卻缺乏對IPv6的支持,這也增加了用戶對其他網路類型(例如Overlays和FAN網路)的需求。
在IPAM方面,為了提高易用性,大多數容器runtime引擎默認使用host-local為容器分配地址,因為它們已連接到網路。host-local IPAM涉及定義要選擇的固定IP地址塊。跨容器網路項目普遍支持動態主機配置協議(DHCP)。容器網路模型(CNM)和容器網路介面(CNI)都具有用於與IPAM系統集成的IPAM內置和插件框架 - 這是在許多現有環境中採用的關鍵能力。
想了解更多關於容器網路模型(CNM)和容器網路介面(CNI)的技術細節請參考忘期文章: 容器網路聚焦:CNM和CNI
文末福利:請大家關注"Wise2C"公眾號並回復【進群】,睿雲小助手會第一時間拉你進入【 Docker企業落地實踐群】,我們分享的各個企業案例項目的技術專家與用戶代表,正在敬候您的光臨,期待大家就項目的更多細節與疑問與群里的大牛們進行咨詢探討。
需要了解更多有關睿雲智合的客戶項目細節,請在Wise2C公眾號中最佳實踐菜單中查看。
干貨放送系列之(一): 富德生命人壽容器技術應用實戰案例
干貨放送系列之(二): 中國平安容器技術應用實戰案例
干貨放送系列之(三): 民生人壽容器技術應用實戰案例
干貨放送系列之(四): 某中型人壽保險公司系統架構改造規劃咨詢實戰案例
年度盤點系列: 年度盤點 | 2016年金融行業容器技術應用 - 保險篇
年度盤點系列: 年度盤點 | 2016年金融行業容器技術應用 - 銀行篇
若需要了解更多有關Wise系列PaaS產品的詳情,請與我們的市場團隊聯系:
I. docker哪種網路模式比較好
Docker的4種網路模式
我們在使用docker run創建Docker容器時,可以用--net選項指定容器的網路模式,Docker有以下4種網路模式:
host模式,使用--net=host指定。
container模式,使用--net=container:NAME_or_ID指定。
none模式,使用--net=none指定。
bridge模式,使用--net=bridge指定,默認設置。
下面分別介紹一下Docker的各個網路模式。
1、host模式
眾所周知,Docker使用了Linux的Namespaces技術來進行資源隔離,如PID Namespace隔離進程,Mount Namespace隔離文件系統,Network Namespace隔離網路等。一個Network Namespace提供了一份獨立的網路環境,包括網卡、路由、Iptable規則等都與其他的Network Namespace隔離。一個Docker容器一般會分配一個獨立的Network Namespace。但如果啟動容器的時候使用host模式,那麼這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和埠。
例如,我們在10.10.101.105/24的機器上用host模式啟動一個含有web應用的Docker容器,監聽tcp80埠。當我們在容器中執行任何類似ifconfig命令查看網路環境時,看到的都是宿主機上的信息。而外界訪問容器中的應用,則直接使用10.10.101.105:80即可,不用任何NAT轉換,就如直接跑在宿主機中一樣。但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。
2、 container模式
在理解了host模式後,這個模式也就好理解了。這個模式指定新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、埠范圍等。同樣,兩個容器除了網路方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過lo網卡設備通信。
3、none模式
這個模式和前兩個不同。在這種模式下,Docker容器擁有自己的Network Namespace,但是,並不為Docker容器進行任何網路配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。需要我們自己為Docker容器添加網卡、配置IP等。
4、bridge模式
bridge模式是Docker默認的網路設置,此模式會為每一個容器分配Network Namespace、設置IP等,並將一個主機上的Docker容器連接到一個虛擬網橋上。
棧是一種常見的數據結構,它雖然有棧頂和棧底之分,但它只能從一端操作(插入或刪除),從而是一種「先進後出」的操作模式。向棧內進數據稱為壓棧(Push),從棧里取出數據叫出棧(POp)。例如壓棧順序為1、2、3、4、5,著出棧的順序為5、4、3、2、1(只考慮一次性出棧的情況)。
棧按照存儲的方式,又分為順序棧和鏈表棧。順序棧基於數組實現,所以順序棧存儲數據的內存是連續的,在創建棧時規定好棧的大小,這樣對內存的使用效率並不高。而鏈式棧則是採用了鏈表來實現,其元素的存儲地址是不連續的,而且是動態分配內存。順序棧在使用的過程中可能出現 棧滿、棧空的情況,由於鏈式棧基於鏈表設計,因此不會有棧滿的情況(也會棧空)。
J. Docker入門
docker概念
docker意為碼頭工人(Dock Worker),即從船上裝卸貨物的人。這與它的性質非常貼切。
docker 官網是這樣解釋自己的,
目前阿里,京東,騰訊早已將docker應用到生產環境。
docker 歷史
Docker 公司起初是一家名為 dotCloud 的平台即服務(Platform-as-a-Service, PaaS)提供商。
底層技術上,dotCloud 平台利用了 Linux 容器技術。為了方便創建和管理這些容器,dotCloud 開發了一套內部工具,之後被命名為「Docker」。Docker就是這樣誕生的!
2013年,dotCloud 的 PaaS 業務並不景氣,公司需要尋求新的突破。於是他們聘請了 Ben Golub 作為新的 CEO,將公司重命名為「Docker」,放棄dotCloud PaaS 平台,懷揣著「將 Docker 和容器技術推向全世界」的使命,開啟了一段新的征程。
如今 Docker 公司被普遍認為是一家創新型科技公司,據說其市場價值約為 10 億美元。Docker 公司已經通過多輪融資,吸納了來自矽谷的幾家風投公司的累計超過 2.4 億美元的投資。
docker 特徵
docker 核心概念
docker鏡像是一系列文件,它起源於linux聯合文件系統,通過分層實現鏡像文件的存儲。
容器本質上是一個進程,你可以把它想像成虛擬機但是它跟虛擬機完全不同。
docker倉庫在hub.docker.com
,當然國內有163,網易蜂巢鏡像。如果是private的就需要自己搭建鏡像中心了。
docker工作流程
如上圖,docker的工作流程大致是,
docker的網路
docker的關鍵在於容器內部與宿主機的通信,我們知道的有三種類型,Bridge 獨立網路,Host與宿主機使用同一網路,None無網路。
參照: Docker四種網路模式 - (jianshu.com)
Docker pull[OPTIONS] NAME{:TAG} 鏡像名稱:版本
Docker images[OPTIONS] [REPOSITORY[:TAG]]
Docker run [OPTIONS] IMAGE [:TAG] [COMMAND][ARG…]
Docker rm NAME
docler exec -it backend-tomcat bash
以定製一個 nginx 鏡像(構建好的鏡像內會有一個 /usr/share/nginx/html/index.html 文件)
注意:Dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成鏡像膨脹過大。
所以可以以 && 符號連接命令,這樣執行後,只會創建 1 層鏡像。
具體的指令參考: Docker Dockerfile | 菜鳥教程 (runoob.com)