当前位置: 首页 > news >正文

使用 Shell 脚本实现 Spring Boot 项目自动化部署到 Docker(Ubuntu 服务器)

使用 Shell 脚本实现 Spring Boot 项目自动化部署到 Docker(Ubuntu 服务器)

在这里插入图片描述

在日常项目开发中,我们经常会将 Spring Boot 项目打包并部署到服务器上的 Docker 环境中。为了提升效率、减少重复操作,我们可以通过 Shell 脚本实现自动化部署。


🧱 一、准备环境

1. 本地和服务器要求

  • 本地安装了 Maven 和 JDK
  • 服务器操作系统为 Ubuntu 22.04 LTS
  • 服务器已安装 Docker,并已配置当前用户对 Docker 的权限(加入 docker 用户组)

2. 本地项目结构示例

project-root/
├── src/
├── target/
│   └── yourapp.jar
├── Dockerfile
└── deploy/
│   └── deploy.sh
└── deploy-to-server.sh

🚀 二、编写部署脚本

project-root/deploy 目录中创建 deploy.sh 脚本(用于服务器端自动执行):

🔧 deploy/deploy.sh 内容:

#!/bin/bashAPP_NAME="ddz_demo"
IMAGE_NAME="ddz_demo_image"
CONTAINER_NAME="ddz_demo_container"
JAR_FILE="ddz_demo.jar"
EXPOSE_PORT=9090echo ">>> 清理旧容器(如有)"
docker stop $CONTAINER_NAME 2>/dev/null || true
docker rm $CONTAINER_NAME 2>/dev/null || true
docker rmi $IMAGE_NAME 2>/dev/null || trueecho ">>> 构建 Docker 镜像"
docker build -t $IMAGE_NAME .echo ">>> 启动新容器"
docker run -d --name $CONTAINER_NAME -p $EXPOSE_PORT:$EXPOSE_PORT $IMAGE_NAME

注意:确保 Dockerfile 中的 EXPOSE 与实际 Java 服务端口一致。


🛠️ 三、编写自动上传与执行脚本

在本地项目根目录添加一个部署脚本,如 deploy-to-server.sh

🔧 deploy-to-server.sh 内容:

#!/bin/bashSERVER_USER="youruser"
SERVER_IP="your.server.ip"
SERVER_DIR="/home/ubuntu/ddz_demo"echo ">>> 打包项目"
mvn clean package -DskipTestsecho ">>> 创建远程目录"
ssh $SERVER_USER@$SERVER_IP "mkdir -p $SERVER_DIR"echo ">>> 上传文件"
scp target/ddz_demo.jar Dockerfile deploy/deploy.sh $SERVER_USER@$SERVER_IP:$SERVER_DIR/echo ">>> 执行部署脚本"
ssh $SERVER_USER@$SERVER_IP "chmod +x $SERVER_DIR/deploy.sh && cd $SERVER_DIR && ./deploy.sh"

🔑 四、配置 SSH 免密登录(自动化关键)

如果不想每次上传/执行都输入密码,请配置 SSH 免密登录:

1. 本地生成密钥(如未生成)

ssh-keygen -t rsa -b 4096

2. 将公钥添加到服务器

ssh-copy-id ubuntu@[your.server.ip]

或手动上传:

cat ~/.ssh/id_rsa.pub | ssh ubuntu@[your.server.ip] "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

3. 验证

ssh ubuntu@[your.server.ip]

应无需输入密码即可登录。


🧪 五、部署过程演示

只需一条命令即可:

bash deploy-to-server.sh

脚本会自动完成:

  1. 打包项目
  2. 上传构建产物与部署脚本
  3. 构建 Docker 镜像
  4. 启动容器服务

🧯 六、常见问题与解决

问题解决方法
Permission denied 上传失败确保目标目录属于当前用户或改为 /home/ubuntu
Docker 权限错误将用户加入 docker 组:sudo usermod -aG docker $USER 并重启
容器端口配置不一致确保 Dockerfile 中 EXPOSE 和 Java 服务端口一致
脚本无法执行加权限:chmod +x deploy.sh

如果希望进一步提升部署体验,还可以引入:

  • Git Hooks + 脚本部署
  • Jenkins / GitHub Actions 远程触发
  • 容器健康检查 + 日志集中处理
http://www.xdnf.cn/news/688159.html

相关文章:

  • 如果是在服务器的tty2终端怎么查看登陆服务器的IP呢
  • 《vue.js快速入门》链接摘抄整理
  • 深入理解SQLMesh中的Lookback、Forward-Only和Auto-Restatement特性
  • 【GlobalMapper精品教程】095:如何获取无人机照片的拍摄方位角
  • Redis keydb dragonfly skytable
  • 《全面解析鸿蒙相关概念:鸿蒙、开源鸿蒙、鸿蒙 Next 有何区别》
  • 【R语言编程绘图-调色】
  • css3 新增属性/滤镜效果/裁剪元素/图片适应盒子/定义和使用变量/恢复默认initial
  • 使用electron创建应用程序的基础步骤
  • 基于 HEC-RAS 与 ArcGIS 的洪水危险性评估技术— 从地形分析到淹没模拟的全流程实践
  • webpack的安装及其后序部分
  • 【ArcGIS Pro微课1000例】0071:将无人机照片生成航线、轨迹点、坐标高程、方位角
  • 从技术到实践:ArcGIS 与 HEC-RAS 解析洪水危险性及风险评估
  • v1.05 支付宝 绑定时写Nand flash卡死问题
  • 致远OA与用友U8集成实现制造业设备追溯全过程方案分析
  • Java jdk8版本特性(未完成版)
  • Vue.js教学第十七章:Vue 与后端交互(一),Axios 基础
  • mysql 迁移金仓,sys_use表查询报错,指定search_path后任然报错的问题
  • React 泛型组件:用TS来打造灵活的组件。
  • 前端面经 React常见的生命周期
  • 可视化图解算法46:用两个栈实现队列
  • 面试加分秘籍:校招数据倾斜场景下的SQL优化方案
  • 第一节 51单片机概述
  • ffmpeg baidu
  • 【产品小白】京东外卖为何未独立成 APP
  • WebFuture:测试邮件发送失败
  • 嵌入式开发之STM32学习笔记day14
  • Qwen3 技术报告详解
  • python学习day31
  • Linux程序与进程