趙星月
摘 要:Docker是PaaS提供商DotCloud[1]開源的一種虛擬化容器技術。對于正處于互聯(lián)網(wǎng)云計算時代的我們,容器級別的應用服務已經(jīng)逐步的走進了生活的每個角落,2015年春節(jié)晚會新浪微博的抽獎活動,就讓13億的國人享受了一次容器技術給我們帶來的服務體驗。自Docker發(fā)布以來容器間的通信模式一直都是一個技術研究的課題,那是因為人們針對容器使用的出發(fā)角度各不相同,本文主要針對Host網(wǎng)絡通信模式進行了深入的研究,發(fā)現(xiàn)這種通信模式存在容器間端口沖突的問題,于是針對這個問題提出了通過Macvlan[2]構建虛擬容器網(wǎng)絡的技術解決方案,并通過實驗證明了該方案的可行性。通過Macvlan構建的虛擬容器網(wǎng)絡可以讓容器像主機一樣擁有自己的IP地址和網(wǎng)卡端口等,這樣依附于宿主機的容器就不必與宿主機共享端口,從而避免了端口沖突的問題。
關鍵詞:Docker;通信模式;Macvlan
0引言
Docker支持的容器間網(wǎng)絡通信模式有四種,分別是host模式、container模式、none模式和bridge模式[3]。而被大家廣泛應用的host模式卻存在一個基礎性的端口沖突的問題,在同一宿主機上共存的兩個容器如果采用host模式是不可以同時映射宿主機同一個端口號的,否則會導致后創(chuàng)建的容器啟動失敗。而通過Macvlan為容器創(chuàng)建虛擬Mac地址,從而創(chuàng)建專屬的虛擬網(wǎng)卡,這樣我們就可以為容器創(chuàng)建虛擬的網(wǎng)絡IP,容器不需要再與宿主機映射端口號[6]來實現(xiàn)網(wǎng)絡通信。這樣既避免了Host模式下的端口沖突問題,又極大的增加了宿主機網(wǎng)絡資源的利用率。本文通過實驗對這個解決方案做出了詳細的論證與分析。
1Host網(wǎng)絡通信模式的原理
我們在宿主機上創(chuàng)建docker容器,根據(jù)docker引擎的命令語法規(guī)則需要通過參數(shù)p來配置需要映射的端口號,例如docker run-name helloworld-p 80:80 helloworld:1.0 tail-f look.log,然后docker引擎會查詢宿主機80端口是否被占用,如果被占用則創(chuàng)建容器失敗,如果未被占用,則將宿主機的80端口分配給helloworld這個容器,并且該容器不會創(chuàng)建自己專屬的Network Namespace,而是與宿主機公用同一個Network Namespace[8],容器也不會虛擬出屬于自己的虛擬網(wǎng)卡和IP地址,容器就像宿主機中啟動的一個軟件一樣共享者宿主機的網(wǎng)絡資源,而容器的文件系統(tǒng)和進程資源還是與宿主機是相互隔離的。
1.1Host網(wǎng)絡通信模式的過程
當外界需要與容器進行通信的時候,需要根據(jù)宿主機的IP及80端口來實現(xiàn)數(shù)據(jù)的傳輸,我們可以在helloworld容器中啟動一個Apache服務[7],內(nèi)嵌一個php站點程序,外界會將訪問請求先打到宿主機,宿主機接收到request請求后會將請求中轉給helloworld容器,通過映射端口容器將request請求分發(fā)給內(nèi)嵌的Apache服務器中的php服務,當服務返回response響應[4]的時候會利用宿主機的網(wǎng)絡資源在回傳響應數(shù)據(jù),整個通信過程結束。
1.2Host網(wǎng)絡通信模式暴露的問題
通過上述docker容器的Host網(wǎng)絡通信模式的原理及通信過程可知,如果一個宿主機中已經(jīng)創(chuàng)建了一個分配80端口的helloworld容器或者其他進程已經(jīng)占用了80端口,那么再想在該宿主機上創(chuàng)建一個分配80端口的docker容器就會產(chǎn)生端口沖突而創(chuàng)建失敗,這個端口沖突問題會給一系列的自動化容器創(chuàng)建機制帶來很大的阻礙和運維難題[5]。
1.3解決方案
在一臺宿主機上啟動多個Docker 容器,通過Macvlan 在每個Docker 容器的Network Namespace中創(chuàng)建虛擬以太網(wǎng)卡,因為每個容器都有健全獨立的網(wǎng)絡協(xié)議棧,所以可一個容器內(nèi)創(chuàng)建的虛擬以太網(wǎng)卡分配[9]和宿主機同一網(wǎng)段的可用IP地址。這樣一來所有Docker容器及宿主機它們之間就都成為了同一局域網(wǎng)段下面的可訪問的不同網(wǎng)絡節(jié)點[10]。因此相同宿主機中的兩個容器就可以不必共享宿主機的Network Namespace,也就是無需再做端口映射,當然也就解決了端口沖突的問題。而不同宿主機間的容器也可以像同一局域網(wǎng)內(nèi)不同主機一樣的互通互信了。
2實驗驗證
2.1實驗環(huán)境
如圖1所示配備兩臺物理主機:
主機A:IP地址為192.168.0.155、8G內(nèi)存、8核CPU、500G硬盤、Centos6.5系統(tǒng)、Docker1.6。
主機B:IP地址為192.168.0.188、8G內(nèi)存、8核CPU、500G硬盤、Centos6.5系統(tǒng)、Docker1.6。
2.2實驗過程
在主機A中安裝docker1.6,然后通過dockerfile[10]制作測試鏡像Image test:1.0(測試鏡像是包含Nginx、php-fom、mysql等服務的可以收發(fā)https測試請求的Server),然后根據(jù)Image test:1.0在主機A中創(chuàng)建并運行啟動Container 1、Container 2。同理在主機B中創(chuàng)建Container 3。
Macvlan命令格式:ip link add link eth0 name macv1 type macvlan mode bridge[3]
通過以上命令行在主機A中創(chuàng)建Container 1和Container 2的虛擬網(wǎng)卡,并分配IP分別為192.168.0.156和192.168.0.157。
通過以上命令行在主機B中創(chuàng)建Container 3的虛擬網(wǎng)卡,并分配IP地址為192.168.0.189。
我們在容器中嵌入了php服務程序,程序中包含一個隊列模塊,隊列是需要發(fā)送https請求的容器服務IP地址集合(我們預先設定好的),服務程序會根據(jù)隊列信息逐一實現(xiàn)測試請求[4],并將測試結果放入mysql數(shù)據(jù)庫macvlan database的request_status數(shù)據(jù)表中,實現(xiàn)測試結果的統(tǒng)計。
2.3實驗結果
2.4實驗分析
通過實驗結果表1證明通過Macvlan給Container 1、2、3分配的虛擬IP地址是可以完成獨立的通信服務的,并且Container 1與Container 2之間不存在端口沖突問題了,也就是說Container 1、2、3可以隨意通過彼此的IP地址進行網(wǎng)絡通信而不必再依賴宿主機的網(wǎng)絡空間。由此證明通過將Macvlan創(chuàng)建的虛擬網(wǎng)絡資源嫁接到容器服務上是可以實現(xiàn)容器化的虛擬網(wǎng)絡的。
3結語
網(wǎng)卡就是linux的門戶,協(xié)議棧下面便是網(wǎng)卡,通過軟件來實現(xiàn)對接,網(wǎng)卡下面連接的就是硬件介質(zhì),而網(wǎng)絡虛擬化支持任何形式的虛擬化技術,比如虛擬機或者通過linux的Network Namespace技術獨立的虛擬化空間[8],而通過Macvlan機制我們可以將部署的容器網(wǎng)絡虛擬化出相應的節(jié)點[9],讓每個容器都擁有獨立的虛擬IP地址,這樣容器之間的通信就不必再依賴于宿主機的網(wǎng)絡空間資源,自然就不會再因為公用宿主機端口而產(chǎn)生容器間的映射端口沖突問題了。這不僅方便了容器之間的通信[7],也為基于容器服務的分布式云計算技術解決了最為困難的節(jié)點通信及地址分配的問題,極大的提升了任務調(diào)度的便捷性[5]和靈活性。
參考文獻
[1] 戴王劍,楊保華,曹亞侖.Docker技術入門與實戰(zhàn)[M].西安:機械工業(yè)出版社,2015:89.
[2] 華為Docker實踐小組.Docker進階與實戰(zhàn)[M].深圳:機械工業(yè)出版社,2016:133.
[3] 龔正,吳治輝,葉伙榮,張龍春.Kubernetes權威指南[M].佛山:電子工業(yè)出版社,2016:327.
[4] 孫宏亮. Docker源碼分析[M].西安:機械工業(yè)出版社,2015:215.
[5] Joe Johnston,Antoni Batchelli,Justin Cormack,John Fiedler.Docker生產(chǎn)環(huán)境實踐指南[M].吳佳興,梁曉勇.佛山:人民郵電出版社,2016:76.
[6] Sam Newman.微服務設計[M].崔力強,張駿.佛山:人民郵電出版社,2016:301.
[7] 林帆.CoreOS實踐之路[M].佛山:電子工業(yè)出版社,2015:157.
[8] 張建,謝天鈞.基于docker的平臺即服務架構研究[D].北京:北京工業(yè)大學軟件學院,2014:3.
[9] 楊浚.運用Docker技術搭建linux桌面實驗環(huán)境[D].常州:常州市廣播電視大學,2015:61.
[10] 谷雨.數(shù)據(jù)存儲CockroachDB應用技術Docker的研究[D].哈爾濱:黑龍江省社會信用辦公室,2015:31.