當前位置:編程學習大全網 - 源碼下載 - 四、Docker網絡揭秘

四、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通信,其實還是通過網卡,只不過需要其他的技術來實現了。

本章節就不在演示,到後面的章節再來分析!

  • 上一篇:人物新年插畫-新年海報都有哪些風格?
  • 下一篇:如何查看Memcached運行狀態
  • copyright 2024編程學習大全網