使用 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/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 远程触发
- 容器健康检查 + 日志集中处理