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