Docker容器網絡


Docker容器的網絡驅動有很多種方式,當安裝docker engine后,docker會在每一個engine上面生成一個3種網絡,通過命令可以看到是bridge,host和none,而docker官方推薦用戶使用自己的自定義網絡,所以在使用容器的時候最好使用自定義的網絡,默認docker使用自帶的bridge網絡,bridge網絡下的docker容器相互之間可以通信但無法解析彼此的容器名稱。如果需通過容器名稱通信,則官方允許使用舊版本的--link參數。

一.常見的主機內部容器網絡模式

  • 默認網絡模式---bridge
  • 無網絡模式---none
  • 宿主網絡模式---host
  • 容器共享模式---container
  • 自定義

1.bridge網絡模式;bridge模式是docker默認的網絡設置,此模式會為每一個容器分配Network Namespace、設置IP等,並將並將一個主機上的docker容器連接到一個虛擬網橋上。docker在啟動時會創建一個虛擬網橋docker0,默認地址為 172.17.0.1/16, 容器啟動后都會被橋接到docker0上,並自動分配到一個IP地址。
思考:
同一個bridge的網絡中,容器是以相同的vethXXX可以達到網絡互通的結果,如果是外界想同docker通信呢?其實道理也是一樣的,容器發出去的數據包經過docker0網橋流向eth0,eth0在將數據包轉發給與之相通的外部主機,於是容器就能和其他主機進行通訊了。當然如果這個地址不是其他主機節點而是公網地址,只要eth0能到達,容器都能與之通訊。

2.none網絡模式;docker容器擁有自己的Network Namespace,但並不為docker容器進行任何網絡配置。也就是說,這個docker容器沒有網卡、IP、路由等信息。需要使用者為docker容器添加網卡、配置IP等。

3.host網絡模式;如果啟動容器的時候使用host模式,那么這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口。

4.container網絡模;這個模式指定新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的已有容器共享IP、端口范圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過lo網卡設備通信。

5.自定義模式

docker network create -d bridge leo_zhou 
#新建一個bridge模式的leo_zhou網絡
docker run -d --name bb-1 --network leo_zhou busybox
#新建bb-1的容器並加入leo_zhou網絡
docker run -d --name bb-2 --network leo_zhou busybox
#新建bb-2的容器並加入leo_zhou網絡
docker network create -d bridge leo_zhou_2 --subnet=172.30.0.0/16
#新建一個bridge模式的leo_zhou_2網絡並且規則IP范圍
docker run -itd --name bb-3 --network=leo_zhou_2  --ip 172.30.0.7 busybox
#新建bb-3的容器並加入leo_zhou_2網絡並且規定了具體的IP地址

 測試結果
①leo_zhou和leo_zhou_2之間的容器不能相互通信。
②leo_zhou相同網絡下可以相互通信,但如果想通過容器名稱通信就需要--link參數。
③如果相同主機不同網絡之間想進行通信可以使用connect命令把容器加入到網絡中取。

docker network connect network-name container-name

二.跨主機之間的容器通信
Docker默認的網絡環境下,單台主機上的docker容器最終都可以通過docker0網橋直接通信,而不同主機上的docker容器之間只能又該怎么進行通信呢?現實中最簡單暴力的方式是使用端口映射,把docker的服務端口映射到宿主機node上進行端口訪問,這種端口映射方式對很多集群應用來說極不方便,如果能讓docker容器之間直接使用自己的IP地址進行通信,會解決很多問題。按實現原理可分別直接路由方式、橋接方式(如pipework)、Overlay隧道方式(如flannel、ovs+gre)等,雖然這些方案在實現細節上存在很多差異,但其思路無非分為兩種: 二層VLAN網絡和Overlay網絡簡單來說,二層VLAN網絡解決跨主機通信的思路是把原先的網絡架構改造為互通的大二層網絡,通過特定網絡設備直接路由,實現容器點到點的之間通信。這種方案在傳輸效率上比Overlay網絡占優,然而它也存在一些固有的問題。這種方法需要二層網絡設備支持,通用性和靈活性不如后者。由於通常交換機可用的VLAN數量都在4000個左右,這會對容器集群規模造成限制,遠遠不能滿足公有雲或大型私有雲的部署需求; 大型數據中心部署VLAN,會導致任何一個VLAN的廣播數據會在整個數據中心內泛濫,大量消耗網絡帶寬,帶來維護的困難。相比之下,Overlay網絡是指在不改變現有網絡基礎設施的前提下,通過某種約定通信協議,把二層報文封裝在IP報文之上的新的數據格式。這樣不但能夠充分利用成熟的IP路由協議進程數據分發;而且在Overlay技術中采用擴展的隔離標識位數,能夠突破VLAN的4000數量限制支持高達16M的用戶,並在必要時可將廣播流量轉化為組播流量,避免廣播數據泛濫。因此,Overlay網絡實際上是目前最主流的容器跨節點數據傳輸和路由方案。其中Flannel是一種基於overlay網絡的跨主機容器網絡解決方案,即將TCP數據包封裝在另一種網絡包里面進行路由轉發和通信,Flannel是CoreOS開發,專門用於docker多機互聯的一個工具,讓集群中的不同節點主機創建的容器都具有全集群唯一的虛擬ip地址。
flannel+etcd方案是典型應用(以后有實際的操作后,再補充)

總結
bridge網絡模式實現方式是docker0網橋+veth實現通信,而host、container模式都是"共享"方式實現,host網絡模式是容器共享宿主機Network Namespace,continer網絡模式是容器共享已存在的容器的Network Namespace,none模式則是網絡封閉狀態。每一個網絡模式都是有用處的,bridge模式適合進行項目之間的網絡隔離;host可以作為公用的共享;而container可以作為兩個關系緊密的項目的載體,例如web和db,共用一個網絡。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM