5月1日,Docker發布了自家的容器網絡管理項目libnetwork,libnetwork使用Go語言編寫,目標是定義一個容器網絡模型(CNM),并為應用程序提供一致的編程接口以及網絡抽象。目前libnetwork仍在全力開發中,并沒有達到使用標準。
一個月前,我們宣布SocketPlane團隊加入Docker,并且我們承諾將要構建一個健康的網絡生態系統。本周,在我們的合作伙伴的幫助下,我們邁出了一大步:開源的libnetwork項目。
什么是libnetwork?
Libnetwork最初是由libcontainer和Docker Engine中的網絡相關的代碼合并而成的,我們期待Libnetwork能發展為一個跨平臺的容器網絡包,就像現在的libcontainer那樣。
Libnetwork還引入了容器網絡模型(CNM),CNM是受該GitHub issue啟發,并得到了我們的網絡方面的合作伙伴Cisco、IBM、Joyent、Microsoft、Rancher、VMware和Weave的支持。
在生態圈各個合作伙伴的幫助下,我們很快就創建了這個有價值的網絡庫,希望它可以為所有的容器運行時提供網絡支持。
容器網絡模型(CNM)
CNM定義了三個新的術語:
Network Sandbox
Docker容器中一個網絡配置的隔離環境。
Endpoint
一個在某個網絡上進行網絡通訊的接口,Endpoint可以加入一個network,同時,多個Endpoint也可以在一個網絡沙盒中共存。
Network
一個network就是一個唯一的、可識別的endpoint組,組內endpoint可以相互通訊。你可以創建一個『Frontend』和『Backend』network,然后這兩個network是完全隔離的。
CNM為Network和容器提供了如下合約:
在相同network上的所有容器都可以隨意通訊。
容器之間不同的通信可以使用多個network,它應該被所有的驅動支持。
把一個容器加入到多個network,可以使用容器中的endpoint。
為了提供網絡的連通性,endpoint需要加入到Network Sandbox中。
Docker網絡基礎
為了實現一個可插拔的網絡接口,我們首先需要定位網絡在Docker平臺中的『位置』。這對于我們來說還比較棘手,因為網絡功能在Docker Engine和libcontainer中都有。現在,通過ibnetwork和CNM,我們可以創建一些必要的網絡API。
引入network后,最令人興奮的事情就是我們已經使用相同的CNM API重新實現了Docker的bridge網絡(docker0),這秉承了我們的『可插拔』理念,這給予了用戶完全自由的選擇權利。
接下來?
Libnetwork正在全力開發中,我們將會把它加入到Docker的發布節奏中:從Docker 1.7開始,每隔一個月發布一些新的功能。一開始的重點工作包括:
將libnetwork集成到Docker Engine
在Docker CLI中使用新的network命令
撰寫『-net』參數的文檔,以告知用戶如何使用它來為容器指定網絡
在network和endpoint中支持添加『label』
研發新的『bridge』插件,以替換Docker目前的實現
研發『分布式bridge』插件,以支持跨容器網絡
長遠來看,我們的目標還包括:
支持多平臺