用Docker從新定義Java虛擬化部署

Docker是一個用於構建、分發、運行分佈式應用的開源平臺。Docker化的應用能夠在開發者的電腦上運行,並可以被部署到生產的雲環境中,Docker正之前所未有的方式在持續集成和持續部署中發揮着巨大做用。希雲認爲:在將來的工做中,Docker這個平臺是每一個開發者都應該熟悉的。java

開源Java項目把Docker帶給Java開發者,後面會解釋爲何Docker對Java開發者那麼重要,引導你們在Docker中安裝並部署Java應用,並讓你們看到如何把Docker集成到構建流程中。web

>>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

 

>>>Docker簡介shell


在二十多年前,軟件應用曾經是很是龐大而且複雜的,會被部署在大型的計算機上。在Java的世界裏邊,咱們開發的企業軟件包(EAR)中,包含企業JavaBean(EJB)和web組件(WAR),而後會部署在大型應用服務器上。爲了能儘可能有效地利用這些大型計算機上的資源,咱們會盡最大能力去設計這些應用。
數據庫

在21世紀早期,隨着雲計算的出現,開發者們開始使用虛擬機以及服務器集羣,去擴展應用以知足需求。要以虛擬化的方式部署應用,應用必須被設計得與傳統方式有所不一樣,輕量級,面向對象的應用成爲新標準。咱們學會了把軟件作成各類能互聯的服務集合,將各組件儘量地設計成無狀態。可擴展架構的概念和實現都發生了變化,再也不是依賴於單臺大型計算機的垂直擴展,開發者和架構師開始思考以水平擴展方式實現:如何把單個應用部署到數個輕量級的計算機上。centos

Docker的出現使虛擬化更向前邁進了一步,提供了一個輕量級的層,處於應用和所依賴的硬件中間,Docker把應用看成是宿主系統的一個進程來運行。圖一對比了傳統虛擬機和Docker。tomcat


圖 1. 虛擬機與Docker的比較
服務器

傳統的虛擬機會在宿主系統運行着一個虛擬機監視器,並在虛擬機中運行着一個完整的客戶系統(GuestOS),應用依賴的全部包都在客戶系統中。架構

相反地,Docker有個Docker引擎,也是一個運行在宿主系統的守護進程。Docker引擎把Docker容器中的系統調用,翻譯成宿主系統的原生調用。一個Docker鏡像,做爲Docker容器的建立模板,只是包含了操做系統的最小層,以及僅僅是應用所須要的依賴庫。app

你們看起來感受這些差別彷佛不大,但實際上倒是天壤之別。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](
https://csphere.cn/hub/),這個鏡像倉庫。瀏覽一下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

相關文章
相關標籤/搜索