關於 docker 的網路,你需要知道的事情

關於 docker 的網路,你需要知道的事情

來自專欄程天寫代碼

我寫這篇文章的原因是網路上搜索最靠前的幾篇中文的介紹docker網路的文章都寫的和屎一樣。

一般大家使用 kubernetes 以後,網路上的解決方案就會使用kubernetes的了,從而忽略掉 docker 原生的解決方案,畢竟在開發階段我們對網路的隔離安全性並不關注太多,更多時候可以「通信」即可,默認的網路方案就足夠了。但是如果你還是希望對 docker 的網路有一個宏觀的認識,歡迎你讀下去。

目前,docker支持的網路類型(我根本不覺得網上說的 container 模式和 user-define 模式屬於網路類型)有下面幾種:

  • bridge
  • host
  • overlay
  • macvlan
  • none
  • ……

首先,bridge,橋接模式是 docker 默認的網路類型。如果你之前沒有關心過自己的 docker 服務是什麼網路類型,那麼多半就是這種類型。從計算機網路定義的角度,網橋是一種鏈路層設備,用於轉髮網段之間的流量,在內核設備的角度,主要有硬體網橋和軟體網橋。在 docker 中,網橋是一種軟體設備,用於實現連接同一網橋的容器進行通信——同樣道理,連接在不同的網橋上的容器一般是不能通信的。簡明來講,一台機器上一個 docker 進程下管理的容器,共用一個網橋,用於通信。

在最初沒有 kubernetes、swarm 這些的時候,一個 docker 服務組一般部署在同一台物理機或者虛擬機上面,為了實現不同服務之間的隔離,用戶有時候會使用自定義網橋,自定義網橋的作用和默認網橋的作用一致,但是可以提供更好的集裝箱服務級別的網路隔離特性。適合這樣的場景一般有,例如,一個服務的架構包含如下模塊:

  • php
  • nginx
  • mysql
  • redis

我們需要保證四個服務的網路通信,並避免外部鏈接的時候(一般資料庫類的服務不希望外部訪問),可以把他們放在同一個自定義網橋上,並單獨指定web埠對外暴露服務(80 etc)

每一個用戶自定義的網橋,都和默認網橋一樣,有一份單獨的網橋配置,作用於鏈接到該網橋上面的所有容器。修改網橋後如果希望對運行中容器生效則必須重啟容器。

使用用戶自定義的網橋的另一個好處是用戶自定義網橋提供了容器間DNS解析服務,綁定在默認網橋上面的容器只能通過 ip 訪問,除非顯示的使用—link( docker-compose 實際上也是通過 —link 實現的容器間 DNS 解析)。所謂的DNS解析,指的是集裝箱服務之間實現了容器名稱和 ip 的映射。

除此以外,容器運行時可以從自定義網橋上面摘除,但是如果希望從默認網橋上面摘除,必須首先停止容器的工作。默認網橋通過 --link 可以實現多個容器間的共享環境變數,但是實際上,我們要實現環境變數的共享經常通過共享存儲的形式,--link 一般只用於網路上的鏈接。

第二種網路,host。顧名思義,host 類型的網路就是主機網路的意思,綁定到這種網路上面的容器,內部使用的埠直接綁定在主機上對應的埠,而如果容器服務沒有使用埠,則無影響。

第三種網路,overlay。實際上這是一種接近於 kubernetes 網路服務的一種網路模型,事實上它也是在 kubernetes 之後出現的。之前介紹的網路,多數的應用場景都是單點 docker 服務,而如果搭建 docker 集群,實現集群內的覆蓋網路,依靠網橋或者主機網路是不可行的,這個時候就需要作用於 docker 集群內的網路,名曰 overlay。通過 overlay ,docker 可以實現把特定的網路數據包轉發到特定的 docker 進程下的特定容器的網路中。

docker 原生支持覆蓋網路的原因是提升 docker 公司的集群管理產品 swarm 的競爭力,不過現在 docker 公司也倒向了 kubernetes ,swarm 事實上失敗了。但是覆蓋網路的概念在生產中卻是應用廣泛的。kubernetes 的覆蓋網路可以基於 flannel 實現。

第四種網路 macvlan 的特殊之處在於其為容器分配「看起來可靠」的 mac 地址。這主要是考慮到某些業務需要綁定 mac 地址的場景。例如一些監控網路流量的服務,希望直接連接到物理網路(在我看來為什麼不直接把服務泡在物理機上面呢?),在這種情況下,可以使用 macvlan 為每個容器的虛擬網路介面分配 mac 地址。

在這種場景下,需要在 docker 的主機上分配一個物理介面,同時需要為 macvlan 網路分配特定的子網和網關,當然可以安裝不同的物理網卡來隔離 macvlan 網路。

無論如何使用 macvlan 的時候,你都需要清楚的知道下面的問題:

  • 在IP耗盡的情況下,網路設備要可以處理這種混雜模式。
  • 我覺得 macvlan 就是一坨屎。

至於最後一種網路 none 網路,它根本不是網路,因為它不允許任何容器外的網路,也無須更多提及了。

除此之外,用戶當然可以使用自定義的網路擴展,當然,最根本最關鍵的還是橋接網路。

我發現我和網上那些屎寫的差不多。

祝大家周末愉快,歐冠決賽我支持利物浦!!


推薦閱讀:

記一次RabbitMQ集群故障處理
OpenStack juno版 安裝配置——第十章(Swift)
OpenStack大規模部署優化之三:Quota鎖優化
2017 OpenStack Summit day | Baremetal篇
關於openstack的部署架構的一點兒疑問?

TAG:Kubernetes | OpenStack | Docker |