使用docker容器定製映象(image)並部署簡單 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,可以提供很多有用的特性:
* 資料卷可以在容器之間共享和重用
* 對資料卷的修改會立馬生效
* 對資料卷的更新,不會影響映象
* 資料卷預設會一直存在,即使容器被刪除
環境準備
利用DockerFile制定映象
通過編寫Dockerfile的方式製作映象。
需要在Dockerfile中完成如下幾項工作:
(1)安裝jre
(2)安裝tomcat,並完成在tomcat中部署web應用的基本配置(為實現此功能:在製作映象之前直接先完成tomcat的基礎配置,然後直接拷貝到映象中即可)。
(3)對外開發8080埠(具體的埠值可以根據實際Tomcat配置引數為準)。
$mkdir docker
$cd docker
建立docker資料夾,並把之前下好的jre資料夾和tomcat資料夾(或者壓縮包,均可)拖入其中,docker資料夾下目錄如下:
說明:webapps資料夾中可以放入war吧,後面通過資料卷的方式掛載到映象裡,簡單點可以直接將專案資料夾放入apache-tomcat-9.0.0.M21的webapps中,讓tomcat自行部署,其餘方法可參考上面Tomcat部署部分的方法。
編寫Dockerfile檔案
補充:關於Dockerfile檔案
在容器中配置執行環境(此處是jre和tomcat)的任務主要是在容器中安裝軟體,並進行相應的配置,如果把這個過程所要執行的命令全都提取出來,寫入一個檔案中,若需要構建映象則直接執行該檔案,基於其中的命令生成一個映象。這就是基於Dockerfile構建映象的方式,這個檔案就稱為Dockerfile
Dockerfile檔案一共分為四個部分,分別是:註釋資訊、基礎映象、建立者資訊、構建映象所需的命令:
詳細介紹可參考:http://www.tuicool.com/articles/vqAVRrE或http://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
可對比直接利用Tomcat部署web應用(埠8080):