背景:
有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 "1072772483@qq.com"# DOC: 拷贝jenkins机器的公钥到目标机
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.13.130# DOC: 如果下面的直接执行成功,没让输入密码,则说明可以了
# ssh root@192.168.13.130# 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 root@192.168.13.130 'bash -s' < ${WORKSPACE}/../../2_UpdateServer.sh
# echoJENKINS_HOME_DIR="/data/jenkins_home"if which docker > /dev/null 2>&1; thenecho "已经存在docker"
elseecho "不存在docker,开始安装"echo "准备docker环境"sudo dnf remove podmansudo rm -rf /etc/containers /etc/registries.conf /etc/containers/policy.json /etc/containers/storage.conf ~/.config/containers ~/.local/share/containerssudo dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-enginesudo dnf install -y yum-utils device-mapper-persistent-data lvm2sudo 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 echoecho "安装docker"sudo dnf install docker-ce docker-ce-cli containerd.io -yechoecho "启动docker"sudo systemctl start dockerechoecho "设置docker开机启动"sudo systemctl enable dockerechoecho "打印安装的docker版本"sudo docker --versionecho
fiecho "[step1]:检测jenkins home"
# 检查目录是否成功创建
if [ -d "$JENKINS_HOME_DIR" ]; thenecho "目录 $JENKINS_HOME_DIR 创建成功"chown -R 1000:1000 "$JENKINS_HOME_DIR"echo "目录 $JENKINS_HOME_DIR 设置读写权限"
elseecho "已经存在 $JENKINS_HOME_DIR 目录."
fi
echo echo "[step2]:检测docker镜像"
if docker images | grep -q "jenkins"; thenecho "存在 Jenkins 镜像"
elseecho "不存在 Jenkins 镜像,拉取镜像"docker pull jenkins/jenkins:lts
fi
echo echo "[step3]:检测docker是否运行着jenkins,没有运行则启动jenkins容器"
if docker ps -a| grep -q "jenkins"; thenecho "存在名为 jenkins的容器,先删除"docker stop jenkins# 删除 jenkins 容器docker rm jenkins
fi
echoecho "[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; thenecho "游戏服务器已经存在docker"
elseecho "游戏服务器不存在docker,开始安装"echo "准备docker环境"sudo dnf remove podmansudo rm -rf /etc/containers /etc/registries.conf /etc/containers/policy.json /etc/containers/storage.conf ~/.config/containers ~/.local/share/containerssudo dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-enginesudo dnf install -y yum-utils device-mapper-persistent-data lvm2sudo 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 echoecho "安装docker"sudo dnf install docker-ce docker-ce-cli containerd.io -yechoecho "启动docker"sudo systemctl start dockerechoecho "设置docker开机启动"sudo systemctl enable dockerechoecho "打印安装的docker版本"sudo docker --versionecho
fi
echo
四、打包机,配置jenkins
不知道为何不使用https方式不识别!!!
选用的是maven风格的项目,如果没有安装maven插件,则选择下版本,并且自动下载
shell
#想要部署到的游戏服
SERVER_IP=192.168.13.130
#游戏服目录
APP_PATH=/home/demo
echoecho WORKSPACE: ${WORKSPACE}
echoecho "[打包java程序,并同步工程到远程服务器]"
cd ${WORKSPACE}/demo# 选择maven风格的项目,就不需要自己打包了
#mvn clean package rsync -avzrcI ${WORKSPACE}/demo/ root@$SERVER_IP:$APP_PATH
echoecho "[在游戏服上打包镜像,并运行起来]"
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";}
}
效果: