1. 程式人生 > >Docker容器部署Java web應用(定製映象)

Docker容器部署Java web應用(定製映象)

概念簡述

  • 映象 一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數。
    Docker映象是一個只讀的模板。比如一個映象可以包含Ubuntu系統以及安裝在Ubuntu上的Apache Web伺服器和你自己的應用。映象是用來建立容器的。Docker提供了一個簡單的方式用以建立新的映象或者更新現存的映象,甚至你可以下載其他地方提供的映象。映象是Docker服務的元件之一。
    由於Docker使用一個統一檔案系統,Docker映象其實就是一堆檔案的集合,並不是像VM那樣的是一個作業系統。映象可以簡單到只有一個程式檔案,比如如果你寫了一個簡單的hello world程式放到一個空的映象中,那麼整個映象的大小,就是你編譯後的二進位制檔案的大小。
    總結來說就是:
    映象(image)是 Docker 的三大元件之一;
    映象是用來啟動容器的基石;
    映象是隻讀的,也即是無狀態的,一個映象是永久不會變的;
    一個沒有任何父映象的映象,稱之為基礎映象;
    在Docker容器中所有的變更都發生頂層的映象可寫層;
    Docker 執行容器前需要本地存在對應的映象,如果映象不存在本地,Docker 會從映象倉庫下載( 預設是 Docker Hub 公共註冊伺服器中的倉庫)。

  • 容器 映象(Image)和容器(Container)的關係,就像是面向物件程式設計中的類和例項一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。

  • 倉庫 映象構建完成後,可以很容易的在當前宿主上執行,但是,如果需要在其它伺服器上使用這個映象,我們就需要一個集中的儲存、分發映象的服務 1)docker hub 2)私有倉庫
  • Dockerfile 映象的定製實際上就是定製每一層所新增的配置、檔案。如果我們可以把每一層修改、安裝、構建、操作的命令都寫入一個指令碼,用這個指令碼來構建、定製映象,那麼之前提及的無法重複的問題、映象構建透明性的問題、體積的問題就都會解決。其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
  • 資料卷 一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:
  • 資料卷可以在容器之間共享和重用
  • 對資料卷的修改會立馬生效
  • 對資料卷的更新,不會影響映象
  • 資料卷預設會一直存在,即使容器被刪除

建立docker映象的兩種方法

  • 第一種:啟動映象後進入容器中操作,將需要的軟體或者專案移動到容器中,安裝或者部署,然後退出即可
  • 第二種:編寫dockerfile,將需要的映象一層層疊加上去,比如我們要部署專案,可以先下載一個ubuntu基礎映象,然後疊加jdk,然後tomcat,然後專案

區別在於,第二種比較體現docker的映象疊加特性,第一種到最終只有一層映象.本文講述第二種

環境準備

利用DockerFile制定映象
通過編寫Dockerfile的方式製作映象。
需要在Dockerfile中完成如下幾項工作:
(1)安裝jre
(2)安裝tomcat,並完成在tomcat中部署web應用的基本配置(為實現此功能:在製作映象之前直接先完成tomcat的基礎配置,然後直接拷貝到映象中即可)。
(3)對外開發8080埠(具體的埠值可以根據實際Tomcat配置引數為準)。

$mkdir docker
$cd docker

建立docker資料夾,並把之前下好的jre資料夾和tomcat資料夾(或者壓縮包,均可)拖入其中,docker資料夾下目錄如下:
這裡寫圖片描述

編寫Dockerfile檔案

補充:關於Dockerfile檔案
在容器中配置執行環境(此處是jre和tomcat)的任務主要是在容器中安裝軟體,並進行相應的配置,如果把這個過程所要執行的命令全都提取出來,寫入一個檔案中,若需要構建映象則直接執行該檔案,基於其中的命令生成一個映象。這就是基於Dockerfile構建映象的方式,這個檔案就稱為Dockerfile
Dockerfile檔案一共分為四個部分,分別是:註釋資訊、基礎映象、建立者資訊、構建映象所需的命令:
詳細介紹可參考:http://www.tuicool.com/articles/vqAVRrEhttp://blog.csdn.net/wsscy2004/article/details/25878223
Dockerfile檔案內容如下:
(以系統Ubuntu映象為基礎映象)

#Build java web app container image
FROM ubuntu:16.04
MAINTAINER zhaokx3 "[email protected]"

#Make java and tomcat install directory
RUN mkdir /usr/local/java
RUN mkdir /usr/local/tomcat

#Copy jre and tomcat into image
ADD jre1.8.0_131 /usr/local/java/
ADD apache-tomcat-9.0.0.M21 /usr/local/tomcat/

ENV PATH $PATH:/usr/local/java/bin

#Expose http port
EXPOSE 8080

CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]

建立映象

sudo docker build -t="ubuntu/mine:tomcat" .

這裡寫圖片描述

啟動容器

sudo docker run -p 8090:8080 --name tomcat -v /home/zhaokx3/docker/webapps/:/webapps/ ubuntu/mine:tomcat

這裡寫圖片描述

簡要說明:引數-v指定掛載的卷,如沒有可不使用,引數-p將8080埠對映成主機的8090埠,這樣就可以訪問主機的8090埠就到容器的8080埠。
docker run 命令詳解可參考:http://www.lupaworld.com/article-250439-1.html

最後成功通過http://localhost:8090/your_test 訪問自己的web應用(埠8090):
這裡寫圖片描述
可對比直接利用Tomcat部署web應用(埠8080):
這裡寫圖片描述