使用Shell腳本實(shí)現(xiàn)SpringBoot項(xiàng)目自動(dòng)化部署到Docker的操作指南
一、準(zhǔn)備環(huán)境
1. 本地和服務(wù)器要求
- 本地安裝了 Maven 和 JDK
- 服務(wù)器操作系統(tǒng)為 Ubuntu 22.04 LTS
- 服務(wù)器已安裝 Docker,并已配置當(dāng)前用戶對(duì) Docker 的權(quán)限(加入
docker用戶組)
2. 本地項(xiàng)目結(jié)構(gòu)示例
project-root/ ├── src/ ├── target/ │ └── yourapp.jar ├── Dockerfile └── deploy/ │ └── deploy.sh └── deploy-to-server.sh
二、編寫部署腳本
在 project-root/deploy 目錄中創(chuàng)建 deploy.sh 腳本(用于服務(wù)器端自動(dòng)執(zhí)行):
deploy/deploy.sh 內(nèi)容:
#!/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 ">>> 構(gòu)建 Docker 鏡像" docker build -t $IMAGE_NAME . echo ">>> 啟動(dòng)新容器" docker run -d --name $CONTAINER_NAME -p $EXPOSE_PORT:$EXPOSE_PORT $IMAGE_NAME
注意:確保 Dockerfile 中的 EXPOSE 與實(shí)際 Java 服務(wù)端口一致。
三、編寫自動(dòng)上傳與執(zhí)行腳本
在本地項(xiàng)目根目錄添加一個(gè)部署腳本,如 deploy-to-server.sh:
deploy-to-server.sh 內(nèi)容:
#!/bin/bash SERVER_USER="youruser" SERVER_IP="your.server.ip" SERVER_DIR="/home/ubuntu/ddz_demo" echo ">>> 打包項(xiàng)目" mvn clean package -DskipTests echo ">>> 創(chuàng)建遠(yuǎn)程目錄" 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 ">>> 執(zhí)行部署腳本" ssh $SERVER_USER@$SERVER_IP "chmod +x $SERVER_DIR/deploy.sh && cd $SERVER_DIR && ./deploy.sh"
四、配置 SSH 免密登錄(自動(dòng)化關(guān)鍵)
如果不想每次上傳/執(zhí)行都輸入密碼,請(qǐng)配置 SSH 免密登錄:
1. 本地生成密鑰(如未生成)
ssh-keygen -t rsa -b 4096
2. 將公鑰添加到服務(wù)器
ssh-copy-id ubuntu@[your.server.ip]
或手動(dòng)上傳:
cat ~/.ssh/id_rsa.pub | ssh ubuntu@[your.server.ip] "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
3. 驗(yàn)證
ssh ubuntu@[your.server.ip]
應(yīng)無(wú)需輸入密碼即可登錄。
五、部署過程演示
只需一條命令即可:
bash deploy-to-server.sh
腳本會(huì)自動(dòng)完成:
- 打包項(xiàng)目
- 上傳構(gòu)建產(chǎn)物與部署腳本
- 構(gòu)建 Docker 鏡像
- 啟動(dòng)容器服務(wù)
六、常見問題與解決
| 問題 | 解決方法 |
|---|---|
Permission denied 上傳失敗 | 確保目標(biāo)目錄屬于當(dāng)前用戶或改為 /home/ubuntu |
| Docker 權(quán)限錯(cuò)誤 | 將用戶加入 docker 組:sudo usermod -aG docker $USER 并重啟 |
| 容器端口配置不一致 | 確保 Dockerfile 中 EXPOSE 和 Java 服務(wù)端口一致 |
| 腳本無(wú)法執(zhí)行 | 加權(quán)限:chmod +x deploy.sh |
如果希望進(jìn)一步提升部署體驗(yàn),還可以引入:
- Git Hooks + 腳本部署
- Jenkins / GitHub Actions 遠(yuǎn)程觸發(fā)
- 容器健康檢查 + 日志集中處理
以上就是使用Shell腳本實(shí)現(xiàn)SpringBoot項(xiàng)目自動(dòng)化部署到Docker的操作指南的詳細(xì)內(nèi)容,更多關(guān)于Shell實(shí)現(xiàn)SpringBoot自動(dòng)化部署的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java的四種常見線程池及Scheduled定時(shí)線程池實(shí)現(xiàn)詳解
這篇文章主要介紹了Java的四種常見線程池及Scheduled定時(shí)線程池實(shí)現(xiàn)詳解,在Java中,我們可以通過Executors類來創(chuàng)建ScheduledThreadPool,Executors類提供了幾個(gè)靜態(tài)方法來創(chuàng)建不同類型的線程池,包括ScheduledThreadPool,需要的朋友可以參考下2023-09-09
spring-data-jpa中findOne與getOne的區(qū)別說明
這篇文章主要介紹了spring-data-jpa中findOne與getOne的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
String.intern()作用與常量池關(guān)系示例解析
這篇文章主要為大家介紹了String.intern()作用與常量池關(guān)系示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Spring Security中防護(hù)CSRF功能詳解
這篇文章主要介紹了Spring Security中防護(hù)CSRF功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
判斷以逗號(hào)分隔的字符串中是否包含某個(gè)數(shù)的實(shí)例
下面小編就為大家?guī)硪黄袛嘁远禾?hào)分隔的字符串中是否包含某個(gè)數(shù)的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11

