【使用jenkins+docker自动化部署java项目】

背景:

有A(打包机129),B(游戏服130) 2个机器,他们都安装有docker,请完成部署。

一、准备好java项目,写好Dockerfile

复制代码
# 基础镜像,使用包含 JDK 17 的 OpenJDK 镜像
FROM openjdk:17-jdk-slim

# 设置工作目录
WORKDIR /app

# 把当前目录下的 Spring Boot JAR 包复制到容器的 /app 目录下
COPY target/demo-0.0.1-SNAPSHOT.jar /app/app.jar

# 运行 Spring Boot 应用程序
CMD ["java", "-jar", "app.jar"]

位置: // 这一步其实是在远程机器docker build打镜像包使用

思考:我们不需要安装docker上传插件而是打包后,使用rsync进行同步即可,然后在目标机上进行构建镜像,所以无需在pom.xml中配置docker插件!!

二、初始化打包机,安装docker和jenkins

复制代码
# 通过MobaXterm可以向linux里的/home目录可以上传文件
# chmod -R 777 /home/  

# 设置docker阿里云镜像
# cd /etc/docker/
# vim daemon.json
# {
# "registry-mirrors": ["https://mirror.ccs.tencentyun.com", "https://pfn30lpj.mirror.aliyuncs.com"]
# }

# 重启docker容器
# sudo systemctl restart docker


# 设置下格式不然win上传到linux运行不起来
#sudo find -name "*.sh" | xargs dos2unix

# 强制删除镜像
# docker rmi -f hello-world:latest
# docker update --restart=no <container_id>

# 重启容器
# docker restart jenkins

# 在windows上打开jenkins
# http://192.168.13.129:8080

# DOC: 查看密码
# [root@bogon home]# cat /data/jenkins_home/secrets/initialAdminPassword
# 870bcdc8051443a3bdf69edfa6b2649f


# DOC: 防火墙是否禁止22端口,禁止则打开
# firewall-cmd --query-port=22/tcp
# sudo firewall-cmd --add-port=2181/tcp --permanent
# sudo firewall-cmd --reload


# DOC: 打开机器的root认证权限 
# 需要打开权限,不然没办法拷贝到宿主机
# vim /etc/ssh/sshd_config
# PermitRootLogin: yes
# PasswordAuthentication:yes

#重启SSH服务使其生效
# systemctl restart sshd

# DOC: 在目标机上生成下公钥
# ssh-keygen -t rsa -C "[email protected]"

# DOC: 拷贝jenkins机器的公钥到目标机
# ssh-copy-id -i ~/.ssh/id_rsa.pub  [email protected]

# DOC: 如果下面的直接执行成功,没让输入密码,则说明可以了
# ssh [email protected]


# DOC: 进入到宿主机
# docker exec -it jenkins /bin/bash

# DOC: 容器内安装rsync
# apt update -y
# apt install rsync -y


#DOC: 打包镜像
# 新建Dockerfile文件
# [root@localhost demo]# docker build -t demo .
# 之后执行 docker images即可发现: demo镜像在里面了
#[root@localhost demo]# docker run -d -p 8082:8080 demo  // 在任意一个目录下运行
# docker ps                                              // 这样子可以看到,已经有一个demo的容器起来了 
# http://192.168.13.129:8082/test/hello                  // 发现已经可以运行了


# DOC: 部署脚本
# #想要部署到的游戏服
# SERVER_IP=192.168.13.130
# #游戏服目录
# APP_PATH=/home/demo
# echo

# echo WORKSPACE: ${WORKSPACE}
# echo

# echo "[打包java程序,并同步到远程服务器]"
# cd ${WORKSPACE}/demo
# mvn clean package
# rsync -avzrcI ${WORKSPACE}/demo/  root@$SERVER_IP:$APP_PATH
# echo

# echo "[在打包机上的2_UpdateServer传递到游戏服,并执行]"
# ls
# #ssh [email protected] 'bash -s' < ${WORKSPACE}/../../2_UpdateServer.sh
# echo


JENKINS_HOME_DIR="/data/jenkins_home"


if which docker > /dev/null 2>&1; then
    echo "已经存在docker"
else
    echo "不存在docker,开始安装"

    echo "准备docker环境"
    sudo dnf remove podman
    sudo rm -rf /etc/containers /etc/registries.conf /etc/containers/policy.json /etc/containers/storage.conf ~/.config/containers ~/.local/share/containers
    sudo dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
    sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 
    sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
    echo

    echo "安装docker"
    sudo dnf install docker-ce docker-ce-cli containerd.io -y
    echo

    echo "启动docker"
    sudo systemctl start docker
    echo

    echo "设置docker开机启动"
    sudo systemctl enable docker
    echo

    echo "打印安装的docker版本"
    sudo docker --version
    echo
fi


echo "[step1]:检测jenkins home"
# 检查目录是否成功创建
if [ -d "$JENKINS_HOME_DIR" ]; then
    echo "目录 $JENKINS_HOME_DIR 创建成功"

    chown -R 1000:1000 "$JENKINS_HOME_DIR"
    echo "目录 $JENKINS_HOME_DIR 设置读写权限"
else
    echo "已经存在 $JENKINS_HOME_DIR 目录."
fi  
echo  


echo "[step2]:检测docker镜像"
if docker images | grep -q "jenkins"; then
    echo "存在 Jenkins 镜像"
else
    echo "不存在 Jenkins 镜像,拉取镜像"
    docker pull jenkins/jenkins:lts
fi
echo 

echo "[step3]:检测docker是否运行着jenkins,没有运行则启动jenkins容器"
if docker ps -a| grep -q "jenkins"; then
    echo "存在名为 jenkins的容器,先删除"
    docker stop jenkins
    # 删除 jenkins 容器
    docker rm jenkins    
fi
echo

echo "[step4]:重新运行jenkins"
docker run -d -u root -p 8080:8080 -p 50000:50000 -v $JENKINS_HOME_DIR:/var/jenkins_home --restart=always --name jenkins jenkins/jenkins:lts
echo   

需要注意: jenkins是运行在docker中,因此,是docker中与目标机之间的ssh认证,而不是宿主机!!!

三、初始化游戏服,安装docker

复制代码
echo "[检测游戏服务器docker是否存在]"
if which docker > /dev/null 2>&1; then
    echo "游戏服务器已经存在docker"
else
    echo "游戏服务器不存在docker,开始安装"

    echo "准备docker环境"
    sudo dnf remove podman
    sudo rm -rf /etc/containers /etc/registries.conf /etc/containers/policy.json /etc/containers/storage.conf ~/.config/containers ~/.local/share/containers
    sudo dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
    sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 
    sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
    echo

    echo "安装docker"
    sudo dnf install docker-ce docker-ce-cli containerd.io -y
    echo

    echo "启动docker"
    sudo systemctl start docker
    echo

    echo "设置docker开机启动"
    sudo systemctl enable docker
    echo

    echo "打印安装的docker版本"
    sudo docker --version
    echo
fi
echo

四、打包机,配置jenkins

不知道为何不使用https方式不识别!!!

选用的是maven风格的项目,如果没有安装maven插件,则选择下版本,并且自动下载

shell

复制代码
#想要部署到的游戏服
SERVER_IP=192.168.13.130
#游戏服目录
APP_PATH=/home/demo
echo

echo WORKSPACE: ${WORKSPACE}
echo

echo "[打包java程序,并同步工程到远程服务器]"
cd ${WORKSPACE}/demo

# 选择maven风格的项目,就不需要自己打包了
#mvn clean package 

rsync -avzrcI ${WORKSPACE}/demo/  root@$SERVER_IP:$APP_PATH
echo

echo "[在游戏服上打包镜像,并运行起来]"
ssh root@${SERVER_IP} "cd ${APP_PATH}; docker stop demo; docker rm demo; docker rmi demo:1.0; docker build -t demo:1.0 .;  docker run -d -p 8082:8080 --name demo demo:1.0; "
echo

所以最核心的就是: rsync进行文件夹同步 和 ssh root@server_ip "xxx"远程执行目标机上的shell文件。

五、运行

TestController.java

复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {

    /**
     * http://localhost:8080/test/hello
     */
    @RequestMapping("/hello")
    public String hello() {
        return "Hello World 3";
    }
}

效果:

相关推荐
不学无术の码农4 小时前
Ubuntu 22.04 (WSL2) 上使用 Docker 安装 Nacos 3.0.0
ubuntu·docker
AnnyYoung6 小时前
从Dockerfile 构建docker镜像——保姆级教程
docker·容器·eureka
何怀逸6 小时前
安装 Docker
运维·docker·容器
码码哈哈0.06 小时前
2025最新:3分钟使用Docker快速部署单节点Redis
redis·docker·eureka
Sahas10198 小时前
debian安装docker
docker·eureka·debian
may_一一9 小时前
Docker中mysql镜像保存与导入
mysql·docker·容器
liuze4089 小时前
使用 docker 安装 nacos3.x
运维·docker·容器
家庭云计算专家10 小时前
一键设置动态域名+ipv6内网直通访问ssh服务-家庭云计算专家
运维·docker·容器·云计算·ssh·onlyoffice
Kendra91911 小时前
Docker 容器 - Dockerfile
java·docker·eureka
YJII12 小时前
Docker封装深度学习模型
运维·docker·容器