Java项⽬轻松搞定Docker部署
⽂章⽬录
该篇⽂章主要解决项⽬到Docker的繁琐部署过程,尽可能解放双⼿。
上篇⽂章 中讲解了,Springboot项⽬到jar包最终在Docker中运⾏起来的详细部署过程,有兴趣可以看看。
如果让Springboot项⽬在打包的时候直接构建成镜像并上传到docker上,那就轻松多了.
⼿动构建镜像过程:
project -> jar -> Dockerfile -> jar+Dockerfile同⼀⽬录 -> docker build构建镜像 -> docker镜像
这种⽅式略有点⿇烦,那么可以使⽤Maven插件⼀步到位.
Maven有个插件叫dockerfile-maven-plugin()
它可以连接远程Docker,只要⼀个命令就能把本地的jar包打成Docker镜像,命令执⾏完毕后,服务器上就会有刚打包好的镜像,此时再执⾏该镜像即可.
project -> maven -> docker镜像
Maven插件构建镜像可以使⽤以下两种⽅式:
第⼀种是在POM 中指定构建信息,
第⼆种是使⽤ Dockerfile 中的信息构建。
第⼀种⽅式,⽀持将 FROM, ENTRYPOINT, CMD, MAINTAINER 以及 ADD 信息配置在 POM 中,不需要使⽤ Dockerfile 配置。如果使⽤ VOLUME 或其他 Dockerfile 中的命令的时候,需要使⽤第⼆种⽅式,创建⼀个 Dockerfile,并在 POM 中配置 dockerDirectory 来指定路径即可,默认情况下Dockerfile放在更路径下,不需要显⽰指定。
1.下⾯以Dockerfile的⽅式进⾏实现.
具体实现:
1.1 在⼯程的l中添加dockerfile-maven-plugin插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${dockerfile-maven-version}</version>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 设置镜像名 -->
<repository>eureka-server</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
配置插件版本号
<properties>
<dockerfile-maven-version>1.4.9</dockerfile-maven-version>maven打包本地jar包
</properties>
project.build.finalName默认为
{project.artifactId}-${project.version}的组合,这⾥就不做修改.
1.2 在项⽬根⽬录下添加Dockerfile⽂件
这⾥依然使⽤的Eureka-server为⽰例
Dockerfile的配置基本上和上⼀篇⽂章eureka-server的配置⼀致,只需要修改部分配置
FROM java:alpine
ARG JAR_FILE
ADD target/${JAR_FILE} eureka_server.jar
EXPOSE 9990
ENTRYPOINT ["java","-jar","/eureka_server.jar","--spring.profiles.active=prod"] Array
1.3 项⽬打包成镜像
通过以下命令进⾏打包:
mvn package -DskipTests
或者
mvn dockerfile:build
前者为maven⾃带的打包⽅式,插件会对maven的部分命令进⾏绑定处理;后者为插件提供的打包⽅式;在控制台可以看到如下编译过程:
[INFO] Image will be built as eureka_server:0.0.1
[INFO]
[INFO] Step 1/5 : FROM java:alpine
[INFO]
[INFO] Pulling from library/java
[INFO] Digest: sha256:d49bf8c44670834d3dade17f8b84d709e7db47f1887f671a0e098bafa9bae49f
[INFO] Status: Image is up to date for java:alpine
[INFO] ---> 3fd9dd82815c
[INFO] Step 2/5 : ARG JAR_FILE
[INFO]
[INFO] ---> Running in 41c578f75aed
[INFO] Removing intermediate container 41c578f75aed
[INFO] ---> 6c086f6e46b7
[INFO] Step 3/5 : ADD target/${JAR_FILE} eureka_server.jar
[INFO]
[INFO] ---> 91e3b865def6
[INFO] Step 4/5 : EXPOSE 9990
[INFO]
[INFO] ---> Running in b5bfb7b84db2
[INFO] Removing intermediate container b5bfb7b84db2
[INFO] ---> 9bbb925f43ba
[INFO] Step 5/5 : ENTRYPOINT ["java","-jar","/eureka_server.jar","--spring.profiles.active=prod"]
[INFO]
[INFO] ---> Running in efcabf60de60
[INFO] Removing intermediate container efcabf60de60
[INFO] ---> de2b5c91d917
[INFO] Successfully built de2b5c91d917
[INFO] Successfully tagged eureka_server:0.0.1
[INFO]
[INFO] Detected build of image with id de2b5c91d917
[INFO] Building jar: /Users/hgspiece/work/java/BootProject/server_zero/target/eureka_server-0.0.1-docker-info.jar [INFO] Successfully built eureka_server:0.0.1
以上⽇志基本上和我们通过build命令执⾏⽇志⼀摸⼀样.
如果本地没有安装docker将会报如下错误:
HttpHostConnectException: Connect to localhost:2375 [localhost/127.0.0.1] failed: Connection refused: connect
但执⾏完成后,我们可以进⼊项⽬⽬录看看build过程产⽣了什么,如下⽬录:
可见在target⽬录下多出了⼀个docker⽂件和⼀个xxx-docker-info的jar包,其中docker⽂件夹下每⼀个⽂件都是镜像的⼀些信息,打开⽂件⼀看便知,jar包便是⽤于打包成镜像的jar包,我们可以从上⾯build⽇志中看出.
进⼊本地执⾏的Docker,查看镜像是否存在
命令:docker images
运⾏eureka_server镜像
docker run -p 9990:9990 --name eureka eureka_server:0.0.1
启动该镜像看看好不好使⽤,正常情况⼀切顺利,不在多说.
1.4 更多插件说明
插件还提供了以下命令:
# 将镜像push到私有仓库
mvn deploy 相当于 mvn dockerfile:push
如果不想让插件绑定maven原有的命令,只需要将executions代码块注释即可
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
2. 将镜像发布到远程服务器的docker上
上⾯成功的将项⽬通过maven插件的⽅式构建成本地镜像.可服务器在远程,那我该怎么办?
2.1 远程服务器配置
开放远程Docker远程访问端⼝
# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2377 -H unix:///var/run/docker.sock
在配置项中修改该属性,该⽅式会直接暴露可以操控docker进程的端⼝,需要注意安全,修改完后重启docker服务
sudo service docker restart
2.2 本地配置
让本地Docker访问到远程docker有两种⽅式(推荐⽅法1)
2.2.1 ⽅法1:
docker-maven-plugin 插件默认连接本地 Docker 地址为:localhost:2375,所以我们需要先设置下环境变量
DOCKER_HOST=tcp://<host>:2375
注意:如果没有设置 DOCKER_HOST 环境变量,可以命令⾏显⽰指定 DOCKER_HOST 来执⾏,如
我本机指定DOCKER_HOST:DOCKER_HOST=unix:///var/run/docker.sock mvn clean install docker:build。
2.2.2 ⽅法2:
⾮Dockerfile⽂件的⽅式,直接在pom中进⾏配置
<configuration>
<imageName>${project.name}:${project.version}</imageName>
<baseImage>java</baseImage>
<entryPoint>["java","-jar","/${project.build.finalName}.jar}"]</entryPoint>
<!--注意修改成远程服务器地址-->
<dockerHost> <host>:2375</dockerHost>
<!-- 设置镜像名 -->
<repository>${project.artifactId}</repository>
<tag>${project.version}</tag>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
project.name指定镜像名称,
imageName:⽤于指定镜像名称,{project.version}镜像版本。
baseImage:⽤于指定基础镜像,类似于Dockerfile中的FROM指令。
entrypoint:类似于Dockerfile的ENTRYPOINT指令。
buildArgs:定义构建时需要的参数。
并使⽤命令mvn clean package docker:build -DskipTests进⾏构建,顺利的话即可成功发布镜像。
到此Maven项⽬添加Docker相关插件告⼀段落,继续
紧接着也可以将ServerA和ServerB通过Maven插件⽅式打包成镜像.
3. idea插件⼯具Docker integration
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论