0. 提前准备:(可参考前面的博文)
1) CentOS服务器(阿里云ECS)
2) CentOS安装Docker 3)Docker安装Jenkins
4)Docker安装Portainer(非必须)
5)开通阿里云容器镜像服务
1. 创建一个Spring Boot项目docker-test,加入docker配置**
1)POM.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kevin</groupId>
<artifactId>docker-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>docker-test</name>
<description>Demo project for Docker Test</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<skipTests>true</skipTests>
<maven.build.version>${version}-${maven.build.timestamp}</maven.build.version>
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
<docker.image.prefix>registry.cn-beijing.aliyuncs.com/kevin4j</docker.image.prefix>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}.${maven.build.timestamp}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.14</version>
<configuration>
<!-- 注意imageName一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 -->
<imageName>${docker.image.prefix}/${name}</imageName>
<imageTags>
<imageTag>${maven.build.version}</imageTag>
</imageTags>
<!-- 指定Dockerfile所在的路径 -->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.artifactId}.${maven.build.timestamp}.jar</include>
</resource>
</resources>
<!-- 与maven配置文件settings.xml一致 -->
<serverId>kevin4j-registry</serverId>
</configuration>
</plugin>
</plugins>
</build>
</project>
说明:
docker.image.prefix 填写镜像仓库的命名空间地址
build引入docker-maven-plugin
imageName 镜像名称,对应云镜像仓库地址
imageTag 镜像版本号
dockerDirectory Dockerfile所在的路径
resource 构建镜像所含的资源文件
serverId 对应maven配置文件中的server配置
2) src/main/docker加入Dockerfile配置文件
FROM openjdk:8-jdk-alpine
WORKDIR /kevin4j
ADD *.jar docker-test.jar
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Duser.timezone=GMT+08 -Dfile.encoding=UTF-8 -server -Xverify:none -jar ${jvmoptions} docker-test.jar --spring.profiles.active=${profile}
3) 提供一个测试接口
@Controller
@ResponseBody
public class HelloController {
@RequestMapping("/sayHello")
public String sayHello(String name){
return "Hello "+ (StringUtils.isEmpty(name) ? "World" : name);
}
}
4)将项目上传至github(git)
2. jenkins配置maven
1)在jenkins->全局工具配置Maven自动安装
2)找到jenkins下maven的配置文件并加入server配置
/var/lib/docker/volumes/jenkins_home/_data/tools/hudson.tasks.Maven_MavenInstallation/maven/conf/settings.xml
加入以下配置:都是必填
<server>
<id>kevin4j-registry</id>
<username>阿里云账号</username>
<password>镜像仓库密码</password>
<configuration>
<email>阿里云绑定的邮箱</email>
</configuration>
</server>
3. jenkins配置任务
1)jenkins->系统配置中配置SSH Server,用来连接到服务器并执行脚本
2)jenkins->新建任务->构建一个maven项目
配置源码github
配置docker地址环境变量
配置打包指令
上传镜像后服务端执行指令,停止并删除服务,从镜像仓库拉取最新镜像并运行
start.sh脚本内容如下
#!/bin/sh
version=""
if [ "$1" ];then
version=$1
else
version="latest"
fi
docker stop docker-test
docker rm docker-test
docker login -u "镜像仓库账号" -p "镜像仓库密码" registry.cn-beijing.aliyuncs.com
docker pull registry.cn-beijing.aliyuncs.com/kevin4j/docker-test:$version
docker run -e profile='dev' --name docker-test --restart=always -p 8090:8090 -v /etc/localtime:/etc/localtime:ro -v /kevin4j/docker-test/logs:/kevin4j/logs -d registry.cn-beijing.aliyuncs.com/kevin4j/docker-test:$version
3)执行任务,查看控制台输出
4)调用服务,大功告成,注意服务器的安全组需要开放8090端口公网才可访问
可能存在问题:
1. 执行start.sh脚本时提示/bin/sh^M:bad interpreter: No such file or directory
原因:该脚本文件在windows系统中编辑过,引入了不可见的字符,这是不同系统的编码格式所致!
解决方案:
1.删除该脚本文件
rm start.sh //确保windows系统有备份
2.新建脚本文件
touch start.sh
3.修改脚本文件的权限
chmod 755 start.sh //增加脚本可执行权限
4.编辑脚本内容
vim start.sh
再将脚本内容复制过来,保存退出即可。(xshell软件操作)