前面已經學習了 Docker 的幾種網絡方案:none、host、bridge 和 joined 容器,它們解決了單個 Docker Host 內容器通訊的問題。本章的重點則是討論跨主機容器間通訊的方案。docker
跨主機網絡方案包括:網絡
docker 原生的 overlay 和 macvlan。學習
第三方方案:經常使用的包括 flannel、weave 和 calico。spa
docker 網絡是一個很是活躍的技術領域,不斷有新的方案開發出來,那麼要問個很是重要的問題了:路由
如此衆多的方案是如何與 docker 集成在一塊兒的?開發
答案是:libnetwork 以及 CNM。容器
libnetwork 是 docker 容器網絡庫,最核心的內容是其定義的 Container Network Model (CNM),這個模型對容器網絡進行了抽象,由如下三類組件組成:network
Sandbox二維碼
Sandbox 是容器的網絡棧,包含容器的 interface、路由表和 DNS 設置。 Linux Network Namespace 是 Sandbox 的標準實現。Sandbox 能夠包含來自不一樣 Network 的 Endpoint。im
Endpoint
Endpoint 的做用是將 Sandbox 接入 Network。Endpoint 的典型實現是 veth pair,後面咱們會舉例。一個 Endpoint 只能屬於一個網絡,也只能屬於一個 Sandbox。
Network
Network 包含一組 Endpoint,同一 Network 的 Endpoint 能夠直接通訊。Network 的實現能夠是 Linux Bridge、VLAN 等。
下面是 CNM 的示例:
如圖所示兩個容器,一個容器一個 Sandbox,每一個 Sandbox 都有一個 Endpoint 鏈接到 Network 1,第二個 Sandbox 還有一個 Endpoint 將其接入 Network 2.
libnetwork CNM 定義了 docker 容器的網絡模型,按照該模型開發出的 driver 就能與 docker daemon 協同工做,實現容器網絡。docker 原生的 driver 包括 none、bridge、overlay 和 macvlan,第三方 driver 包括 flannel、weave、calico 等。
下面咱們以 docker bridge driver 爲例討論 libnetwork CNM 是如何被實現的。
這是前面咱們討論過的一個容器環境:
兩個 Network:默認網絡 「bridge」 和自定義網絡 「my_net2」。實現方式是 Linux Bridge:「docker0」 和 「br-5d863e9f78b6」。
三個 Enpoint,由 veth pair 實現,一端(vethxxx)掛在 Linux Bridge 上,另外一端(eth0)掛在容器內。
三個 Sandbox,由 Network Namespace 實現,每一個容器有本身的 Sanbox。
接下來咱們將詳細討論各類跨主機網絡方案,首先學習 Overlay。