环境
springboot:2.7.1 jdk:12
前言
最近想着用docker来部署应用,这就意味着,打jar包 时,需要指定打包的位置。并且在每次构建时,能够清除掉旧包,存入新包。
步骤
假设你已经有了一个准备部署的项目;就等打包了。
maven配置
在父模块的pom.xml 中: 指定start-class (要是项里有多个main方法的话,不指定就会报错)
<properties>
<java.version>12</java.version>
<start-class>com.sgy.oceanstars.OceanstarsApplication</start-class>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<outputDirectory>E:\java项目\dockerfile\</outputDirectory>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<excludeDefaultDirectories>false</excludeDefaultDirectories>
<filesets>
<fileset>
<directory>E:\java项目\dockerfile\</directory>
<followSymlinks>false</followSymlinks>
<useDefaultExcludes>true</useDefaultExcludes>
<includes>
<include>*.jar</include>
</includes>
</fileset>
</filesets>
</configuration>
</plugin>
</plugins>
</build>
上面主要就是配置两个:
- 打包时,指定存放目录;
- clean时,指定清除的目录和文件;
效果:
是否需要将多个模块打包成一个jar包?
这个问题,下午研究了好久,对比下公司的做法,发现,我们并不需要将jar包,合并成一个包。我们只需要将这些相关的包,放在一个目录下即可:保证依赖关系能够被依赖到即可。
dockerfile打包
编写Dockerfile
文件夹路径:E:\java项目\dockerfile 创建Dockerfile 文件
FROM openjdk:12
MAINTAINER yutao
ADD oceanstars-start-1.0.0-SNAPSHOT.jar app.jar
EXPOSE 8080
VOLUME /data
entrypoint java -jar app.jar
FROM openjdk:12,表示本镜像的基础镜像是openjdk,版本是12,毕竟要用java命令运行jar包的。docker会从dockerhub拉取对应的镜像,服务器不需要有。
MAINTAINER yutao,表示镜像的编写者。
ADD oceanstars-start-1.0.0-SNAPSHOT.jar app.jar,表示将oceanstars-start-1.0.0-SNAPSHOT.jar,也就是项目jar包,拷贝进镜像,并命名为app.jar。如果不拷贝,镜像就没jar包可运行了。
EXPOSE 8080,表示镜像将对外暴露8080端口,也就是编写项目时的运行端口。
VOLUME /data,表示将镜像的/data文件夹声明为匿名卷。这样做是因为,项目会读写文件系统的/data文件夹,如果不声明,那么项目运行后只会对镜像内的虚拟目录/data读写,而不会对主机的目录读写,等关闭容器后,写的内容就没了。所以,声明匿名卷是为了将写操作持久化。仅仅在dockerfile里声明还不够,在运行容器时还需要设置匿名卷对应的主机目录,这点我们下面会谈到。
ENTRYPOINT java -jar app.jar,表示容器运行后执行的命令。这里就只需要运行jar包就行了。
构建镜像
编写了Dockerfile,就可以构建镜像了。
docker build -t test_app:1.0.0 .
-
test_app 是镜像的名字,-t代表给镜像打的标签,后面的:0.1意思就是这个镜像版本是0.1。如果不打标签,镜像的标签会自动设为latest。 -
最后的一个’.‘代表Dockerfile所在位置,因为就在当前目录下,所以直接是一个’.'就行了。 -
docker会自动拉取openjdk。一会出现“Successfully built 7717b14bfe0a”,说明构建成功。
运行容器
接下来运行容器。
docker run -d --name test_app -v E:\java项目\dockerfile\volumeData:/data --net=host -p 8080:8080 test_app:1.0.0
-
-d指在后台运行。 -
–name为容器起名。 -
-v指定容器匿名卷挂载的目录。这里E:\java项目\dockerfile\volumeData:/data 代表将主机的E:\java项目\dockerfile\volumeData 对应到容器的/data ,也就是说,容器对/data 目录的读写也就是对主机的E:\java项目\dockerfile\volumeData 读写。 -
–net=host指定容器的网络模式。host是最简单的模式,容器和主机共用一个网络,会互相占用端口。由于项目简单,我就没有再研究其他模式了,想研究的话可以看看官网教程。 -
-p 8080:8080指定端口映射。这里简单的将主机的8080端口映射到容器的8080端口。如果想要多个web程序运行在同一主机,不需要改代码里的运行端口,直接将主机的不同端口映射到容器的8080即可。 -
最后是容器使用的镜像,也就是刚刚构建好的test_app:1.0.0。
就这样,容器成功运行了。只要docker start/stop就能控制程序运行,部署新版本时,也只要将jar包再上传到目录下,重新构建即可。
参考地址:
Java——maven打完jar包之后将jar包放到指定位置总结
通过maven-clean-plugin插件清除指定的目录
docker打包jar包,构建镜像部署运行
|