通過Docker部署SpringBoot項目

来源:https://www.cnblogs.com/ride0nTime/archive/2023/02/05/17093456.html
-Advertisement-
Play Games

Docker部署SpringBoot項目 前言: 以前幾次在雲伺服器上部署項目都是手動打包,安裝mysql等環境最後再部署運行,相對比較麻煩而且加上網上各種教程質量層次不齊,如果過程中出錯的話排查問題對於新人來說已經夠喝一壺了。(我自己第一次手動裝mysql8.0就出過問題,最後找不到問題所在只能推 ...


Docker部署SpringBoot項目

前言:

以前幾次在雲伺服器上部署項目都是手動打包,安裝mysql等環境最後再部署運行,相對比較麻煩而且加上網上各種教程質量層次不齊,如果過程中出錯的話排查問題對於新人來說已經夠喝一壺了。(我自己第一次手動裝mysql8.0就出過問題,最後找不到問題所在只能推倒一步步重來)

而最近在Win10專業版下用Docker桌面版安裝了zookeeper/rabbitmq/redis 6.2等都比較方便,命令行拉取鏡像,啟動服務都非常方便快捷,相比以往下載配置環境變數再啟動的方式要方便很多,所以此次決定嘗試一下通過Docker的方式來安裝部署一次Spring Boot項目。

聲明:本文主要介紹如何通過 IntelliJ IDEA、Maven 來操作 Docker 部署 Spring Boot 項目到雲伺服器,不涉及Docker或Maven等內容中的基本概念,預設讀者已經瞭解,相關教程請自行搜索。

雲伺服器:阿裡雲Centos 7

1.雲伺服器基本環境搭建

安裝Docker

yum安裝Docker

yum install docker

啟動docker並設置為啟動:

systemctl  start docker.service
systemctl  enable docker.service

使用docker國內鏡像加速

vim  /etc/docker/daemon.json

內容如下(也可自己搜索其他鏡像修改)

{
    "registry-mirrors": ["https://registry.docker-cn.com"],
    "live-restore": true
}

重啟docker

systemctl restart docker

可以看到鏡像已經改了

docker info

image-20230205150709267

查看docker版本信息

docker version
image-20230204191805459

安裝JDK

耐心等待安裝完成

yum -y install java-1.8.0-openjdk

查找java所在位置

whereis java

image-20230204192629209

配置環境變數

vim /etc/profile 

配置信息

export JAVA_HOME=/usr/lib/jvm/java-1.8.0
export PATH=$PATH:$JAVA_HOME/bin

再次刷新配置信息

source /etc/profile

查看java版本信息

java -version

image-20230204193123806

安裝Maven

方式有很多種,自己到Maven官網下載上傳到伺服器解壓或者直接wget命令安裝(通過yum安裝weget命令).我這裡選用第一種.

本質上和在win10下安裝沒什麼區別都是下載->解壓->配置鏡像和倉庫->配置環境變數這幾個步驟

下載Maven

Maven官網:

https://maven.apache.org/docs/history.html

下載Linux版本,然後傳到雲伺服器手動解壓安裝

image-20230204181941669

可以直接下載最新版本,但我個人一般習慣往前找幾個版本的,所以繼續往下滑

1.看到標題停下來,它給我們指明瞭更早的版本在哪去找

image-20230204182049369

2.二進位文件就是我們要的,source指的是源碼

image-20230204182201476

3.選擇對應Linux的版本

image-20230204182327098

上傳到伺服器並解壓

把它下載然後上傳到伺服器指定目錄下(我這裡用XFTP傳到了usr/local目錄下)

image-20230204182756629

這時候解壓它就行

image-20230204183014967

通過如下命令解壓

tar -zxvf apache-maven-3.6.3-bin.tar.gz

image-20230204183431071

配置鏡像和本地倉庫信息

上面這個就是解壓後的文件夾,只需要配置下國內鏡像地址和本地倉庫位置信息就可以用了。

cd apache-maven-3.6.3   #進入apache-maven-3.6.3目錄

image-20230204183542950

這時候可以新建一個目錄,用作後續修改配置文件,存放maven下載的jar

mkdir repository    #創建目錄存放後續maven下載jar包

image-20230204183844154

進入conf目錄,通過vim修改settings.xml,配置鏡像和本地倉庫信息

vim基本操作:

i:進入編輯模式

esc +!:wq: 保存並退出

cd conf #進入conf目錄

image-20230204185556827

vim settings.xml  #編輯配置文件

配置文件里我們只關心mirrors根節點下的鏡像和localRepository根節點下的本地倉庫位置

本地倉庫:解除註釋,把位置改成之前自己創建的倉庫目錄的完整路徑

image-20230204185705658

<localRepository>/usr/local/apache-maven-3.6.3/repository</localRepository>

鏡像地址:註意name和url這些不要搞錯了

image-20230204185724658
<mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
       <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
</mirror>

修改完以上的兩處,保存並退出就行。

配置環境變數

接下來是,依舊是配置環境變數

image-20230204190406914

vim /etc/profile

編輯/etc/profile 文件,系統環境變數都在這配置

image-20230204190231939

export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin

刷新配置文件:

source /etc/profile

image-20230204190424120

查看Maven版本信息

mvn -v

image-20230204193223063

以下的Mysql和Redis的安裝只是因為我的項目用到了,如果只是自己體驗整個部署流程的話不需要安裝

安裝Mysql

到DockerHub找一個mysql鏡像,我這裡用的mysql8

https://hub.docker.com/_/mysql

到tags下搜索,然後複製命令拉取鏡像就行

image-20230204194025637

  1. 拉取鏡像
docker pull mysql:8.0
  1. 查看鏡像
docker images

image-20230204194616310

這裡DockerHub官方也給了關於如何使用和連接的指南

image-20230204193915025

  1. 創建並修改配置文件

創建兩個文件夾conf和data(映射Docker的目錄,放置配置文件和日誌等信息)

我把它放在了/usr/local/mysql/路徑下(看自己習慣)

創建/修改配置文件信息

vim my.cnf  #用touch新建也一樣

內容如下

[mysql]
#設置mysql客戶端預設字元集
default-character-set=UTF8MB4
[mysqld]
#設置3306埠
port=3306
#允許最大連接數
max_connections=200
#允許連接失敗的次數
max_connect_errors=10
#服務端使用的字元集
character-set-server=UTF8MB4
#創建新表時將使用的預設存儲引擎
default-storage-engine=INNODB
#等待超時時間秒
wait_timeout=60
#互動式連接超時時間秒
interactive-timeout=600
  1. 啟動並運行mysql
docker run \
  -d \
  -p 3306:3306 \
  -v /usr/local/mysql/data:/var/lib/mysql \
  -v /usr/local/mysql/my.cnf:/etc/mysql/conf.d/my.cnf \
  -e MYSQL_ROOT_PASSWORD=123456 \
  --restart=always \
  --privileged=true \
  --name mysql8 \
  mysql:8.0

image-20230204225453132

參數說明

-p 3306:3306:將容器內的3306埠映射到實體機3306埠
--name msqyl:給這個容器取一個容器記住的名字
-e MYSQL_ROOT_PASSWORD=xxx:docker的MySQL預設的root密碼是隨機的,這是改一下預設的root用戶密碼
-v 宿主機和Docker容器的掛載關係 :前是宿主機的路徑,後是Docker中的掛載路徑
-d mysql:8.0在後臺運行mysql:8.0鏡像產生的容器

後續導入SQL還踩了坑.原因是mysql是通過Docker安裝的,而我恢復快照用的是Linux中的路徑.

所以dump快照生成的sql文件本身也必須掛載到docker容器中.否則source命令會找不到文件所在.

獲取容器/鏡像的元數據,通過這個也能看到掛載信息

我這裡後續繼續掛載到/var/lib/mysql目錄下了

docker cp :用於容器與主機之間的數據拷貝

image-20230205002652421

安裝Redis

拉取鏡像

https://registry.hub.docker.com/_/redis

因為我的項目里用到GEO命令,所以要拉取6.2以上的版本

docker pull redis:6.2.7
  1. 創建redis配置文件目錄
mkdir /usr/local/redis/conf
mkdir /usr/local/redis/data
touch /usr/local/redis/conf/redis.conf

redis.conf文件內容非常的多(可到redis中文官方或者github里自己下一個)

中文地址:http://www.redis.cn/download.html

配置文件中主要關鍵的地方

bind 127.0.0.1 #使redis可以外部訪問
daemonize no#用守護線程的方式啟動
requirepass 你的密碼#給redis設置密碼
appendonly yes#redis持久化  預設是no
tcp-keepalive 300 #防止出現遠程主機強迫關閉了一個現有的連接的錯誤 預設是300

一啟動就閃退的原因:

redis.conf文件中的daemonize為yes,意思是redis服務在後臺運行,與docker中的-d參數衝突了。

只要把daemonize的參數值改為no就可以了,再次執行以上命令,容器啟動成功。

  1. 啟動redis容器
docker run -p 6379:6379 --name redis \
-v /usr/local/redis/data:/data \
-v /usr/local/redis/redis.conf:/etc/redis/redis.conf \
-d redis:6.2.7 redis-server /etc/redis/redis.conf \
--appendonly yes

容器隨docker啟動自動運行

# mysql
docker update mysql --restart=always

# redis
docker update redis --restart=always

2.項目打包部署到Docker

引入Docker依賴

首先在 Maven pom.xml 配置文件中加入 Docker 的 Maven 插件

這裡有兩個插件可以實現我們需要的功能

docker-maven-plugindockerfile-maven

選擇其中一個到maven倉庫搜一個版本引入,我這裡用的第一個,因為它只需要編寫DockerFile就行

Spotify Maven 插件是一個目前比較普遍的選擇。它要求應用程式開發人員編寫Dockerfile,並把Dockerfile放在項目src/main/docker目錄下

			<plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <!-- 指定 Dockerfile 路徑  ${project.basedir}:項目根路徑下-->
                    <dockerDirectory>${project.basedir}</dockerDirectory>
                    <!-- 這裡是複製 jar 包到 docker 容器指定目錄配置 -->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <!--jar 包所在的路徑  此處配置的 即對應 target 目錄-->
                            <directory>${project.build.directory}</directory>
                            <!-- 需要包含的 jar包 ,這裡對應的是 Dockerfile中添加的文件名 -->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>

編寫Dockerfile

Dockerfile是一種被Docker程式解釋的腳本,Dockerfile由一條一條的指令組成,每條指令對應Linux下麵的一條命令。Docker程式將這些Dockerfile指令翻譯真正的Linux命令。Dockerfile有自己書寫格式和支持的命令,Docker程式解決這些命令間的依賴關係,類似於Makefile。Docker程式將讀取Dockerfile,根據指令生成定製的image。有了Dockerfile,當我們需要定製自己額外的需求時,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻煩.

新建Dockerfile放在src/main/docker目錄下(註意file是小寫)

image-20230204213048288

內容如下

#指定基礎鏡像源,以其為基礎進行製作
FROM adoptopenjdk/openjdk8:latest
# 維護者信息
MAINTAINER qhy
#將jar包添加到容器中
ADD xxx.jar xxx.jar
#對外暴露埠
EXPOSE 8080
# 運行jar包 
CMD [java","-jar","xxx.jar"]

註意信息:

ADD 、 COPY 指令用法一樣,唯一不同的是 ADD 支持將歸檔文件(tar, gzip, bzip2, etc)做提取和解壓操作。還有需要註意的是,COPY 指令需要複製的目錄一定要放在 Dockerfile 文件的同級目錄下

ENTRYPOINT 容器啟動後執行的命令,讓容器執行表現的像一個可執行程式一樣,與CMD的區別是不可以被docker run覆蓋,會把docker run後面的參數當作傳遞給ENTRYPOINT指令的參數。Dockerfile中只能指定一個ENTRYPOINT,如果指定了很多,只有最後一個有效。docker run命令的-entrypoint參數可以把指定的參數繼續傳遞給ENTRYPOINT

打包項目

常用的兩種構建方式

  • Dockerfile和jar上傳到伺服器進行構建
  • 利用Maven的Docker打包工具進行應用構建同時推送到遠程倉庫

這裡我選擇的第一種方式。最後會在target目錄下生成jar包

這裡藉助的是springboot提供的maven-plugin這個依賴包.

image-20230204200844816

mvn clean && mvn package
image-20230204000846841

執行package之後耐心等待打包成功

image-20230204000754343

到這之後會在target目錄生成一個jar包.

我們在本地把它運行起來進行訪問測試,確認一切正常

image-20230204175113712

製作鏡像並運行

之前的準備工作做完,最令人期待的部分就來了.

通過XFTP將打包好的jar包和dockerfile上傳到雲伺服器的指定目錄

我這裡傳到了usr/local/src的新建目錄下(目錄下只有jar包和dockerFile)

image-20230204201215559

執行docker build命令,docker就會根據Dockerfile里你定義好的命令進行構建新的鏡像。

  • -t代表要構建的鏡像
  • .代表當前目錄
  • xxx代表鏡像名稱以及標簽

因為Dockerfile我們之前寫好了,所以直接執行命令構建鏡像

docker build -t xxx .

如果構建過程很慢,可以把同步時間配置去掉

image-20230204220601625

查看鏡像

docker images 

image-20230204220540891

指定一個埠運行鏡像

docker run -it -d --name xxxx -p 8080:8080 xxx

基本參數

run:運行的意思
–name: 指定鏡像啟動的之後的名稱
-p: 容器和外部的埠映射 第一個埠:外部 第二個埠:內部
-d: 後臺運行 -t:實時運行,視窗關閉,程式結束。
xxx:鏡像名稱或id,確定你要啟動的是哪一個鏡像

跟蹤查看日誌實時啟動情況

docker logs -f xxx
image-20230204231415321

3.訪問測試

經過之前的一系列折騰,我們已經成功把項目在伺服器上部署完了,接下來只需要到雲伺服器控制台開放埠就完成了.

瀏覽器通過ip+埠號訪問

此外,還可以使用nginx完成反向代理和https配置(需要提前申請並下載SSL證書)就能用自己的功能變數名稱在瀏覽器上進行訪問了.

這裡不是本篇重點,我就不演示了,需要的自行配置即可

image-20230205120531327

大致的效果就是如此

image-20230205125147416

docker run -p 80:80 --name nginx \ 
-v /usr/local/nginx/config/nginx.conf:/etc/nginx/nginx.conf \ 
-v /usr/local/nginx/conf.d:/etc/nginx/conf.d \ 
-v /usr/local/nginx/logs:/var/log/nginx \ 
-v /usr/local/nginx/html:/usr/share/nginx/html \ 
-d nginx

參考文章:

Linux下通過Docker安裝配置Mysql8.0

Linux下通過Docker安裝配置Redis

win10下資料庫快照遷移到Linux(https://blog.csdn.net/sinat_36831355/article/details/107342220)

[Linux安裝Maven]https://www.cnblogs.com/fuzongle/p/12825048.html

[DockerFile編寫]https://www.cnblogs.com/wangmo/p/6811321.html

[Docker安裝Nginx並配置反向代理和SSL證書]https://blog.csdn.net/qq_36252295/article/details/122607203

【整體流程參照】

https://blog.csdn.net/qq_43173523/article/details/106076614

https://blog.csdn.net/qq_33220089/article/details/105104524


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、netty如何解析多協議 前提: 項目地址:https://gitee.com/q529075990qqcom/NB-IOT.git 我們需要一個創建mavne項目,這個項目是我已經寫好的項目,項目結構圖如下: 創建公共模塊 創建子模塊,準備好依賴Netty4.1版本 <dependencies ...
  • 在磁碟上讀寫文件的功能都是由操作系統提供的,現代操作系統不允許普通的程式直接操作磁碟,所以,讀寫文件就是請求操作系統打開一個文件對象(通常稱為文件描述符),然後,通過操作系統提供的介面從這個文件對象中讀取數據(讀文件),或者把數據寫入這個文件對象(寫文件)。 1.讀文件 要以讀文件的模式打開一個文件 ...
  • 註釋 單行註釋:對某一行進行註釋,使用“/註釋內容/”標識 多行註釋:可以書寫多行,使用“/*註釋內容*//”表示 文檔註釋:這個內容對IDEA是有意義的,/**註釋內容*/ public class Hello { //單行註釋 //註釋後會被編譯器忽略,不會作為語句編譯 //每個單行註釋只能寫一 ...
  • 哈嘍兄弟們,今天咱們來學習一下Python字典修改元素的四種方式。 本文中使用的字典對象: smart_girl = {"name":"yuan wai", "age": 25} 第一種方式:[key] smart_girl["age"] = 35 說明:字典中存在key時為修改value、不存在k ...
  • 一、最終效果 遠程開機app下載: 下載鏈接:https://wwp.lanzoup.com/iDR330ml4l2b 提取碼 : dxcg 註意:使用前請按照2.1的步驟設置電腦“ mac地址:填寫自己的mac地址 主機地址:填寫自己的公網ip,百度搜索ip 映射埠:第二點準備工作裡面配置的映射 ...
  • 背景 REST作為一種現代網路應用非常流行的軟體架構風格,自從Roy Fielding博士在2000年他的博士論文中提出來到現在已經有了20年的歷史。它的簡單易用性,可擴展性,伸縮性受到廣大Web開發者的喜愛。 REST 的 API 配合JSON格式的數據交換,使得前後端分離、數據交互變得非常容易, ...
  • 為了方便操作apk 實現app的自動化點擊 封裝了個adb操作類。基本上的操作都有了, 如果配合好C# 程式和模擬器 基本上什麼樣的操作都可以實現。 using System; using System.Collections; using System.Collections.Generic; u ...
  • 在種草了很多天之後,最近終於在淘寶下單了友善 nanoPi R5S。 選擇友善 nanoPi R5S 有兩點主要理由: 1. 自帶 EMMC 存儲,可以使用 RockChip 提供的 MaskRom 模式直接連線燒系統,不依賴 TF 卡(我覺得 TF 卡太累贅了,買普通的又慢又不穩定,對於我這種新手 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...