天天看點

[翻譯] 了解Docker容器網絡了解Docker容器網絡

如果你需要建立互相協作并安全的web應用,使用docker的網絡的特性可以幫你解決。定義上,網絡為容器了完全的隔離性,是以,控制你的應用程式運作所在的網絡很重要。docker的網絡特性變提供了你對網絡的控制能力。

這篇文章将提供docker原生的網絡的行為的概覽,docker預設會建立哪些網絡,以及建立自定義的自有的網絡,以及在單節點或者叢集上建立自定義的網絡需要哪些資源。

當你安裝好docker之後, 它會自動的建立三個網絡,你可以使用<code>docker network ls</code>指令列舉這些3個網絡:

最初,這3個網絡是docker代碼實作的一部分,你可以通過指定<code>--net</code>參數來指定容器啟動(run)所在的網絡。現在這三個網絡還是同樣可用的。

在所有的docker安裝版本中都會提供預設的<code>bridge</code>網絡即<code>docker0</code>網絡。如果你不指定<code>docker run --net=&lt;network&gt;</code>的話,docker daemon 會預設将容器連接配接到這個網絡。你可以通過<code>ifconfig</code>指令看到這個bridge是存在于主控端(host)的網絡棧中的。

<code>none</code>網絡會添加容器到一個容器自己的網絡棧,然後這個容器會并沒有網絡接口。attach到這樣的容器上然後檢查他的網絡棧,會有這樣的結果:

note: 你可以通過<code>ctrl-p ctrl-q</code> detach并離開容器終端。

<code>host</code>網絡添加一個容器到主控端(host)的網絡棧中,你會發現容器中的網絡的配置是和主控端(host)是一緻的。

除了<code>bridge</code>網絡,你不需要直接的操作這些預設的網絡。你可以檢視他們的清單和詳情,但你不能移除他們。因為他們是docker所需要的。不過你可以添加自定義的網絡以及當你不需要這個網絡是删除自定義的網絡。不過在你了解自定義網絡之前,可以先稍微了解一下預設的<code>bridge</code>網絡。

在所有的docker主機上都會提供預設的<code>bridge</code>網絡。通過<code>docker network inspect</code>指令可以檢視關于這個網絡的資訊:

docker enging會自動的為這個網絡建立<code>subnet</code>和<code>gateway</code>的配置。然後<code>docker run</code>指令會将新的容器添加到這個網絡中。

啟動兩個容器之後再通過inspect這個<code>bridge</code>網絡可以看到在這個網絡中新加入的兩個容器。

上面的<code>docker network inspect</code>會展示這個網絡上所有連接配接的容器以及他們的網絡資源,在這個預設網絡中的容器可以通過他們的ip互相通信。docker在預設的bridge網絡中不支援自動服務發現(automatic service discovery)。如果你需要在這個預設bridge網絡中使用容器名進行通信,你必須通過過時(legacy)的<code>docker run --link</code>選項連接配接這些容器。

你可以<code>attach</code>到一個運作中的<code>container</code>然後檢視他的網絡配置:

然後使用<code>ping</code>三秒鐘測試與這個預設<code>bridge</code>網絡中與其他容器的聯通。

finally, use the <code>cat</code> command to check the <code>container1</code> network configuration:

最後,用<code>cat</code>指令檢查<code>container1</code>網絡的配置:

使用<code>ctrl-p ctrl-q</code> detach <code>container1</code>這個容器并保持它背景運作。然後attach到<code>container2</code>并重複上面4個指令。

預設的<code>docker0</code>bridge網絡支援用<code>docker run --link</code>允許容器間直接通信,那些在技術設定複雜并易于出現錯誤。雖然現在在技術上仍然可以使用它們,但是最好避免使用,并使用自定義網絡替代這種方案。

你可以通過建立自定義網絡以便更好的容器網絡隔離,docker為建立自定義網絡提供了一些預設的 network driver。你可以建立一個新的 bridge network 或者 overlay network。或者你可以編寫及建立一個 network plugin 或者 remote network。

你也可以建立多個網絡,可以把容器連接配接到不止一個網絡中。容器僅可以同網絡内的容器進行通信而不能跨網絡通信。連接配接到兩個網絡中的容器可以分别同兩個網絡中其他容器進行通信。

下面的幾章會非常詳細的介紹每個docker内置的網絡驅動。

最簡單的使用者自定義網絡就是建立一個<code>bridge</code>網絡。這個網絡類似于之前的,預設的<code>docker0</code>網絡。有一些新加的特性以及廢棄的老特性。

當以建立完網絡之後,你可以通過使用<code>docker run --net=&lt;network&gt;</code>選項指定容器運作在這個網絡上。

這些你在這個網絡中啟動的容器必須運作在同一個docker主機上,每個在這個網絡中的容器可以直接同其他容器進行通信。不過網絡将容器同外部的網絡隔離開。

[翻譯] 了解Docker容器網絡了解Docker容器網絡

在一個使用者自定義網絡中,是不支援link的。在這個網絡中你可以expose和publish一個容器的端口,這個方案可以讓你的自定義網絡的一部分供外部網絡通路。

[翻譯] 了解Docker容器網絡了解Docker容器網絡

如果你希望在單個機器上使用一個相對小的網絡,bridge網絡是非常有用的。然而,如果你需要一個相對大的網絡,可以通過建立<code>overlay</code>的網絡。

docker的<code>overlay</code>網絡驅動提供原生開箱即用(out-of-the-box)的跨主機網絡。完成這個支援是基于<code>libnetwork</code>和docker的<code>libkv</code>,<code>libnetwork</code>是一個内置基于vxlan overlay網絡驅動的一個庫。

<code>overlay</code>網絡需要一個可用的key-value存儲的服務。目前docker的<code>libkv</code>支援consul,etcd,和zookepper(分布式存儲),在建立網絡之前,你必須安裝以及配置你所選的key-value存儲服務。然後你需要建立網絡的docker機器以及存儲服務的機器必須能夠互相通信。

[翻譯] 了解Docker容器網絡了解Docker容器網絡

網絡中的每個主控端必須運作有docker engine執行個體,最簡單的建立運作docker engine執行個體的方法是使用docker machine。

[翻譯] 了解Docker容器網絡了解Docker容器網絡

你在主機之間需要打開下面這些端口。

protocol

port

description

udp

4789

data plane (vxlan)

tcp/udp

7946

control plane

你的key-value存儲服務可能需要額外的一些端口,可以檢查服務提供者的文檔然後打開需要的端口。

一旦你有很多的機器建立出來,你可以使用docker swarm快速的形成一個叢集。

為了建立overlay網絡,你需要為每台機器上的docker engine的<code>daemon</code>配置<code>overlay</code>網絡所需的選項。下面就是需要設定的三個選項。

option

describes the location of the kv service.

the ip address or interface of the host used for clustering.

options such as tls certificate or tuning discovery timers

在swarm叢集中的一個節點上建立<code>overlay</code>網絡

這個的結果就是建立了一個跨越多個節點的網絡。一個<code>overlay</code>網絡為容器提供了完全的網絡隔離。

[翻譯] 了解Docker容器網絡了解Docker容器網絡

然後在每台主機上,通過制定網絡名啟動容器。

連接配接上之後,每個容器便可以可以互相通路這個網絡中的其他容器,不管另外的容器是在那一台主機上。

[翻譯] 了解Docker容器網絡了解Docker容器網絡

你可以編寫自己的網絡驅動,驅動是和docker <code>daemon</code>運作在同一台主機上一個程序,并且由docker <code>plugin</code>系統調用和使用。

網絡插件和其他的docker插件一樣受到一些限制和安裝規則。所有的插件使用plugin api,有自己的生命周期,包含:安裝,啟動,停止,激活。

當你建立并安裝了自定義的網絡驅動是,你可以像内置的網絡驅動一樣使用它,例如:

<a href="work-with-networks.md">work with network commands</a>

<a href="get-started-overlay.md">get started with multi-host networking</a>

<a href="../containers/dockervolumes.md">managing data in containers</a>

<a href="https://docs.docker.com/machine">docker machine overview</a>

<a href="https://docs.docker.com/swarm">docker swarm overview</a>

<a href="https://github.com/docker/libnetwork">investigate the libnetwork project</a>

<a href="https://yq.aliyun.com/articles/2929?spm=0.0.0.0.ywd359">容器服務如何做到跨主機的網絡通信</a>