前言:要在docker運行java(jar包)程序,就要把程序打包成docker鏡像(以下簡稱鏡像),可以先理解為鏡像就是jar包
打包需要程序代碼,java本身的打包環境(包括jdk和maven),以及docker,因此本文在裝了以上環境的環境(尤其是裝了docker)進行打包
首先要修改代碼
使用ewater框架開發的程序,代碼文件需要修改,才能進行打包成docker鏡像
在此路徑添加名為Dockerfile的文件
內容為:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD ewater-0.0.1.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
PS:第3行的“ewater-0.0.1.jar”要按maven打包輸出的文件實際修改
修改pom文件
<docker.image.prefix>springio</docker.image.prefix>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.14</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<!--指定docker鏡像的版本號-->
<imageTags>
<!--使用maven項目的版本號-->
<imageTag>${project.version}</imageTag>
<imageTag>latest</imageTag>
</imageTags>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
修改代碼完畢,接原文
然后把代碼拷到打包的電腦,cd進代碼目錄(pom文件所在目錄)
-P dev-docker
運行mvn package -P dev-docker docker:build,把程序打包為鏡像。第一次打包會久一些
PS:參數-P是指定打包使用的profile名稱,不一定需要
PS:成功的樣子
運行docker image ls,列出所有本地鏡像,可以看到剛才打包的
PS:為什么一個鏡像有兩行?先不展開,注意他們tag不一樣
鏡像打包到此完成
下面還擴展一下:在docker以鏡像方式運行java程序
Dokcer可以單獨使用,k8s不是必須的,在有k8s之前docker就是單獨使用
本文假設java程序的鏡像已經打包好且在本地,運行的是以下鏡像
運行docker run -p 20801:20801 -t springio/ewater,啟動名為springio/ewater的鏡像
端口:兩個20801代表http端口,因為本java程序是springboot,springmvc開發,有http請求功能,所以需要端口
PS:啟動時有命令行輸出,內容跟直接運行jar包差不多
到此啟動成功,可以在瀏覽器訪問里面的http請求來測試
PS:ip是master1的ip,端口是docker run指定的端口
擴展:如何停止運行中的鏡像?
首先科普個新名稱——容器(container),鏡像運行時叫容器,一個鏡像可以開啟運行多個容器(就像一個jar包可以同時在多個tomcat運行)
因此問題應該是如何停止運行中的容器
運行docker ps,可見所有運行中的容器
CONTAINER ID是容易的唯一id
然后有以下的命令:
停止運行容器(fca333c9ce5f代表容器id)
docker stop fca333c9ce5f
刪除容器
docker rm fca333c9ce5