今年京東的618活動,京東啟動了將近15萬個Docker容器,這些Docker容器用于商品頁,定單,搜索,緩存,數據庫等服務。
為啥docker能在京東南大學放異彩?
Docker自誕生以來就遭到極大的關注,縱觀國內的1線IT企業在雙101,春節,大促銷等活動紛紜上馬Docker的項目,Docker到底有甚么優點吸引這些企業。
在互聯網企業,開發者完成某個功能需求后上線發布的流程以下。
由開發者在個人電腦上部署新的功能后獨自測試,測試終了后在測試服務器中部署新功能,再由公司內部的測試人員在測試服務器上測試,在測試服務器測試終了后再在生產服務器部署新功能,正式發布該功能。
這個流程如圖1所示。
圖1 完成功能需求的上線發布的流程
在圖1所示的流程中會產生下面1系列的問題。
Docker是1個用于統1開發和部署的輕量級容器,讓開發者打包其利用及相干的依賴包到1個可移植的容器,發布該容器到其他機器,就可以很容易地實現利用的部署。
傳統的虛擬化技術體系在服務器操作系統上安裝了多個虛擬機,每一個虛擬機上通過虛擬化技術實現了1個虛擬操作系統,在這個虛擬操作系統上運行利用。傳統的虛擬化技術體系架構如圖3⑵0所示。
Docker的虛擬化技術體系在服務器的操作系統上有1個Docker服務在運行,在這個Docker服務上運行著多個Docker容器,每一個Docker容器中運行著利用,容器與容器間的利用是相互隔離、相互獨立的,但通過Docker服務占用著服務器的硬件和網絡資源。
圖2 傳統的虛擬化技術體系架構
Docker的虛擬化技術體系架構如圖3所示。
圖3 Docker的虛擬化技術體系架構
Docker利用虛擬化技術實現了1套從硬件到軟件的虛擬化環境,這個技術給運維和部署帶來的巨大的變革,利用虛擬化技術,真正遮蔽了外部因素的影響,保證了在任何1臺電腦中Docker容器里面的內容是1樣的。
網絡上介紹Docker的特點經常用的是集裝箱的比喻,但大多數同學對集裝箱帶來的革命性影響認識不深,因此我希望借助下面的例子來介紹docker帶來的巨大變革:
現在筆者在廣州工作,主要的活動地點是出租房和公司,每逢周末倍思親就回佛山老家。
筆者不在公司的時候,偶爾工作上有事情要處理,但這時候就有1個問題:習慣用的軟件都只安裝在公司的臺式機上,如果在出租房和佛山老家的電腦上處理工作上的事情,很多時候都要把經常使用的軟件再安裝1次,非常折騰~-~。
使用筆記本后就不1樣,如果筆者隨身帶著筆記本,需要處理工作上的事情時,不管在公司,出租房和佛山老家,只需要把筆記本插上電源,連接wifi,就可以隨時投入到工作中,不需要再重新安裝經常使用的軟件。
把公司,出租房,佛山老家看做是3個不同的工作環境(相當于服務器),沒有docker的時期,要在這3個不同的工作環境中工作,需要分別安裝所需的軟件,如果遇上由于環境之間有差異而釀成的運維問題(例如通過自動下載工具下載的軟件版本不1致),還要花大量的時間去排查。
使用了docker后就簡單多了,在公司,出租房,佛山老家這3個不同的工作環境(相當于服務器)中,拿出筆記本(也就是docker容器),插上電源和連接wifi,就可以立刻投入到工作,不需要花時間去安裝各種軟件。
Docker中有3個關鍵概念。
- 鏡像(Image):Docker鏡像(Image)類似于虛擬機鏡像,可以把其理解為Docker的只讀模板,其包括了文件系統。
- 容器(Container):Docker容器(Container)類似于1個沙箱,Docker使用容器隔離資源,并在其內部運行利用,可看成是1個簡易版的Linux環境。鏡像是只讀,容器從鏡像啟動后,Docker會在鏡像最上層創建1個可寫層,這樣鏡像本身就可以保持不變。
- 倉庫(Repository):Docker倉庫(Repository)類似于代碼倉庫,是Docker集中寄存鏡像文件的場所。
Docker倉庫里面包括了大量操作系統的基礎鏡像(例如CentOS、Ubuntu等),開發者從倉庫中拉取這些操作系統的基礎鏡像后就可以在其基礎之上構建本身環境的鏡像。
Docker提供了Dockerfile這類腳本給開發者創建自定義的鏡像。開發者通過Dockerfile,很容易在操作系統的基礎鏡像(例如CentOS、Ubuntu等)上安裝指定的軟件及其依賴,從而構建1個適用于本身業務環境的鏡像。
簡單來講,讀者可以把操作系統的基礎鏡像理解為1個干凈版操作系統,通過Dockerfile(相當于Linux上的安裝腳本)往這個干凈版操作系統上安裝需要的軟件后,再生成1個新的鏡像。
下面是1個Dockerfile的例子,運行這個Dockerfile就可以構建Java開發環境的Docker鏡像(Dockerfile來源:https://github.com/dockerfile/java/blob/master/oracle-java7/dockerfile)。
# 下載基礎鏡像
FROM dockerfile/ubuntu
# 安裝Java.
Run echo oracle-Java7-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
add-apt-Repository -y ppa:Webupd8team/Java && \
apt-get update && \
apt-get install -y oracle-Java7-installer && \
rm -rf /var/lib/apt/lists/* && \
rm -rf /var/cache/oracle-jdk7-installer
# 定義工作目錄
WORKDIR /data
# 定義JAVA_HOME環境變量
ENV JAVA_HOME /usr/lib/jvm/java-7-oracle
# 定義默許的命令
CMD ["bash"]
使用Docker構建1致的開發環境是依賴于Dockerfile:把編寫完成的Dockerfile放置在版本管理服務器中,在不同的服務器上獲得這個Dockerfile并運行就可以構建相同的鏡像,從而得到1致的開發環境。這個流程如圖4所示。
圖4 用Docker構建開發環境流程
使用docker后,可以取得資源隔離,彈性擴大,簡化配置等好處,但docker真的合適每一個項目嗎?
雖然docker簡化了運維,但是docker本身也帶來了新的運維問題:例如怎樣部署1個docker集群,docker集群的監控,docker故障的排查等等,除這些問題外,在把docker引入項目中仔細斟酌下面的因素:
本人把網絡上發表的1系列“app后端”文章加以整理并增加了運維和架構方面的內容,出版了書籍《App 后臺開發運維和架構實踐》,該書已在京東,鐺鐺和亞馬遜上銷售。
京東
鐺鐺
亞馬遜
互動出版網
天貓
打開鏈接 app后端設計–總目錄 ,能查看本人發表過的所有原創“app后端”文章。
【作者】曾健生
【QQ】190678908
【微信公眾號】 appbackend
【新浪微博】 @newjueqi
【博客】http://blog.csdn.net/newjueqi