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
查看docker版本信息
docker version

安裝JDK
耐心等待安裝完成
yum -y install java-1.8.0-openjdk
查找java所在位置
whereis java
配置環境變數
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
安裝Maven
方式有很多種,自己到Maven官網下載上傳到伺服器解壓或者直接wget命令安裝(通過yum安裝weget命令).我這裡選用第一種.
本質上和在win10下安裝沒什麼區別都是下載->解壓->配置鏡像和倉庫->配置環境變數這幾個步驟
下載Maven
Maven官網:
https://maven.apache.org/docs/history.html
下載Linux版本,然後傳到雲伺服器手動解壓安裝
可以直接下載最新版本,但我個人一般習慣往前找幾個版本的,所以繼續往下滑
1.看到標題停下來,它給我們指明瞭更早的版本在哪去找
2.二進位文件就是我們要的,source指的是源碼

3.選擇對應Linux的版本

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

這時候解壓它就行
通過如下命令解壓
tar -zxvf apache-maven-3.6.3-bin.tar.gz
配置鏡像和本地倉庫信息
上面這個就是解壓後的文件夾,只需要配置下國內鏡像地址和本地倉庫位置信息就可以用了。
cd apache-maven-3.6.3 #進入apache-maven-3.6.3目錄
這時候可以新建一個目錄,用作後續修改配置文件,存放maven下載的jar
mkdir repository #創建目錄存放後續maven下載jar包
進入conf目錄,通過vim修改settings.xml,配置鏡像和本地倉庫信息
vim基本操作:
i
:進入編輯模式
esc +!:wq
: 保存並退出
cd conf #進入conf目錄
vim settings.xml #編輯配置文件
配置文件里我們只關心mirrors根節點下的鏡像和localRepository根節點下的本地倉庫位置
本地倉庫:解除註釋,把位置改成之前自己創建的倉庫目錄的完整路徑
<localRepository>/usr/local/apache-maven-3.6.3/repository</localRepository>
鏡像地址:註意name和url這些不要搞錯了

<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
修改完以上的兩處,保存並退出就行。
配置環境變數
接下來是,依舊是配置環境變數
vim /etc/profile
編輯/etc/profile 文件,系統環境變數都在這配置
export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin
刷新配置文件:
source /etc/profile
查看Maven版本信息
mvn -v
以下的Mysql和Redis的安裝只是因為我的項目用到了,如果只是自己體驗整個部署流程的話不需要安裝
安裝Mysql
到DockerHub找一個mysql鏡像,我這裡用的mysql8
https://hub.docker.com/_/mysql
到tags下搜索,然後複製命令拉取鏡像就行
- 拉取鏡像
docker pull mysql:8.0
- 查看鏡像
docker images
這裡DockerHub官方也給了關於如何使用和連接的指南
- 創建並修改配置文件
創建兩個文件夾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
- 啟動並運行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
參數說明
-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 :用於容器與主機之間的數據拷貝
安裝Redis
拉取鏡像
https://registry.hub.docker.com/_/redis
因為我的項目里用到GEO命令,所以要拉取6.2以上的版本
docker pull redis:6.2.7
- 創建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就可以了,再次執行以上命令,容器啟動成功。
- 啟動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-plugin
和dockerfile-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是小寫)

內容如下
#指定基礎鏡像源,以其為基礎進行製作
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這個依賴包.
mvn clean && mvn package

執行package之後耐心等待打包成功
到這之後會在target目錄生成一個jar包.
我們在本地把它運行起來進行訪問測試,確認一切正常

製作鏡像並運行
之前的準備工作做完,最令人期待的部分就來了.
通過XFTP將打包好的jar包和dockerfile上傳到雲伺服器的指定目錄
我這裡傳到了usr/local/src的新建目錄下(目錄下只有jar包和dockerFile)

執行docker build命令,docker就會根據Dockerfile里你定義好的命令進行構建新的鏡像。
- -t代表要構建的鏡像
- .代表當前目錄
- xxx代表鏡像名稱以及標簽
因為Dockerfile我們之前寫好了,所以直接執行命令構建鏡像
docker build -t xxx .
如果構建過程很慢,可以把同步時間配置去掉
查看鏡像
docker images
指定一個埠運行鏡像
docker run -it -d --name xxxx -p 8080:8080 xxx
基本參數
run:運行的意思
–name: 指定鏡像啟動的之後的名稱
-p: 容器和外部的埠映射 第一個埠:外部 第二個埠:內部
-d: 後臺運行 -t:實時運行,視窗關閉,程式結束。
xxx:鏡像名稱或id,確定你要啟動的是哪一個鏡像
跟蹤查看日誌實時啟動情況
docker logs -f xxx

3.訪問測試
經過之前的一系列折騰,我們已經成功把項目在伺服器上部署完了,接下來只需要到雲伺服器控制台開放埠就完成了.
瀏覽器通過ip+埠號訪問
此外,還可以使用nginx完成反向代理和https配置(需要提前申請並下載SSL證書)就能用自己的功能變數名稱在瀏覽器上進行訪問了.
這裡不是本篇重點,我就不演示了,需要的自行配置即可

大致的效果就是如此
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
參考文章:
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