用Docker重新定義Java虛擬化部署
Docker 是一個用于構建、分發、運行分布式應用的開源平臺。Docker化的應用可以在開發者的電腦上運行,并能夠被部署到生產的云環境中,Docker正以前所 未有的方式在持續集成和持續部署中發揮著巨大作用。希云認為:在未來的工作中,Docker這個平臺是每個開發者都應該熟悉的。
開源Java項目把Docker帶給Java開發者,后面會解釋為什么Docker對Java開發者那么重要,引導大家在Docker中安裝并部署Java應用,并讓大家看到如何把Docker集成到構建流程中。
Docker技術快速指南
Docker有它自己的術語,這些術語會在本文中反復用到,請先花一些時間去熟悉它們:
* Docker引擎(Docker engine) :在服務器上的一個守護進程,它是你和Docker應用與所依賴的操作系統的橋梁。
* Dockerfile : 一個文本文件,內容是用于構建Docker鏡像的指令。
* Docker 鏡像 : 構建一個Dockerfile的產物,構建過程中執行Dockerfile中的命令,會生成一個鏡像。它首先會基于一個根系統(基礎鏡像)構建,然后安裝 應用,接著執行一系列命令來準備啟動應用的環境。Docker鏡像作為Docker容器的基礎,相當于容器的一個靜態模塊。
* Docker 容器 : 一個Docker鏡像的運行時實例,Docker鏡像類似于模塊的概念(從Dockerfile構建,這個Dockerfile包含了根系統,應用以及一系列構建鏡像的命令),容器是那個鏡像的一個實際能運行的實例。
* Docker 宿主 : 一個物理機或者虛擬機,在此系統上運行著Docker引擎,維持著容器所依賴的Dockerhub。
* DockerHub : 官方的Docker鏡像倉庫,把DockerHub想象為GitHub倉庫,對于Git來說是中央倉庫,DockerHub是官方保存及提供Docker鏡像的中央倉庫。
* cSphereHub : 希云官方的Docker微鏡像倉庫,DockerHub中有非常多的鏡像,但cSphereHub中存放了精心挑選出來的,并精心制作的鏡像。
Docker簡介
在二十多年前,軟件應用曾經是非常龐大并且復雜的,會被部署在大型的計算機上。在Java的世界里邊,我們開發的企業軟件包(EAR)中,包含企 業JavaBean(EJB)和web組件(WAR),然后會部署在大型應用服務器上。為了能盡量有效地利用這些大型計算機上的資源,我們會盡最大能力去 設計這些應用。
在21世紀早期,隨著云計算的出現,開發者們開始使用虛擬機以及服務器集群,去擴展應用以滿足需求。要以虛擬化的方式部署應用,應用必須被設計得 與傳統方式有所不同,輕量級,面向對象的應用成為新標準。我們學會了把軟件做成各種能互聯的服務集合,將各組件盡可能地設計成無狀態。可擴展架構的概念和 實現都發生了變化,不再是依賴于單臺大型計算機的垂直擴展,開發者和架構師開始思考以水平擴展方式實現:如何把單個應用部署到數個輕量級的計算機上。
Docker的出現使虛擬化更向前邁進了一步,提供了一個輕量級的層,處于應用和所依賴的硬件中間,Docker把應用當作是宿主系統的一個進程來運行。圖一對比了傳統虛擬機和Docker。
圖 1. 虛擬機與Docker的比較
傳統的虛擬機會在宿主系統運行著一個虛擬機監視器,并在虛擬機中運行著一個完整的客戶系統(GuestOS),應用依賴的所有包都在客戶系統中。
相反地,Docker有個Docker引擎,也是一個運行在宿主系統的守護進程。Docker引擎把Docker容器中的系統調用,翻譯成宿主系 統的原生調用。一個Docker鏡像,作為Docker容器的創建模板,只是包含了操作系統的最小層,以及僅僅是應用所需要的依賴庫。
大家看起來感覺這些差異似乎不大,但實際上卻是天壤之別。Docker的優勢很大一部分都是在這點體現出來的!
理解進程虛擬化
我們仔細分析一下虛擬機中的操作系統,我們會留意到虛擬機中的資源,例如CPU和內存。但當我們運行一個Docker容器,我們會直接看到宿主機 上的資源。我把Docker看成是進程級的虛擬化平臺,而不是系統級的虛擬化平臺。基本上,應用是作為一個獨立的自包含進程運行在宿主機上,Docker 通過借助著Linux上幾個強大的組件,實現了隔離性,確保了每個進程都是操作系統上的獨立進程。
因為Docker化的應用與宿主機上的進程運行方式類似,所以設計上也和虛擬機中的應用不同。舉個例子說,我們通常會在一個虛擬機上運行 Tomcat和MySQL數據庫,但Docker的實踐中,我們會把app服務器與數據庫分別部署,各自運行在不同的容器中。這樣讓Docker更好地管 理宿主系統上的獨立單元,這意味著要更有效率地使用Docker,我們需要以適當的粒度設計應用,例如微服務的方式。
Docker中的微服務
簡單來說,微服務是一種可以促進系統模塊化的架構方式。在微服務架構中,復雜的應用以更小的獨立進程組成,各個進程有一個或多個特定的功能,應用與語言無關的API和其他進程通信。
微服務是通過粒度非常小,高度解耦的服務集合,來提供單一或多個相關聯的功能。例如,如果你正在管理著一個用戶中心和購物車,那你很可能是選擇把它們設計 成獨立的服務,如用戶中心服務和購物車服務;而不是把兩個模塊打成一個包作為一個服務運行。更具體來說,使用微服務意味著構建web services,而且是最常見的 RESTful web service ,并把它們按功能分組。在Java中,我們會把這些服務打成WAR包,并部署到一個容器中,例如Tomcat,然后運行Tomcat和Docker容器中的服務。
安裝Docker
在我們深入研究Docker之前,先讓我們把本地環境搭建起來。如果你正在使用Linux系統,那非常好,你可以直接安裝并運行Docker。對 于那些使用Windows或者Mac的用戶來說,Docker可以通過一個叫Docker Toolbox的工具來使用,這個工具會安裝一個虛擬機(使用Oracle的Virtual Box),這個虛擬機中會運行著包含Docker守護進程的Linux系統。我們可以使用Docker客戶端把指令發送給守護進程處理,注意,你不需要管 理這個虛擬機,只要安裝這個工具并執行Docker命令行工具即可。
開始從 Mac , Windows ,或 Linux 相應的文檔里 下載Docker 。
我的電腦是Mac,所以我下載并運行了Mac版的Docker Toolbox安裝包,之后我運行了Docker Quickstart終端,這樣會啟動一個Virtual Box鏡像和一個命令行終端。這個安裝過程與Windows下的基本相同,更多請參考Windows版的文檔。
DockerHub: Docker的鏡像倉庫
我們開始使用Docker之前,先花幾分鐘去訪問一下 cSphereHub ,這個鏡像倉庫。瀏覽一下cSphereHub,你會發現上邊有數個鏡像,精挑細選的微鏡像。如果使用cSphere管理平臺,添加 微鏡像倉庫 后,倉庫里面包含了docker官方的一些鏡像。鏡像倉庫中有基礎系統,如Alpine, Ubuntu,或者Java相關的如Tomcat, jdk, jre等等。你還可以發現幾乎所有流行的應用上邊都會有,包括MySQL, MongoDB, Neo4j, Redis, Memcached, Postgres, Nginx, Node.js, WordPress, PHP, Perl, Ruby等等。在你打算自行構建一個新鏡像之前,請確認cSphereHub,或者DockerHub上有沒有。
作為一個練習,我們運行一個簡單的CentOS鏡像,在Docker Toolbox的命令行中輸入:
sh
$ docker run -it centos
這個docker命令是你與Docker守護進程的主要接口。run指令告訴Docker去下載并運行指定的鏡像(假設在本地還沒有這個鏡像)。 又或者,你可以用pull命令直接下載一個鏡像但不運行它。有兩個參數:<code>i</code> 會讓Docker用交互模式運行,<code>t</code> 會讓它創建一個TTY終端。注意非官方的鏡像使用既定的格式"用戶名/鏡像名",而官方的鏡像會省略用戶名,所以我們只需要指 定"<code>centos</code>"來運行鏡像即可。另外,也可以在鏡像名后加“:版本號”指定版本號,例 如,<code>centos:7</code>。每個鏡像默認使用的都是最新版本,當前CentOS最新版本號是7.
在運行<code>$ docker run -it centos </code>之后,你會見到Docker開始下載這個鏡像,完成后會見到類似以下的輸出:
sh
$ docker run -it centos
[root@dcd69de89aad /]#
因為我們用了交互模式去運行,它顯示了一個root用戶的shell命令提示符。查看一下這個系統,然后使用<code>exit</code>退出。
可以用<code>docker images</code>命令來查看系統中已下載好的鏡像:
sh
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
java 8 5282faca75e8 4 weeks ago 817.6 MB
tomcat latest 71093fb71661 8 weeks ago 347.7 MB
centos latest 7322fbe74aa5 11 weeks ago 172.2 MB
你可以看到我已經有了最新版的CentOS、Tomcat和Java 8。
未完待續...
感謝您閱讀此文!下周我們將分享《用Docker重新定義Java虛擬化》的實戰篇和回顧篇,請保持關注!
如了解更多docker相關知識,請觀看培訓視頻: https://csphere.cn/training!
如需要docker相關產品,請訪問希云官網首頁: https://csphere.cn!