使用Dockerfile建立一個tomcat映象,並執行一個簡單war包

我是冰霜發表於2018-03-10

docker已經看了有一段時間了,對映象和容器也有了一個大致瞭解,參考書上的例子製作一個tomcat映象,並簡單執行一個HelloWorld.war

1.首先下載linux環境的tomcat和jdk,並分別解壓至helloworld目錄

2.新建Dockerfile檔案

touch Dockerfile

Dockerfile檔案的內容如下: 

 1 FROM ccc7a11d65b1     (這串數字是我已經建立好一個ubuntu映象的映象id,在這裡作為tomcat的基礎映象
 2 MAINTAINER hmk
 3 ENV REFRESHED_AT 2018-03-10  (這個環境變數用來表名該映象模板的最後更新時間)
 4 
 5 #切換映象目錄,進入/usr目錄
 6 WORKDIR /usr
 7 #在/usr/下建立jdk目錄,用來存放jdk檔案
 8 RUN mkdir jdk
 9 #在/usr/下建立tomcat目錄,用來存放tomcat
10 RUN mkdir tomcat
11 
12 #將宿主機的jdk目錄下的檔案拷至映象的/usr/jdk目錄下
13 ADD jdk1.8.0_131 /usr/jdk/
14 #將宿主機的tomcat目錄下的檔案拷至映象的/usr/tomcat目錄下
15 ADD apache-tomcat-7.0.81 /usr/tomcat/
16 
17 #設定環境變數
18 ENV JAVA_HOME=/usr/jdk
19 ENV JRE_HOME=$JAVA_HOME/jre
20 ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
21 ENV PATH=/sbin:$JAVA_HOME/bin:$PATH
22 
23 #公開埠
24 EXPOSE 8080
25 #設定啟動命令
26 ENTRYPOINT ["/usr/tomcat/bin/catalina.sh","run"]

3.構建映象

[root@localhost helloword]# docker build -t jamtur01/tomcat .

成功的話,會有映象id顯示

4.使用docker images檢視建立好的映象

5.通過建立好的映象,啟動一個容器

[root@localhost helloword]# docker run -d -p 8080:8080 --name hmk_tomcat jamtur01/tomcat:latest

訪問一下

6.進入容器,看下之前在Dockerfile中寫好命令要建立的tomcat和jdk目錄

[root@localhost helloword]# docker exec -it 480f45dc4c00284690b378c063daf7371719c1cddf0efc2032223bfb318b2076 /bin/bash

 

<============分割線===============>

下面部署一個HelloWorld.war包

1.在helloworld目錄下新建一個webapps目錄,把war包放進去

2.使用-v引數將war包掛載至容器內的 tomcat/webapps目錄

[root@localhost helloword]# docker run -d -p 8080:8080 -v /HMK/helloword/webapps/HelloWorld.war:/usr/tomcat/webapps/HelloWorld.war --name hmk_tomcat jamtur01/tomcat
注意:-v /HMK/helloword/webapps/HelloWorld.war:/usr/tomcat/webapps/HelloWorld.war,這裡是掛載的單個檔案

 

3.說明下我嘗試的幾種掛載方法

第一次是將宿主機webapps目錄掛載至容器的webapps

[root@localhost helloword]# docker run -d -p 8080:8080 -v /HMK/helloword/webapps:/usr/tomcat/webapps --name hmk_tomcat jamtur01/tomcat

但是後來發現,啟動容器後,容器內的webapps目錄和宿主機一樣了,也就是容器中tomcat/webapps原本的內容被置換為宿主機的webapps內容了(這和我預期的不符)

通過單個檔案掛載的話,則只是把這個war包丟進容器中,並沒有影響容器中原本的內容(雖然我知道一般不建議掛載單個檔案,但是如何通過掛載目錄來讀取容器外的程式包、配置檔案等的方法還沒有找到。。。)

另外掛載單個檔案時注意宿主機的路徑是絕對路徑,容器中也是絕對路徑+檔名(也就是說雖然容器中沒有這個war檔案,但是我們要假設有,然後對映到宿主機的檔案,然後容器就能執行宿主機的war檔案了)

相關文章