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文件了)