回顾上一章的整个部署过程:
- 使用"mvn install"进行打包jar
- 将jar移动到与Dockerfile文件相同的文件夹下
- 编写Dockerfile文件
- 使用"docker build -t="zjg/myservice1docker:v1.1" /Users/enniu1/Desktop/docker-data/file"命令进行打包
- 需要手动指定生成的images的name和tag,以及dockerfile所在的文件夹
本章使用docker-maven-plugin实现。
一、Dockerfile位置:与上一章完全相同
- 放在了一个单独的文件夹下src/main/docker/(这里是放在了项目的根路径下,与pom.xml同级)
#FROM java:8
#ADD config-server-Brixton.SR4.jar app.jar
#VOLUME /tmp
#VOLUME /target
#RUN bash -c 'touch /app.jar'
#EXPOSE 8888
#ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
#基础镜像:仓库是java,标签用8u66-jdk
FROM java:8u66-jdk
#当前镜像的维护者和联系方式
MAINTAINER duqi duqi@example.com
#将打包好的springboot程序拷贝到容器中的指定位置(如下两条命令都可执行)
#ADD netbar_service-1.0.0-SNAPSHOT.jar /opt/netbar_service.jar
COPY netbar_service-1.0.0-SNAPSHOT.jar netbar_service.jar
#容器对外暴露8889端口
EXPOSE 8889
#容器启动后需要执行的命令(如下两条命令都可执行)
#CMD java -Djava.security.egd=file:/dev/./urandom -jar /opt/netbar_service.jar
ENTRYPOINT ["java","-jar","netbar_service.jar"]
二、pom.xml
引入docker-maven-plugin插件
<!-- docker 打包 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<!-- 指定了镜像的名字 -->
<imageName>${project.name}:${project.version}</imageName>
<imageTags>
<imageTag>1.0.0</imageTag>
</imageTags>
<!-- 指定Dockerfile的位置为项目的根目录下 -->
<dockerDirectory>${project.basedir}</dockerDirectory>
<skipDockerBuild>false</skipDockerBuild>
<!-- 指那些需要和Dockerfile放在一起,在构建镜像时使用的文件,一般应用 jar 包需要纳入。本例,只需一个 jar 文件 -->
<resources>
<resource>
<!-- 项目构建输出目录,默认为target -->
<directory>${project.build.directory}</directory>
<!-- 打包出来的jar名称 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
<!--直接在package的时候执行docker build -->
<!--<executions> -->
<!--<execution> -->
<!--<phase>package</phase> -->
<!--<goals> -->
<!--<goal>build</goal> -->
<!--</goals> -->
<!--</execution> -->
<!--</executions> -->
</plugin>
还必须引入如下插件(不然,打包是没问题,但运行起来报nio的错误):
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 用于将应用打成可直接运行的jar(该jar就是用于生产环境中的jar) 值得注意的是,如果没有引用spring-boot-starter-parent做parent,
且采用了上述的第二种方式,这里也要做出相应的改动 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--fork : 如果没有该项配置,肯呢个devtools不会起作用,即应用不会restart -->
<fork>true</fork>
</configuration>
</plugin>
执行下边的命令后,
- 将dockerDirectory目录下的内容(这里只有Dockerfile)拷贝到项目的/target/docker/文件夹下(这里就是/target/docker/Dockerfile)
- 将resource中的include下的文件(这里就是${project.build.finalName}.jar)拷贝到/target/docker/文件夹下(这里就是/target/docker/myservice1-docker-1.0-SNAPSHOT.jar)
- 经过上述两个拷贝,将jar与Dockerfile拷贝到同一个文件夹下了
三、运行命令
clean package -Dmaven.test.skip=true docker:build
工程右键 Run As Maven build…
关键日志:
1 [INFO] --- maven-jar-plugin:2.5:jar (default-jar) @ myservice1-docker ---
2 [INFO] Building jar: /Users/enniu1/Desktop/project/myservice1-docker/target/myservice1-docker-1.0-SNAPSHOT.jar
3 [INFO]
4 [INFO] --- spring-boot-maven-plugin:1.3.0.RELEASE:repackage (default) @ myservice1-docker ---
5 [INFO]
6 [INFO] --- docker-maven-plugin:0.4.13:build (default-cli) @ myservice1-docker ---
7 [INFO] Copying /Users/enniu1/Desktop/project/myservice1-docker/target/myservice1-docker-1.0-SNAPSHOT.jar -> /Users/enniu1/Desktop/project/myservice1-docker/target/docker/myservice1-docker-1.0-SNAPSHOT.jar
8 [INFO] Copying /Users/enniu1/Desktop/project/myservice1-docker/src/main/docker/Dockerfile -> /Users/enniu1/Desktop/project/myservice1-docker/target/docker/Dockerfile
9 [INFO] Building image myservice1-docker:1.0-SNAPSHOT
10 Step 1 : FROM zhaojigang/jdk8:c7_j8
11 ---> e7b4cf41e531
12 Step 2 : ADD myservice1-docker-1.0-SNAPSHOT.jar /opt/jar/
13 ---> 771c895968f6
14 Removing intermediate container 12392489f5a4
15 Step 3 : ENV JAVA_HOME /opt/jdk
16 ---> Running in a81ffe207dfa
17 ---> 7aded06bc5be
18 Removing intermediate container a81ffe207dfa
19 Step 4 : ENV PATH $PATH:$JAVA_HOME/bin
20 ---> Running in b2598b5eee7c
21 ---> 5c282af98ab3
22 Removing intermediate container b2598b5eee7c
23 Step 5 : CMD java -jar /opt/jar/myservice1-docker-1.0-SNAPSHOT.jar
24 ---> Running in 51881dd70cd2
25 ---> 5e86ecc155d8
26 Removing intermediate container 51881dd70cd2
27 Successfully built 5e86ecc155d8
说明:
- maven-jar-plugin进行package
- spring-boot-maven-plugin进行repackage
- 将jar和Dockerfile拷贝到同一个目录(target/docker/)
- 执行Dockerfile进行build
四、查看镜像
- docker images
1 REPOSITORY TAG IMAGE ID CREATED SIZE
2 myservice1-docker 1.0-SNAPSHOT 5e86ecc155d8 21 seconds ago 575.8 MB
五、启动镜像
- docker run -d -p 8014:8080 5e86ecc155d8
浏览器访问:localhost:8014/health
注意:
- 多次指定build去构建的话,之前构建出来的REPOSITORY和TAG都会变为<none>
1 REPOSITORY TAG IMAGE ID CREATED SIZE
2 myservice1-docker 1.0-SNAPSHOT 5e86ecc155d8 21 seconds ago 575.8 MB
3<none><none> f0f5b0df8ecf 4 minutes ago 575.8 MB
- 使用docker-maven-plugin构建项目,可以避免手工移动jar,并且可以很方便的自己做成archetyp