使用Shell脚本实现SpringBoot项目自动化部署到Docker的操作指南

 更新时间:2025年05月30日 10:00:17   作者:LOVE_DDZ  
在日常项目开发中,我们经常会将SpringBoot项目打包并部署到服务器上的Docker环境中,为了提升效率、减少重复操作,我们可以通过Shell脚本实现自动化部署,所以本文给大家介绍了使用Shell脚本实现SpringBoot项目自动化部署到Docker的操作指南,需要的朋友可以参考下

一、准备环境

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/bash

APP_NAME="ddz_demo"
IMAGE_NAME="ddz_demo_image"
CONTAINER_NAME="ddz_demo_container"
JAR_FILE="ddz_demo.jar"
EXPOSE_PORT=9090

echo ">>> 清理旧容器(如有)"
docker stop $CONTAINER_NAME 2>/dev/null || true
docker rm $CONTAINER_NAME 2>/dev/null || true
docker rmi $IMAGE_NAME 2>/dev/null || true

echo ">>> 构建 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/bash

SERVER_USER="youruser"
SERVER_IP="your.server.ip"
SERVER_DIR="/home/ubuntu/ddz_demo"

echo ">>> 打包项目"
mvn clean package -DskipTests

echo ">>> 创建远程目录"
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

脚本会自动完成:

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

六、常见问题与解决

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

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

  • Git Hooks + 脚本部署
  • Jenkins / GitHub Actions 远程触发
  • 容器健康检查 + 日志集中处理

以上就是使用Shell脚本实现SpringBoot项目自动化部署到Docker的操作指南的详细内容,更多关于Shell实现SpringBoot自动化部署的资料请关注脚本之家其它相关文章!

相关文章

  • Spring中属性文件properties的读取与使用详解

    Spring中属性文件properties的读取与使用详解

    这篇文章主要介绍了Spring中属性文件properties的读取与使用详解的相关资料,需要的朋友可以参考下
    2017-02-02
  • 浅谈MyBatis-Plus 提示发生了非法的反射访问操作

    浅谈MyBatis-Plus 提示发生了非法的反射访问操作

    本文主要介绍了MyBatis-Plus 提示发生了非法的反射访问操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01
  • 教你如何用好 Java 中的枚举

    教你如何用好 Java 中的枚举

    在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式。下面小编将为大家详细介绍
    2021-09-09
  • slf4j与jul、log4j1、log4j2、logback的集成原理

    slf4j与jul、log4j1、log4j2、logback的集成原理

    这篇文章主要介绍了slf4j与jul、log4j1、log4j2、logback的集成原理,以及通用日志框架与具体日志实现系统的机制机制介绍,包括依赖的jar包,jar冲突处理等
    2022-03-03
  • Java中Timer的schedule()方法参数详解

    Java中Timer的schedule()方法参数详解

    今天小编就为大家分享一篇关于Java中Timer的schedule()方法参数详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java枚举类接口实例原理解析

    Java枚举类接口实例原理解析

    这篇文章主要介绍了Java枚举类接口实例原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 超级详细的Java安装教程(Mac版)

    超级详细的Java安装教程(Mac版)

    Java是一种广泛使用的编程语言,可用于开发各种类型的应用程序,这篇文章主要给大家介绍了关于Mac系统下Java安装的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • 使用maven运行Java Main的三种方法解析

    使用maven运行Java Main的三种方法解析

    这篇文章主要介绍了使用maven运行Java Main的三种方式的相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Mybatis实现自定义类型转换器TypeHandler的方法

    Mybatis实现自定义类型转换器TypeHandler的方法

    Mybatis实现自定义的转换器非常的简单,只需要三步就可以实现自定义类型转换器TypeHandler,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-07-07
  • Spring Cloud Gateway的配置与使用教程

    Spring Cloud Gateway的配置与使用教程

    这篇文章主要介绍了Spring Cloud Gateway的配置与使用,通过本文的介绍,我们了解了Spring Cloud Gateway的核心概念和基本配置,需要的朋友可以参考下
    2023-06-06

最新评论