使用 Docker 安装 Jenkins 并实现项目自动化部署

安装步骤

1. 拉取 Jenkins 镜像

首先,拉取 Jenkins 镜像:

docker pull jenkins/jenkins:2.500-jdk21

2. 创建 Jenkins 工作目录

创建 Jenkins 工作目录,并设置权限:

// Jenkins 创建数据卷(持久化数据)

shell 复制代码
mkdir -p /mnt/datadisks/docker-root/jenkins_5080/{jenkins_home,www}

mkdir -p /mnt/datadisks/docker-root/jenkins_5080/www/html

chmod 777 /mnt/datadisks/docker-root/jenkins_5080
chmod 777 /mnt/datadisks/docker-root/jenkins_5080/jenkins_home
chmod 777 /mnt/datadisks/docker-root/jenkins_5080/www/html

3. 启动 Jenkins 容器

启动 Jenkins 容器,并映射端口和挂载卷:

shell 复制代码
#启动容器
docker run --name jenkins-5080 -d --restart=always -p 5080:8080 -p 50000:50000  \
  -v /mnt/datadisks/docker-root/jenkins_5080/jenkins_home:/var/jenkins_home \
  -v /mnt/datadisks/docker-root/jenkins_5080/www/html:/var/www/html \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkins/jenkins:2.500-jdk21

# 获取jenkins密码
docker exec jenkins-5080 cat /var/jenkins_home/secrets/initialAdminPassword

-p 5080:8080:Web 访问端口(宿主机端口:容器端口)

-p 50000:50000:Jenkins 代理通信端口

-v /mnt/datadisks/docker-root/jenkins_5080/jenkins_home:/var/jenkins_home:持久化 Jenkins 配置和数据

/var/www/html:/var/www/html:将nginx中的静态资源目录共享到jenkins中

/mnt/datadisks/docker-root/jenkins_5080/www/html : /var/www/html`:将nginx中的静态资源目录共享到jenkins中

-v /var/run/docker.sock:/var/run/docker.sock:允许容器内使用宿主机的 Docker(可选,用于在 Jenkins Pipeline 中调用 Docker)

--restart unless-stopped:容器自动重启策略

4. 获取初始管理员密码

查看 Jenkins 容器日志,获取初始管理员密码:

Shell 复制代码
docker logs jenkins-5080

或者进入容器,查看密码文件:

Shell 复制代码
docker exec jenkins-5080 cat /var/jenkins_home/secrets/initialAdminPassword

5. 访问 Jenkins

在浏览器中访问 Jenkins:

http://<your_server_ip>:8080

输入获取的初始管理员密码,完成初始设置。 jenkinsAdmin AdminJenkins

6. 配置插件源

为了加快插件下载速度,可以将插件源设置为国内镜像。编辑 hudson.model.UpdateCenter.xml 文件:

vim /usr/local/jenkins/hudson.model.UpdateCenter.xml

将 URL 修改为:

mirrors.tuna.tsinghua.edu.cn/jenkins/upd...

xxxxxxxxxx 修改配置文件重启nginx容器docker exec -it nginx service nginx reload​查询docker中nginx容器的日志的前10行docker logs --tail="10" nginx​docker容器中安装vim(如果下载不下来,需要配置下国内镜像)apt-get updateapt-get install vimtext

Shell 复制代码
docker restart jenkins-5080

配置 Jenkins

配置 JDK

Jenkins 容器内已经默认安装了 JDK,可以在全局配置中设置 JDK 路径:

/opt/java/openjdk

配置 Maven

安装 Maven 插件,并在全局工具配置中设置 Maven 路径:

/usr/local/maven

创建 Jenkins 任务

创建 Maven 项目

在 Jenkins 上新建一个 Maven 项目,配置代码仓库地址和构建命令。构建完成后,可以通过执行 Shell 脚本来启动服务。

示例 Shell 脚本

Shell 复制代码
\#!/bin/bash

SERVER_NAME=jenkins-demo

APP_HOME=$(pwd)

JAR_NAME=jenkins-demo-0.0.1-SNAPSHOT.jar

JAR_PATH=${APP_HOME}/target

PID_FILE="${APP_HOME}/${SERVER_NAME}.pid"

if [ -f "${PID_FILE}" ]; then

PID=$(cat "${PID_FILE}") && kill -9 $PID && echo "kill process ${PID} finished!"

fi

cd $JAR_PATH

chmod 755 $JAR_NAME

BUILD_ID=dontKillMe nohup java -jar $JAR_NAME &

JAVA_PID=$!

echo "${JAVA_PID}" > "${PID_FILE}"

通过上述步骤,即可使用 Docker 安装 Jenkins 并实现项目的自动化部署

发布SpringBoot项目

1、Publish Over SSH

在插件管理中安装插件 Publish Over SSH

在系统管理 -> 系统配置中设置 Publish Over SSH,用于目标服务器的连接

  • Dashboard->Manage Jenkins -> System 找到 SSH Servers 添加 SSH 远程服务

新建任务

由于是 Gradle 项目,所以我们选择 "构建一个自由风格的软件项目

下面说几个关键的配置点:

到达一定的天数或构建数目则自动废弃前面的构建

构建触发器,有定时、轮询等情况。GitHub hook选项的意思是,检测代码有没有更新,如果有更新则自动构建。但前提是:GitHub收到提交的代码后要主动通知Jenkins,所以Jenkins所在服务器一定要有外网IP,并且还需要做一系列的配置,本文我们暂时不做详细的介绍。

建步骤选的是:执行 shell,由于我要打包的是 manager 模块,所以先进入 manager 目录。先执行 gradle clean 清除之前打的包,再执行 gradle build 命令重新打包。整个项目的代码下载存放的路径在服务器的:/root/.jenkins/workspace 目录下,GradleTest 为我们在 Jenkins 中创建的构建任务名。

构建后操作选择:Send build artifacts over SSH,将打好的 Jar 包发送到目标服务器指定的目录下,然后根据命令生成镜像,运行容器。

注意:生成镜像的前提是目标服务器上已经安装完成 docker 服务,基础镜像已经下载完成,dockfile已经正确编写。

构建后操作 在远程服务器上执行 下面的脚本文件

Shell 复制代码
#!/bin/bash
#1.2.3.4.5.6 需要根据不同项目修改不同值
#1.服务名称
SERVER_NAME="mgt-admin"
#2 image 版本
Image_Version="v1.0"
#3 创建 image 的目录
Creat_Image_Path="/docker-images-creat/hotel-booking"

#4.启动dev配置文件
CONFIG_NAME=prod

#5.源jar路径,mvn打包完成之后,target目录下的jar包或jar包名称(包含后缀)
JAR_NAME="/docker-images-creat/hotel-booking/target/hms-mgt-0.0.1.jar"

#6.端口
PORT=9060

echo "清理$SERVER_NAME的容器"

containerId=$(docker ps -a | grep -w  $SERVER_NAME | awk '{print $1}')
if [ -n "$containerId" ];
then
 docker stop $containerId
 docker rm $containerId
 echo "成功停止、删除容器--"$containerId
fi

imageId=$(docker images | grep -w $SERVER_NAME | awk '{print $3}')
if [ -n "$imageId" ];
then
 docker rmi -f  $imageId
 echo "成功删除镜像--"$imageId
fi

echo "停止并清除镜像完成,进入创建新镜像过程"

# echo "复制jar包到/createImages/demo目录下"

#复制jar包到/createImages/demo目录下
# cp $JAR_PATH/$JAR_NAME $JAR_WORK_PATH

#切换到demo创建镜像文件夹目录下
cd $Creat_Image_Path

#修改文件权限
chmod 755 $JAR_NAME

echo "执行命令创建新镜像"

#执行docker创建镜像命令
docker build -t $SERVER_NAME:$Image_Version .

#删除Dockerfile文本文件
# rm /var/jenkins_home/createImages/$SERVER_NAME/Dockerfile

#运行镜像
docker run --name $SERVER_NAME --restart=always -d -p $PORT:8080 \
-v /mnt/docker-root/hotel-booking/admin/config:/config/ \
-v /mnt/docker-root/hotel-booking/admin/logs-root:/logs-root/ \
-v /mnt/docker-root/hotel-booking/admin/upload_root:/upload_root/ \
--network my-net --log-opt max-size=10m --log-opt max-file=3 $SERVER_NAME:$Image_Version

echo "运行新镜像,流程完毕,端口号为:$PORT"
 

这样我们一次构建就已经完成了 代码下载、打包、停止并删除目标服务器指定的容器、删除镜像、重新生成镜像、启动容器等步骤,通过这一系列的动作完成了整个SpringBoot的项目的环境部署。

通过 docker 命令查询容器运行的日志可查看容器运行的情况,如下:

Shell 复制代码
docker logs -f 85f42a7d3230
相关推荐
zxy985 小时前
Docker、Docker-compose、K8s、Docker swarm之间的区别
docker·kubernetes
心动啊1219 小时前
docker常用命令总结
docker·容器·eureka
python算法(魔法师版)9 小时前
Docker容器启动失败?无法启动?
linux·运维·nginx·docker·容器
不学无术の码农15 小时前
Ubuntu 22.04 (WSL2) 上使用 Docker 安装 Nacos 3.0.0
ubuntu·docker
AnnyYoung16 小时前
从Dockerfile 构建docker镜像——保姆级教程
docker·容器·eureka
何怀逸16 小时前
安装 Docker
运维·docker·容器
码码哈哈0.016 小时前
2025最新:3分钟使用Docker快速部署单节点Redis
redis·docker·eureka
Sahas101919 小时前
debian安装docker
docker·eureka·debian
may_一一19 小时前
Docker中mysql镜像保存与导入
mysql·docker·容器
liuze40820 小时前
使用 docker 安装 nacos3.x
运维·docker·容器