通过 Jenkins Docker 实现应用自动部署
本文通过Jenkins
+Docker
+Git
搭建了CI/DI环境,着重讲解Jenkins构建配置。
起因
2020年6月11日,突然被腾讯云通知,系统中存在木马文件,还好只是刚搭建的用于开发测试的服务器。打开腾讯云先尝试用官方提示的安全工具隔离文件,但是隔离了又冒出新的木马文件。综合考虑一下,因为是刚搭建的测试环境,只是用maven
插件上传镜像到远程docker
运行,为了避免造成更多的问题,先把服务器停机,对问题进行排查。
发现可能是开放docker
端口导致病毒文件被上传到服务器中,考虑时间成本与安全性问题,决定重装服务器并搭建 CI/DI环境。
操作步骤
项目配置
1.Docker 远程连接,推送镜像到远程私库。
注:需要采用证书验证端口,否则会容易被黑。添加证书校验详见 Docker服务开放了这个端口,服务器分分钟变肉机!
Maven打包插件配置
<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
docker run -p 8080:8080 -p 50000:5000 --name jenkins \
-u root \
-v /mydata/jenkins_home:/var/jenkins_home \
-d jenkins/jenkins:lts
启动登录后如图
新建Item,配置构建
以Win10环境为例,演示如何配置构建。
1.安装插件publish over ssh
,用于连接其他服务器,执行构建脚本。2.安装Role-based Authorization Strategy
,用于管理Jenkins
用户。3.配置Git
用户信息,用于获取远程代码。4.执行脚本,在Docker
运行项目。
其中运行脚本fatdown-admin.sh
,如下
#!/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
用于清除无名镜像,如下:
docker rmi -f `docker images | grep '<none>' | awk '{print $3}'`
echo '----rm useless images----'
至此,我们点击构建即可自动部署应用到服务器并运行。后续配置触发器后可以做到PR合并自动触发自动部署,极大的减轻了应用部署的工作量。
Tips
1.若ssh
连接远程服务器失败:检查是否已安装publish over ssh
插件,安装后重启。
总结
对本次被黑进行简单总结,搜索总结了,网上常用提高安全性措施。
1.取消远程用户账号密码登录方式;ssh
远程登录端口修改为不常用端口;密码设置复杂,降低暴力破解成功率。2.谨慎开放端口,建议只对特定ip
地址开放。3.端口开放需要ssl证书验证。