Spring Boot工程發布到Docker


先聊聊閑話

搞過企業級的application運維的同仁肯定深有感觸,每個application的功能交叉錯雜,數據交換就讓人焦頭爛額(當然這和頂層業務設計有關系),

幾十個application發布,代碼修改,打包,發布,再上dev/staging/prod三個代碼版本,時刻要保證他們三個的環境依賴一致,比如jdk,webserver,appserver,安全設置,數據庫等,

不然就導致程序跑不起來。

另一個問題,企業通常會按照功能將webserver,appserver,dbserver,fileserver,batchserver,然后將每個應用分別部署至相應的server中去,

比如大家共享一台或幾台app server,但經常會出現服務器報警,比如某個app把硬盤用光了,或者cpu使用率太高等等,造成整個server掛掉。

以下關於docker的介紹摘抄自這篇文章 -> http://www.mamicode.com/info-detail-1174856.html

所以虛擬機出現了,做了良好的資源隔離,不同用戶之間不會相互影響。但是,虛擬機有缺點:創建速度慢,遷移起來麻煩,因為中間加了一層guest os,有了性能損耗,

很牛的物理機也就創建幾十個虛擬機,太浪費了。

再聊聊Docker這個神器

Docker,比傳統虛擬機更棒的實現輕量級的操作系統解決方案,

基礎是 Linux 容器(LXC-Linux Container)等技術,在 LXC 的基礎上 Docker 進行了進一步的封裝,

讓用戶不需要去關心容器的管理,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。

Docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機方式要快得多。 其次,Docker 對系統資源的利用率很高,一台主機上可以同時運行數千個 Docker 容器。

容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷盡量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,

而Docker 只需要啟動 10 個隔離的應用即可。

具體說來,Docker 在如下幾個方面具有較大的優勢。

  • 更快速的交付和部署

  對開發和運維(devop)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。

開發者可以使用一個標准的鏡像來構建一套開發容器,開發完成之后,運維人員可以直接使用這個容器來部署代碼。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。

  • 更高效的虛擬化

  Docker 容器的運行不需要額外的 hypervisor(虛擬化管理程序)支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。

  • 更輕松的遷移和擴展

  Docker 容器幾乎可以在任意的平台上運行,包括物理機、虛擬機、公有雲、私有雲、個人電腦、服務器等。 這種兼容性可以讓用戶把一個應用程序從一個平台直接遷移到另外一個。

Docker的局限

Docker並不是全能的,設計之初也不是KVM之類虛擬化手段的替代品,簡單總結幾點:

  • Docker是基於Linux 64bit的,無法在windows/unix或32bit的linux環境下使用
  • LXC是基於linux kernel的,因此container的guest系統只能是linux base的
  • 隔離性比KVM虛擬化方案還是有些欠缺,所有container公用一部分的運行庫
  • 網絡管理相對簡單,主要是基於namespace隔離
  • cgroup的cpu功能相比KVM的等虛擬化方案相比難以度量
  • docker對disk的管理比較有限
  • container隨着用戶進程的停止而銷毀,container中的log等用戶數據不便收集

總之,選用container還是vm, 就是在隔離性和資源復用性上做權衡。

在Docker體系中,最關鍵的就是兩個——Docker Registry(通過Docker Hub進行索引)以及Docker Engine,前者在遠端(或稱雲端)負責收集與分發Docker的應用鏡像(Images),后者則在客戶端負責構建Docker應用容器,這明顯就是一個雲服務的AAS理念,當然用戶也可以在自己的數據中心內部建立私有的Docker Registry,以方便在私有雲內迅速生成自己的Docker集群,以應對靈活的、大規模的應用擴展需求。此時,也相當於在企業數據中心內部形成了一個雲+端的Docker架構。

Docker在英語里的意思為“碼頭工人”,而其Logo就好似一艘酷似鯨魚的大船運送一堆集裝箱前往各地的碼頭。而從其理論上看,Docker就像是一個集裝箱,利用LXC技術來整合不同規模、類型、層級的應用鏡像,先通過集中匯總再有序的分發——每個碼頭就是一台服務器(或VM),大船就是Registry,碼頭的工人就是核心Engine,進行集裝箱的裝配,當然它還需要一系列的外圍的支持(比如最重要的管理)。但從總體的 場景來說,Docker的名字還是非常貼切的。

Docker 關鍵字解析

Docker Image:

  Docker image是一個只讀模板,用於創建Docker容器。Image中可以包含linux操作系統、Apache或者Web應用程序等等,用戶可以下載已經創建好的Docker image,也可以創建Docker image給其他用戶使用。每個image是由很多層組成,Docker通過Union File Systems將這些層綁定在一個image中。每個image都以一個初級image做為基礎,然后通過操作指令在這些初級image上添加新層,操作指令可以是運行的命令、添加文件或目錄或者創建可用操作環境等。這些操作指令都被保存在“Dockerfile”文件中。

Docker Container:

  Docker image的運行實例。Docker Containers可以運行、啟動、停止或者被刪除,每個container都是隔離的安全應用平台。

Docker registries:

  Docker registries用於保存Docker image,也分公用和私用二種。公用的Docker registry就是Docker Hub,用戶也可以創建私有的Docker registry,為其他用戶提供Docker images下載。

Dockerfiles:

  Dockerfile是對Docker Container創建過程的描述腳本。每個Dockerfile詳細說明了開始的基礎鏡像,以及隨后一系列在容器中運行的命令和添加到容器中的文件。Dockerfile也可以說明容器對外的端口,啟動時的工作目錄和缺省執行的命令。

LXC:(Linux Container)

  Linux Container容器是一種內核虛擬化技術,可以提供輕量級的虛擬化,以便隔離進程和資源,而且不需要提供指令解釋機制以及全虛擬化的其他復雜性。相當於C++中的NameSpace。容器有效地將由單個操作系統管理的資源划分到孤立的組中,以更好地在孤立的組之間平衡有沖突的資源使用需求。

VM:(Virtual Machines)

  指通過軟件模擬的具有完整硬件系統功能的、運行在一個完全隔離環境中的完整計算機系統。

Host OS:

  指物理存在的計算機上運行的操作系統。宿主機操作系統。

Guest OS:

  指運行在VM上的操作系統。例如在一台安裝了Windows NT的計算機上安裝了Vmware,那么,HOST指的是安裝Windows NT的這台計算機,其Host′s OS為Windows NT。VM上運行的是Linux,那么Linux即為Guest OS。

Hypervisor:

  Hypervisor是一種運行在物理服務器和操作系統之間的中間軟件層,可允許多個操作系統和應用共享一套基礎物理硬件,因此也可以看作是虛擬環境中的“元”操作系統,它可以協調訪問服務器上的所有物理設備和虛擬機,也叫虛擬機監視器。當服務器啟動並執行Hypervisor時,它會給每一台虛擬機分配適量的內存、CPU、網絡和磁盤,並加載所有虛擬機的客戶操作系統。

  目前市場主要廠商及產品:VMware vSphere、微軟Hyper-V、Citrix XenServer 、IBM PowerVM、Red Hat Enterprise Virtulization、Huawei FusionSphere、開源的KVM、Xen、VirtualBSD等。

Bootfs:(Boot File System)

  主要包含 bootloader 和 kernel, bootloader主要是引導加載kernel, 當boot成功后 kernel 被加載到內存中后 bootfs就被卸載了. 

Rootfx:(Root File System)

  rootfs包含的就是典型 Linux 系統中的 /dev(外設訪問接口信息),/proc(系統設備信息),/bin(系統工具集), /etc(APP配置信息) 等標准目錄和文件。對於不同的linux發行版, bootfs基本是一致的, 但rootfs會有差別, 因此不同的發行版可以公用bootfs。

基於Docker的微服務架構

Docker的細粒度松耦合能夠讓我們用一個Docker容器裝載一個場景功能,也就是按照功能角色分類,每個Docker里面裝一個服務或應用,一個服務器上可以運行多個Docker,或者多個Docker分散到多個服務器上運行。整個項目架構可以按照業務邏輯的規划以細粒度的方式分散在各個Docker容器中,並根據HTTP REST API的方式進行整合聯動。

此框架實現重點為,在項目前期通過詳細的功能需求分析並按業務邏輯的耦合度划分成多個服務節點,依靠Docker的獨立且低耦合特性在物理層面上實現項目的細粒度分解。

其優點是:

  • 1.可以根據用戶的訪問並發量在每個層次進行水平動態擴充,實現訪問壓力負載均衡。
  • 2.對業務邏輯的多層次划分可很大程度上提高項目的復用性。
  • 3.一旦將業務抽象成產品后,即可實現“用戶按功能選購”的能力。
  • 4.由於Docker的開發環境封裝特性,可以簡化項目部署成本,減少運維人員工作負擔。
  • 5.由於服務節點采用HTTP REST API的通訊方式,節點的實現可以采用不同運行時環境不同語言不同架構,比如可采用Spring,Play等多種架構方式。

  缺點為,在項目設計前期,需要花費較多的時間進行詳細的業務邏輯划分及系統分析。

綜上,將來微服務架構在企業必定會大面積應用,下面是簡要的將spring boot 工程發布至Docker。

也有一份詳細的英文的官方文檔,https://spring.io/guides/gs/spring-boot-docker/

步驟:

1.下載Eclipse的Maven插件。

2.在Eclipse中選擇SpringBoot-Docker模板。

3.創建SpringBoot-Docker項目

基於該模板創建SpringBoot項目后,編譯后會生成Dockerfile文件及<項目名>.jar文件。

4.在Docker環境下生成Docker Image鏡像文件

  由於已經有了Dockerfile文件及本項目的.jar文件,可以將其拷貝到虛擬機Docker環境中,並運行例如:docker build -t <example-service> . 指令,將Dockerfile描述編譯成鏡像文件,並進入本地Docker registries倉庫中。

5.運行Docker Image文件,形成Container實例,與宿主機建立端口映射。

  運行例如:docker run -p 48080:8080 -d <example-service> 指令,啟動該項目的Container實例。

6.在瀏覽器上訪問宿主機的48080端口,通過REST API訪問業務接口。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM