您好,登錄后才能下訂單哦!
這篇文章主要介紹了docker宿主環境中的容器網絡是什么意思,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在介紹docker宿主環境中的容器網絡的時候我們先大致了解如下一些概念和知識:
Linux Network Namespace
Linux Bridge Device
Linux Veth Device
Linux Network Namespace:
一提到linux網絡,本質上就是由一系列組件組成,從而共同協作完成網絡功能,一般這些組件包括:
linux網絡設備:例如network interface device,loop back device,bridge device,veth device,tun/tap device,vxlan device,ip tunnel device等等。這些設備可以完成網絡數據包的收發,以及提供額外的修改數據包等功能。
linux路由表,arp表,fdb(forwarding database)等:路由表提供三層ip包的路由尋址功能,arp表提供ip對應的二層mac地址,fdb在在基于mac轉發的功能里提供mac地址對應的網絡接口。
linux協議棧:完成對網絡協議包的封裝與解析,例如二層ethernet包,三層ip包,四層tcp/udp包,還有類似icmp包等等。
linux iptable:iptable基于linux內核模塊netfilter,完成對于linux的firewall管理,例如控制ingress與engress,nat地址轉換,端口映射等等。
linux network namespace就像是一個可以相互隔離的組一樣,把網絡設備,路由表,協議棧,iptable等組件包裝起來,然后通過namespace來相互隔離,互不干擾。所以更具體的說,網絡設備,路由表,協議棧,iptable等是工作在某一個linux network namespace下的。而我們平時看到的linux主機的網卡,路由表,arp表,協議棧,iptable都是工作在主機的默認網絡命名空間下,下圖用來表述linux network namespace:
當然linux不僅僅只有network namespace用來進行網絡隔離,還有pid namespace用來隔離進程,user namespace用來隔離用戶,mount namespace用來隔離掛載點,ipc namespace用來隔離信號量和共享內存等,uts namespace用來隔離主機名和域名。再結合上linux cgroup控制組,用來限制資源,例如cpu,memory,io等。這些基礎知識構成了容器的底層實現,有興趣的同學可以研究一下linux namespace,cgroup,ufs等基礎知識,你會發現docker等容器技術都是基于這些實現的。
Linux Bridge網橋:
Bridge是一種linux網絡設備,可以附加attach多個linux從設備。大家可以把linux bridge想象成二層交換機,可以進行二層數據包的廣播,但是注意的是linux bridge設備可以有自己的ip地址。也就是說,多個linux網絡設備attach到一個bridge上,那么這些網絡設備的ip地址將會失效(只有二層功能),當一個設備收到數據包的時候,bridge會把數據包轉發到其它所有attach到bridge上的從設備,從而實現廣播的效果。下圖用來表述linux bridge:
Linux Veth設備:
Veth設備總是成對出現,它的特點是會有一對peer,兩個端點,數據包從一個peer流入,總是可以從另一個peer流出。而且veth pair是可以跨linux network namespace的,這個特性很重要。玄外之音,因為network namespace本質就是相互隔離的,可以用veth來做到數據包的跨network namespace的訪問。當然是一個peer在一個namespace里,另一個peer在另一個namespace里了。下圖用來表述linux veth pair設備:
docker宿主環境中的容器網絡:
有了以上知識基礎,當講到這里的時候,其實就已經比較清晰了。對于docker宿主環境中容器的網絡一般是:
每一個container都有一個network namespace,然后擁有container自己的網絡設備,路由表,arp表,協議棧,iptable等,各個container的network namespace相互隔離。
在宿主的default netwok nemespace中會有一個linux bridge設備,一般名稱為docker0。
每一個container對應一個veth pair設備,這個設備的一端在container的network namespace里,另一端attach到宿主networkwork namespace的docker0 linux bridge上。
這樣在宿主環境里,就好像有一個二層交換機(docker0 bridge),把宿主內的所有container連接起來。所以,在宿主內的container都是可以直接相互訪問的,而且是直連的方式。
下圖用來表述宿主環境中的容器網絡:
感謝你能夠認真閱讀完這篇文章,希望小編分享的“docker宿主環境中的容器網絡是什么意思”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。