使用 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
腳本會自動完成:
- 打包項目
- 上傳構建產物與部署腳本
- 構建 Docker 鏡像
- 啟動容器服務
🧯 六、常見問題與解決
問題 | 解決方法 |
---|---|
Permission denied 上傳失敗 | 確保目標目錄屬于當前用戶或改為 /home/ubuntu |
Docker 權限錯誤 | 將用戶加入 docker 組:sudo usermod -aG docker $USER 并重啟 |
容器端口配置不一致 | 確保 Dockerfile 中 EXPOSE 和 Java 服務端口一致 |
腳本無法執行 | 加權限:chmod +x deploy.sh |
如果希望進一步提升部署體驗,還可以引入:
- Git Hooks + 腳本部署
- Jenkins / GitHub Actions 遠程觸發
- 容器健康檢查 + 日志集中處理