一、從dotCloud到Docker--低調奢華有內涵
1、追根溯源:dotCloud
時間倒回到兩年前,有一個名不見經傳的小公司,他的名字叫做:dotCloud。dotCloud公司主要提供的是基于 PaaS(Platform as a Service,平臺及服務)平臺為開發者或開發商提供技術服務,并提供的開發工具和技術框架。
初創企業總是艱難的,dotCloud也是一樣。在IBM,亞馬遜,谷歌等大公司的擠壓下,dotCloud舉步維艱。即使2011年拿到了1000萬美元的融資,可和上述大公司比起來,也不過是杯水車薪。
隨著開源的洪流襲來,在2013年dotCloud 的創始人,28歲的Solomon Hykes做了一個艱難的決定:將dotCloud的核心引擎開源!然而一旦這個基于 LXC(Linux Container)技術的核心管理引擎開源,dotCloud公司就相當于走上了一條"不歸路"。
可正是這個孤注一擲的舉動,卻帶來了全球技術人員的熱潮,眾程序員驚呼:太方便了,太方便了。也正是這個決定,讓所有的IT巨頭也為之一顫。一個新的公司也隨之出世,它就是:Docker。
2、Docker出世:從Docker0.1到Docker1.0
一個春秋,跨越了Docker的成名路。
在互聯網時代,一夜成名早已不是什么新聞。Docker 這個技術公司,向我們證明了,成為一個"國際巨星",只需要一個月。2013年2月決定開源,到2013年3月20日發布Docker0.1,只用了一個月的時間。
今后幾乎每個一個月,Docker都會發布一個版本。而Docker0.1的發布像是一個宣言,昭示著一個Docker正在以一個新興容器領導者的姿態邁進。
正如我們所知,從Docker0.1到Docker1.0,15個月的時間,Docker迅速成長。在2014年6月9日,Docker團隊宣布發布Docker 1.0版。
2014年6月9日,1.0版本發布官方聲明
1.0版本標志著Docker公司認為Docker平臺已經足夠成熟,并可以被應用到產品中(還提供了一些需要付費的支持選項)。
在這15個月中,Docker共收到了超過460位貢獻者的8741條改進建議,Docker的用心經營下社區十分活躍。可以說,Docker的成功起于開源,發于社區。
一年的時間,使一個圍繞著Docker的小型初創企業生態體系逐漸形成。Docker先后贏得了Google、微軟、Amazon、VMware等巨頭的青睞,巨頭們紛紛示意將保證自己平臺與Docker容器技術的兼容性。微軟還宣布來要推出面向Windows的Docker客戶端。
到了2014年9月,Docker完成4000萬美元的C輪融資,彼時市值與約為4億美元。可以說Docker一路風生水起,迅速贏得了IT圈的信賴。并且在8月12Docker發布了Docker1.8正式版(下載地址見末尾)。
但Docker是如何做到這些的呢?Docker的成功之路能否被復制呢?
二、如何定義Docker?
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上。
Docker是一個重新定義了程序開發測試、交付和部署過程的開放平臺,Docker則可以稱為構建一次,到處運行,這就是Docker提出的"Build once,Run anywhere"
Docker:Build once,Run anywhere
為了更好的認識Docker,我們先來了解幾個必備詞匯:鏡像,容器和倉庫。
1、鏡像(image):Docker 鏡像就是一個只讀的模板,鏡像可以用來創建 Docker 容器。Docker 提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那里下載一個已經做好的鏡像來直接使用。
鏡像是一種文件結構。Dockerfile中的每條命令都會在文件系統中創建一個新的層次結構,文件系統在這些層次上構建起來,鏡像就構建于這些聯合的文件系統之上。
Docker官方網站專門有一個頁面來存儲所有可用的鏡像,網址是:index.docker.io。
2、容器:容器是從鏡像創建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。可以把容器看做是一個簡易版的 Linux 環境,Docker 利用容器來運行應用。
3、倉庫:倉庫是集中存放鏡像文件的場所,倉庫注冊服務器(Registry)上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag)。目前,最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。
Docker倉庫用來保存我們的images,當我們創建了自己的image之后我們就可以使用push命令將它上傳到公有或者私有倉庫,這樣下次要在另外一臺機器上使用這個image時候,只需要從倉庫上pull下來就可以了。
Docker的運行離不開這幾位的支持,Docker的成功也是拜幾位所賜。也有人會誤以為,Docker就是容器。但Docker只會傲嬌地說:我不是容器,我是管理容器的引擎。
什么是Docker?
Docker中文手冊上解釋說:Docker是一個開源的引擎,可以輕松的為任何應用創建一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs(虛擬機)、bare metal、OpenStack 集群和其他的基礎應用平臺。
從這里我們可以看出,Docker并非是容器,而是管理容器的引擎。Docker為應用打包、部署的平臺,而非單純的虛擬化技術。
三、Docker與虛擬化爭鋒
容器技術與傳統虛擬機性能對比
談到虛擬化,很多人又發問了。Docker和虛擬化有什么區別?Docker(或者說是容器)的出現是否會取代傳統的虛擬化技術。
說起虛擬化,大家首先想到的必然是VM一類的虛機。這類虛擬機完美的運行了另一套系統,能夠使應用程序,操作系統和硬件三者之間的邏輯不變。
但在惜時如金的現在,這類虛機也面臨著一定的問題,比如:啟動時間太長,你有沒有過在啟動虛擬機后,點開其他頁面繼續操作,過了一分鐘才回來的經歷?還有虛擬鏡像體積太大(一般都是幾十GB)等問題。相比之下,Docker的鏡像一般只有二三百兆。并且啟動速度超快, Docker的啟動時間為毫秒級。
還有一個最大的問題是價格問題,據StackEngine調查分析,有43.8%的企業使用Docker的原因是VMware太貴。
Docker與虛擬機建構對比
但是,傳統的虛擬技術還不會被取代。Docker或者說容器技術和虛擬機并非簡單的取舍關系。
目前,很多企業仍在使用虛擬機技術,原因很簡單,他們需要一個高效,安全且高可用的構架。然而,剛剛面世兩年的Docker還沒有經歷沙場考驗,CaaS(Container as a Service,容器即服務)概念也是近兩年才剛剛出現。無論是應用管理還是運行維護方面,Docker都還處于發展與完善階段。
四、Docker:我為什么與眾不同
Solomon Hykes:成功的要素之一是在正確的時間做了正確的事,我們一直堅信這個理念。Docker就好比傳統的貨運集裝箱,我們一直都在努力。我們努力讓這個技術更加靈活,更容易使用。
站在未來的角度,Docker解決了三大現存問題。
Docker讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上,便可以實現虛擬化。
俗話說:天下武學,唯快不破;在更新迭代如此之快的IT更是如此。所有成功的IT公司都必須走在時代的前列,他們的產品應該來自未來。他們有必要要站在未來的角度解決現存的問題。
Docker之父Solomon Hykes:Docker就好比傳統的貨運集裝箱
Solomon Hykes曾經說過,自己在開發dotCloud的PaaS云時,就發現一個讓人頭痛的問題:應用開發工程師和系統工程師兩者之間無法輕松協作發布產品。Docker解決了難題。讓開發者能專心寫好程序;讓系統工程師專注在應用的水平擴展、穩定發布的解決方案上。
1、簡化程序:Docker讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上,便可以實現虛擬化。
Docker改變了虛擬化的方式,使開發者可以直接將自己的成果放入Docker中進行管理。方便快捷已經是Docker的最大優勢,過去需要用數天乃至數周的任務,在Docker容器的處理下,只需要數秒就能完成。
2、避免選擇恐懼癥:如果你有選擇恐懼癥,還是資深患者。Docker幫你打包你的糾結!比如Docker鏡像;Docker鏡像中包含了運行環境和配置,所以Docker可以簡化部署多種應用實例工作。比如Web應用、后臺應用、數據庫應用、大數據應用比如Hadoop集群、消息隊列等等都可以打包成一個鏡像部署。
3、節省開支:一方面,云計算時代到來,使開發者不必為了追求效果而配置高額的硬件,Docker改變了高性能必然高價格的思維定勢。Docker與云的結合,讓云空間得到更充分的利用。不僅解決了硬件管理的問題,也改變了虛擬化的方式。
另一方面,Docker能夠是自愿額達到充分利用。舉個簡單地例子:凌晨三點的時候只有很少的人會去訪問你的網站,同時你需要比較多的資源執行夜間的批處理任務,通過Docker可以很簡單的便實現資源的交換。
Docker的這些優勢,讓各大IT巨頭紛紛對Docker看好。
五、統一標準,建立更有活力的生態系統
開放容器技術項目(Open Container Project)
在2015年的DockerCon上推出了開放容器技術項目(Open Container Project)。OCP是一個非營利性組織,其受特許建立通用的容器軟件技術標準。
這個項目匯集了微軟、谷歌、惠普、IBM、英特爾、紅帽(Red Hat)、VMware以及高盛等眾多實力企業,OCP的推出,也使宿敵Docker和CoreOS走向了聯合。讓微軟與自己的競爭對手Linux合作,足以見得Docker的魅力。
谷歌云計算平臺產品經理克雷格·麥克拉克伊(Craig Mcluckie)說:創建通用容器格式非常重要,單一標準可以促進更有活力的生態系統。
六、企業對Docker是否認可?安全是關鍵!
隨著容器技術逐漸得到IT界的認可,CaaS(Container as a Service,容器即服務)也逐漸形成。而Docker作為CaaS技術的標桿是否已經得到企業的認可?是否投入生產呢?
2015年,VMblog.com和CloudCow.com共同組織了一次問卷調查。報告顯示,Docker的早期用戶中,63%的用于QA/Test,53%的用于開發,并且31%的用戶計劃在生產環境中使用Docker,阻礙企業使用Docker的最大因素在于其安全性以及缺少生產環境下的運維工具(兩個原因各占49%左右)。
對Docker應用最廣泛的三個領域分別是:Test/QA應用;Web應用;大數據,企業應用。
調查顯示,目前企業對Docker的接受程度在不斷提高。但Docker的安全性似乎仍舊是企業顧慮的主要原因,那么Docker的安全性究竟如何?
Gartner:Docker還是一項年輕的技術,它的安全性仍不夠成熟
2015年1月,Gartner分析師Joerg Fritsch發布一份報告,報告顯示:雖然Docker這款容器化工具已經頗具名聲,但Docker的安全性仍不夠成熟。
Joerg Fritsch指出:"Docker與容器技術目前還無法通過虛擬機管理程序彌合自身最為嚴重的兩大短板:安全性保障與管理功能,外加在常見控制機制的機密性、完整性與可用性方面提供支持。"
總體來講,Docker的安全性能還不錯,只是這還是一項年輕的技術、因此目前尚未積累起能夠滿足實際生產需求的完整工具生態系統。
其實如果要談論Docker的安全性,我們就要談論三點:命名空間(Namespace);Docker程序本身的抗攻擊性和加固內核安全性來影響容器的安全性。
企業對Docker是否認可?安全是關鍵!
1、命名空間(Namespace):Docker有五個命名空間:進程、網絡、掛載、宿主和共享內存,為了隔離有問題的應用,Docker運用Namespace將進程隔離,為進程或進程組創建已隔離的運行空間,為進程提供不同的命名空間視圖。這樣,每一個隔離出來的進程組,對外就表現為一個container(容器)。需要注意的是,Docker讓用戶誤以為自己占據了全部資源,但這并不是"虛擬機"。
內核namesapce從內核2.6.15之后被引入,距今已經5年了,在很多大型生產系統中被驗證。他們的設計和靈感提出的時間更早,openvz項目利用namespace重新封裝他們的內核,并合并到主流內核中。openvz最早的版本是2005年的,所以他們的設計和實現都很成熟。
2、Docker程序本身的抗攻擊性:Docker允許你在主機和容器之間共享文件夾,這就容易讓容器突破資源限制,那么容器就可以對主機做任何更改了。但實際上,幾乎所有虛擬機系統都有在物理主機和虛擬機之間共享資源的限制,所以這一層的安全性,需要你自己把控。
3、加固內核安全性:默認情況下,Docker啟動的容器只使用一部分內核capabilities,就算攻擊者在容器中取得了root權限,他能做的破壞也少了,也不能獲得主機的更高權限。
由此我們可以說:Docker還是比較安全的,但是你要注意使用在容器中使用非root權限允許進程。
目前來說,Docker的主要應用場景為:
面向開發人員:快速開發、交付應用程序。開發環境的機器通常內存比較小,之前使用虛擬的時候,經常需要為開發環境的機器加內存,而現在Docker可以輕易的讓幾十個服務在Docker中跑起來。
面向運維人員:降低運維成本。正如通過虛擬機來整合多個應用,Docker隔離應用的能力使得Docker可以整合多個服務器以降低成本。Docker通過鏡像機制,將你的代碼和運行環境直接打包成鏡像,扔到容器啟動即可。
面向企業:Docker本身就發家于PaaS,在Docker面向企業,是可以提供Paas層的實現;比如,擴展現有的OpenShift或Cloud Foundry平臺來搭建自己的PaaS環境。
Docker"集裝箱"
七、評說Docker
Solomon Hykes(Docker之父):"建立一個為所有生產軟件共有的系統,使用一種被廣泛接受的方式,讓它可以很好的運行和擴展,讓它可以被所有人依賴,然后將它視為理所當然的存在,并使用它創造自己的奇跡,這是個挑戰。
Chris Swan (銀行業的技術專家,曾經有十幾年的時間在從事金融服務業):Docker公司已經建立了清晰的道路,即發展核心能力(libcontainer)、跨業務管理(libswarm)和容器間消息(libchan)。
Docker公司表達了利用自身生態系統的意愿。隨著時間的推移,虛擬機和容器(Docker中的"運行"部分)之間的區別很可能變得不再那么重要,這將使注意力轉到"構建(build)"和"交付(ship)"方面。
馬全一(Docker中文社區創始人之一):Docker一定會成為云計算和大數據領域的重要成員之一。
Docker的出現使得以Docker容器為單位的云平臺和Docker容器為載體的交易平臺成為可能。任何后端的服務程序,都可以封裝在Docker容器中進行銷售、分發和部署,后端開發者能像Mobile App開發者那樣去做自己的產品來獲利。隨著Golang的發展,一定會有以Golang為開發語言、Docker為運行載體的新大數據平臺,成為Hadoop平臺的競爭者。
Docker,一個迅速走紅,并在技術領域贏得一片好評的一款應用。盡管Docker目前還不夠完善,但已經有很多廠商已經開始使用。同時一批圍繞Docker建立起來的初創企業已經形成,學習Docker風氣正盛。可以預見在不遠的未來,Docker和CaaS會獲得更多的人肯定,越來越多的企業愿意使用Docker這個應用。
Docker內部人員:在Docker 1.0正式發布之前,就已經有3家主要銀行將其投入到生產應用中
{C}
PS:貼上一些Docker基本命令
Docker ps用來查看正在運行中的容器。
Docker ps命令的常用參數(及組合)如下。
-a: 查看所有容器,包括已經停止運行的。
-l: 查看剛剛啟動的容器。
-q: 只顯示容器ID
-l -q: 則可以返回剛啟動的容器ID。
Docker stop用來停止運行中的容器,同時你還可以用Docker start來重新啟動一個已經停止的容器。
Docker restart可以重啟一個運行中的容器。這就相當于對一個容器先進行stop再start。
Docker服務對應的版本查看
# sudo Docker version
Docker命令幫助
#sudo Docker //查看Docker的所有命令
#sudo Docker command --help //查看單個Docker命令的幫助,如Docker ru --help
常用Docker命令
Docker最新版(1.8)下載地址:
Ubuntu/Debian: curl -sSL https://get.Docker.com | sh
Linux 64bit binary:
https://get.Docker.com/builds/Linux/x86_64/Docker-1.8.0
Darwin/OSX 64bit client binary:
https://get.Docker.com/builds/Darwin/x86_64/Docker-1.8.0
Darwin/OSX 32bit client binary:
https://get.Docker.com/builds/Darwin/i386/Docker-1.8.0
Linux 64bit tgz:
https://get.Docker.com/builds/Linux/x86_64/Docker-1.8.0.tgz
Windows 64bit client binary:
https://get.Docker.com/builds/Windows/x86_64/Docker-1.8.0.exe
Windows 32bit client binary:
https://get.Docker.com/builds/Windows/i386/Docker-1.8.0.exe
相關網站鏈接:Docker官網:https://www.Docker.com/
Mac安裝方式:http://docs.Docker.com/mac/started/
Linux安裝方式:http://docs.Docker.com/linux/started/
Windows安裝方式:http://docs.Docker.com/windows/started/