Java 基于Idea和Docker的SprintBoot项目的一键部署实现 "JDK 11"版
1、参考环境
- 阿里云服务器一台(CentOS 8)
- Idea开发环境软件(2020.2.3)
2、SSH部署服务器
标注:ssh root@ip -p port
2.1 Docker安装
Docker官方文档:前往查看
2.2 远程访问Docker
2.2.1 配置文件
vim /usr/lib/systemd/system/docker.service
添加的内容:-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock \
2.2.2 配置生效
systemctl daemon-reload
systemctl restart docker
2.2.3 验证是否成功
curl http://localhost:2375/version
2.2.4 配置服务器的防火墙
阿里云控制平台防火墙和CentOS 的防火墙两种:
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports
2.2.5 远程测试
测试返回的有参数即可!
curl http://ip:2375/version
2.3 配置国内加速服务
阿里云加速服务:前往查看
3、创建SpringBoot项目
参考博客:前往查看
标注:推荐使用Brew安装Maven:Brew命令安装
4、配置Idea的Docker插件
4.1 安装Docker插件
4.2 配置Docker参数
提示:更改IP就可以了
4.3 Docker操作窗口
5、配置POM文件
5.1 添加配置信息
注意点:
- baseImage的指定(java的版本)
- dockerHost的指定(部署的服务器)
- javax.activation的依赖添加(jdk11删除的包)
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<!-- 跳过单元测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<!--使用docker-maven-plugin插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--用户只需执行mvn package ,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定生成的镜像名-->
<imageName>${project.artifactId}</imageName>
<!--指定标签-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!--指定基础镜像jdk11-->
<baseImage>openjdk:11-jdk</baseImage>
<!--镜像制作人本人信息-->
<maintainer>192119741@qq.com</maintainer>
<!--切换到ROOT目录-->
<workdir>/ROOT</workdir>
<cmd>["java", "-version"]</cmd>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<!--指定远程 docker api地址-->
<dockerHost>http://139.224.30.102:2375</dockerHost>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--jar 包所在的路径 此处配置的 即对应 target 目录-->
<directory>${project.build.directory}</directory>
<!--用于指定需要复制的文件 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
<dependencies>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
5.2 Maven打包上传
6 项目容器启动
6.1 查看容器
docker images
6.2 启动容器
注意:当更改为:-p 80:8080
,这样访问时就可以默认80端口访问了
docker run -di --name contract-manage -p 8080:8080 contract-manage
6.3 Docker窗口查看启动日志
6.4 远程访问
http://ip:port/
7 踩过的坑
-
国内服务器需要配置Docker的加速服务
-
Docker容器间默认数据不共享问题:ip link 网桥 compose这四种方法
最终采用的是业务部署在另一个服务器上(由于Docker部署了MySql、redis、ES、FastDFS这些容器) -
docker-maven-plugin里jdk11的声明方式
-
jdk11相比jdk8缺少javax.activation依赖
8、自动化部署思考
存在问题:每次需要重新建立启动容器来应对内容的更新!
问题思考:既然已经一键化打包了,有办法能解决Docker自动监控镜像更新然后加载新的内容这种方式吗?
解决思路:Jenkins 那一套通过git、maven等来实现,后续再了解吧
相关项目参考:contract-manage
注意:该项目的设计有欠安全方面的思考!仅作为功能实现