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檔案了)