背景:
有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";
}
}
效果:
