遇见1995

通过 Jenkins + Docker 实现Spring boot应用自动部署

3

本文通过Jenkins+Docker+Git搭建了CI/DI环境,着重讲解Jenkins构建配置。

起因

2020年6月11日,突然被腾讯云通知,系统中存在木马文件,还好只是刚搭建的用于开发测试的服务器。打开腾讯云先尝试用官方提示的安全工具隔离文件,但是隔离了又冒出新的木马文件。综合考虑一下,因为是刚搭建的测试环境,只是用maven插件上传镜像到远程docker运行,为了避免造成更多的问题,先把服务器停机,对问题进行排查。

发现可能是开放docker端口导致病毒文件被上传到服务器中,考虑时间成本与安全性问题,决定重装服务器并搭建 CI/DI环境。

操作步骤

项目配置

  1. Docker 远程连接,推送镜像到远程私库。

    注:需要采用证书验证端口,否则会容易被黑。添加证书校验详见Docker服务开放了这个端口,服务器分分钟变肉机!

Maven打包插件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker.maven.plugin.version}</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>fatdown/${project.name}:${project.version}</imageName>
<!--远程 docker 地址-->
<dockerHost>${docker.host}</dockerHost>
<baseImage>java:8</baseImage>
<entryPoint>["java", "-jar","-Dspring.profiles.active=prod","/${project.build.finalName}.jar"]
</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>

安装软件

  • Jenkins :CI/DI 软件。
  • docker :容器软件。
  • docker register :私有镜像库。

这里讲一下如何安装Jenkins,其他软件安装详见 mall在Linux环境下的部署(基于Docker容器)

Win10环境

通过如下链接下载并安装,默认启动地址为 localhost:8080

https://mirrors.ustc.edu.cn/jenkins/windows-stable/

Linux环境

先安装docker,在下载 Jenkins 镜像并运行,默认启动地址也是 localhost:8080

yum install docker-ce

systemctl start docker

docker pull jenkins/jenkins:lts

1
2
3
4
docker run -p 8080:8080 -p 50000:5000 --name jenkins \
-u root \
-v /mydata/jenkins_home:/var/jenkins_home \
-d jenkins/jenkins:lts

启动登录后如图

image-20200930224421962

新建Item,配置构建

以Win10环境为例,演示如何配置构建。

  1. 安装插件publish over ssh,用于连接其他服务器,执行构建脚本。
  2. 安装Role-based Authorization Strategy,用于管理Jenkins用户。
  3. 配置Git用户信息,用于获取远程代码。
  4. 执行脚本,在Docker运行项目。

其中运行脚本fatdown-admin.sh,如下

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env bash
app_name='fatdown-admin'
docker stop ${app_name}
echo'----stop container----'
docker rm ${app_name}
echo'----rm container----'
docker run -p 8088:8088 --name ${app_name} \
--link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/${app_name}/logs:/var/logs \
-d fatdown/${app_name}:0.0.1-SNAPSHOT
echo'----start container----'

脚本 rmUselessImages.sh用于清除无名镜像,如下:

1
2
docker rmi -f  `docker images | grep '<none>' | awk '{print $3}'`
echo '----rm useless images----'

image-20200930230037759

image-20200930230401363

image-20200930230517679

至此,我们点击构建即可自动部署应用到服务器并运行。后续配置触发器后可以做到PR合并自动触发自动部署,极大的减轻了应用部署的工作量。

Tips

  1. ssh连接远程服务器失败:检查是否已安装publish over ssh插件,安装后重启。

总结

对本次被黑进行简单总结,搜索总结了,网上常用提高安全性措施。

  1. 取消远程用户账号密码登录方式;ssh远程登录端口修改为不常用端口;密码设置复杂,降低暴力破解成功率。
  2. 谨慎开放端口,建议只对特定ip地址开放。
  3. 端口开放需要验证。

本文发表于 2020-10-07,最后修改于 2020-10-21。

本站永久域名yujian95.cn,也可搜索「 遇见1995 」找到我。

期待关注我的微信公众号「 编程图解 」 ,查看最近的文章和动态。


上一篇 « Github 隐藏功能——README.md 下一篇 » 集成 Spring Boot Admin 实现 Spring Boot 应用监控

赞赏支持

请我吃包子 =^_^=

i ali

支付宝

i wechat

微信

推荐阅读

Big Image