docker部署java項(xiàng)目的詳細(xì)步驟
docker部署java項(xiàng)目步驟
在平常的開發(fā)工作中,我們經(jīng)常需要部署項(xiàng)目,開發(fā)測試完成后,最關(guān)鍵的一步就是部署。
今天我們以若依項(xiàng)目為例,總結(jié)下部署項(xiàng)目的整體流程。
簡單來說:
- 第一步:安裝項(xiàng)目所需的中間件;
- 第二步:將項(xiàng)目打包成 jar 包;
- 第三步:編寫 Dockerfile 文件,構(gòu)建鏡像;
- 第四步:編寫 docker-compose.yml 文件;
- 第五步:編寫 nginx.conf 文件;
- 第六步:啟動(dòng)項(xiàng)目,進(jìn)行測試;
1:安裝項(xiàng)目所需中間件
項(xiàng)目部署依賴的中間件,如數(shù)據(jù)庫 mysql 、緩存 redis、負(fù)載均衡 nginx 等,這些中間件的安裝就不在這兒一 一贅述了。如果有不清楚的小伙伴,可以看我之前寫的幾篇文章,如下:
- 安裝 mysql:docker之安裝mysql教程
- 安裝 redis:docker之安裝redis教程
- 安裝 nginx:docker之安裝nginx的教程
2:將項(xiàng)目打成 jar 包
部署不同的環(huán)境,需要選擇不同的配置文件,部署測試環(huán)境一般選擇 application-test.yml 文件打包,部署生產(chǎn)環(huán)境一般選擇 application-prod.yml 文件。
打 jar 包時(shí)一定注意本地修改不需要提交的配置,先回滾,然后拉取最新的代碼,點(diǎn)擊 maven clean,然后點(diǎn)擊 package 打包,打包完后在 target 目錄。將 jar 包上傳到服務(wù)器指定的目錄。
注意:
比如在服務(wù)器上新建一個(gè) /docker/ruoyi/ 的目錄,那么 jar 包放在這個(gè)目錄下,在這個(gè)目錄下再新建 Dockerfile 文件 和 docker-compose.yml 文件
如下所示:

3:編寫 Dockerfile 文件,構(gòu)建鏡像
Dockerfile文件示例:
# 使用OpenJDK 17基礎(chǔ)鏡像
FROM openjdk:17
# 創(chuàng)建一個(gè)名為/ruoyi/logs的目錄
RUN mkdir -p /ruoyi/logs
# 切換工作目錄
WORKDIR /ruoyi
# 配置環(huán)境變量
ENV SERVER_PORT=8008 \
LANG=C.UTF-8 \
LC_ALL=C.UTF-8
# 暴露應(yīng)用端口
EXPOSE 8008
# 添加應(yīng)用Jar包到容器中
ADD ruoyi-admin.jar ./app.jar
# 設(shè)置啟動(dòng)命令
ENTRYPOINT ["java", \
"-Dserver.port=${SERVER_PORT}", \
"-Xlog:gc*:time,tags,level", \
"-XX:+UseZGC", \
"-jar", "app.jar"]Dockerfile文件內(nèi)容釋義:
1):FROM openjdk:17: 使用OpenJDK 17基礎(chǔ)鏡像
2):RUN mkdir -p /ruoyi/logs:創(chuàng)建一個(gè)名為/ruoyi/logs的目錄,即日志目錄
3):WORKDIR /ruoyi:切換工作目錄
4):ENV SERVER_PORT=8008 \
LANG=C.UTF-8 \ LC_ALL=C.UTF-8
配置環(huán)境變量,Docker 鏡像構(gòu)建時(shí)設(shè)置了三個(gè)環(huán)境變量,分別是服務(wù)端口和字符編碼相關(guān)的環(huán)境變量,LANG=C.UTF-8 和 LC_ALL=C.UTF-8:這兩個(gè)環(huán)境變量用于設(shè)置字符編碼和語言環(huán)境,\ 末尾的反斜杠 \ 是行延續(xù)符,表示下一行是當(dāng)前命令的延續(xù)
5):EXPOSE 8008:暴露8008端口
6):ADD ruoyi-admin.jar ./app.jar:
添加應(yīng)用Jar包到容器中,ADD:這是 Dockerfile 里用于復(fù)制文件和目錄的指令,ruoyi-admin.jar:這是位于宿主機(jī)上的源文件路徑,./app.jar:這是目標(biāo)路徑,指定將源文件復(fù)制到 Docker 鏡像中的位置和文件名。./ 表示鏡像中的當(dāng)前 # 工作目錄,將源文件 ruoyi-admin.jar 復(fù)制到鏡像的當(dāng)前工作目錄下,并命名為 app.jar
7):
ENTRYPOINT ["java", \
"-Dserver.port=${SERVER_PORT}", \
"-Xlog:gc*:time,tags,level", \
"-XX:+UseZGC", \
"-jar", "app.jar"]- a:ENTRYPOINT 關(guān)鍵字:這是 Dockerfile 里用來定義容器啟動(dòng)命令的指令。
- b:"java":表明要執(zhí)行的是 Java 虛擬機(jī)。
- c:"-Dserver.port=${SERVER_PORT}":設(shè)置 Java 虛擬機(jī)的系統(tǒng)屬性。server.port 通常用于指定 Spring Boot 應(yīng)用程序監(jiān)聽的端口,#${SERVER_PORT} 是一個(gè)環(huán)境變量引用,其值在之前的 ENV 指令中設(shè)置為 8008,這意味著應(yīng)用程序會(huì)監(jiān)聽 8008 端口。
- d:"-Xlog:gc*:time,tags,level":開啟 Java 垃圾回收(GC)日志記錄功能。gc* 表示記錄所有與垃圾回# 收相關(guān)的事件,time,tags,level 表示日志中要包含時(shí)間、事件標(biāo)簽和日志級(jí)別等信息。
- e:"-XX:+UseZGC":啟用 Z Garbage Collector(ZGC),這是 Java 11 及以上版本引入的一種可擴(kuò)展的低# 延遲垃圾回收器,能顯著減少垃圾回收停頓時(shí)間。
- f:"-jar":告訴 Java 虛擬機(jī)要執(zhí)行一個(gè) JAR 包,"app.jar":指定要執(zhí)行的 JAR 包名稱,這個(gè) JAR 包是之前使用 ADD 或 COPY 指令復(fù)制到鏡像中的。
編寫完 Dockerfile 文件后,這個(gè)時(shí)候就可以構(gòu)建鏡像了,命令:docker build -t 鏡像名稱:鏡像版本 . ,如 docker build -t ruoyi:v1.0 . 注意版本后面有個(gè) 空格 點(diǎn)。使用點(diǎn) . :表示使用當(dāng)前目錄下的 Dockerfile,如果不加這個(gè)點(diǎn),Docker 不會(huì)知道從哪里獲取 Dockerfile。鏡像構(gòu)建完成后,可以使用 docker images 查看生成的鏡像:

4:編寫 docker-compose.yml 文件
docker-compose.yml 文件示例:
services:
ruoyi-admin:
image: ruoyi-admin:v1.0
container_name : ruoyi-admin
environment:
- SERVER_PORT=8008
# 可選,Java 啟動(dòng)參數(shù)
- JAVA_OPTS="-Xmx2g -Xms2g"
- TZ=Asia/Shanghai
restart: always
network_mode: "host"docker-compose.yml 文件內(nèi)容釋義:
1):image: ruoyi-admin:v1.0:服務(wù)會(huì)使用ruoyi-admin:v1.0鏡像來創(chuàng)建容器
2):container_name:容器名稱
3):SERVER_PORT=8008:定義環(huán)境變量
4):- JAVA_OPTS="-Xmx2g -Xms2g":可選參數(shù),-Xmx用來設(shè)定 JVM 堆內(nèi)存的最大使用量;-Xms用于設(shè)置 JVM 堆內(nèi)存的初始使用量。JAVA_OPTS="-Xmx2g -Xms2g" 把 JVM 堆內(nèi)存的初始大小和最大大小都設(shè)置為 2GB。這么做可以避免在應(yīng)用程序運(yùn)行過程中頻繁進(jìn)行堆內(nèi)存的擴(kuò)容和縮容操作,從而提升性能。不過,設(shè)置時(shí)要依據(jù)應(yīng)用程序的實(shí)際內(nèi)存需求和服務(wù)器的可用內(nèi)存來合理調(diào)整,防止出現(xiàn)內(nèi)存不足或者浪費(fèi)的情況。
5):- TZ=Asia/Shanghai:把容器內(nèi)的時(shí)區(qū)指定為 Asia/Shanghai(即上海所在的時(shí)區(qū),也就是中國標(biāo)準(zhǔn)時(shí)間,UTC+8)。這樣容器內(nèi)運(yùn)行的應(yīng)用程序所顯示和處理的時(shí)間會(huì)UTC+8時(shí)區(qū)處理。
6):restart: always:為容器指定了一種重啟策略,確保容器在各種情況下都能盡可能保持運(yùn)行狀態(tài)。當(dāng)容器由于各種原因(如正常退出、異常崩潰、宿主機(jī)重啟等)停止運(yùn)行時(shí),Docker 會(huì)依據(jù)此策略自動(dòng)嘗試重啟容器。除了always,還有其他幾種重啟策略:
no:默認(rèn)策略,容器停止后不會(huì)自動(dòng)重啟。on-failure:只有當(dāng)容器以非零退出碼退出時(shí),Docker 才會(huì)嘗試重啟它。可以通過 on-failure: N 的形式指定最多重啟 N 次。unless-stopped:容器停止后,除非手動(dòng)停止(如使用 docker stop 命令),否則 Docker 會(huì)在 Docker 守護(hù)進(jìn)程重啟或宿主機(jī)重啟后自動(dòng)重啟容器。
7):network_mode: "host":指定容器使用宿主機(jī)的網(wǎng)絡(luò),即容器直接使用宿主機(jī)的網(wǎng)絡(luò)接口,而非創(chuàng)建獨(dú)立的 Docker 網(wǎng)絡(luò)。
5:配置 nginx.conf
nginx.conf 文件示例:
user nginx;
worker_processes auto;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 60;
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
proxy_pass http://localhost:8008;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}6:啟動(dòng)項(xiàng)目,測試
1):進(jìn)入 /doker/ruoyi/ 目錄下,即 docker-compose.yml 文件目錄,使用 docker compose up -d 命令啟動(dòng)容器,啟動(dòng)完成后可以使用 docker ps 命令查看啟動(dòng)的容器,信息如下:

使用 docker logs -f 容器id 查看啟動(dòng)日志,啟動(dòng)成功:

2):訪問系統(tǒng),nginx 配置監(jiān)聽 80 端口,所以訪問地址為:http:ip地址:80,訪問成功,頁面如下:

可能會(huì)遇到的問題:項(xiàng)目啟動(dòng)成功,訪問失敗,可以查看項(xiàng)目端口是否因沒開防火墻導(dǎo)致無法訪問。如果是,解決步驟如下:
1):查看防火墻開的端口:firewall-cmd --zone=public --list-ports
2):若端口未開,則添加,比如開放 8008 端口:firewall-cmd --zone=public --add-port=8008/tcp --permanent
3):修改完成后,重啟防火墻:firewall-cmd --reload
以上為 docker 部署項(xiàng)目的基本步驟。
主要是Dockerfile文件的編寫,第一次構(gòu)建鏡像比較慢,因?yàn)橐螺d依賴的基礎(chǔ)鏡像,只需耐心等待即可。
Dockerfile文件有問題,會(huì)導(dǎo)致構(gòu)建鏡像失敗。構(gòu)建完成后,可以使用 docker images 查看構(gòu)建的鏡像。
啟動(dòng)容器可以直接使用 docker run 命令后面跟啟動(dòng)參數(shù)啟動(dòng),這樣做不好的地方每次啟動(dòng)項(xiàng)目,都要輸入一 長串命令,不便于使用,在docker-compose.yml文件里面編寫啟動(dòng)命令,可以更好的管理啟動(dòng)命令,所以推薦使用docker-compose.yml文件方式。
在項(xiàng)目目錄使用 docker compose up -d 命令啟動(dòng)就可以,docker compose up -d,帶上 -d 是非阻塞的,不阻塞當(dāng)前的命令窗口。使用 docker logs -f 容器id 或者 容器名稱 可以查看啟動(dòng)日志。
總結(jié)
僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker如何解決tomcat容器啟動(dòng)成功,無法訪問的問題
這篇文章主要介紹了Docker如何解決tomcat容器啟動(dòng)成功,無法訪問的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
如何使用Docker和cpolar在Linux服務(wù)器上搭建DashDot監(jiān)控面板
本文主要介紹如何在Linux服務(wù)器上使用Docker和cpolar技術(shù)搭建DashDot監(jiān)控面板,實(shí)現(xiàn)實(shí)時(shí)服務(wù)器監(jiān)控,DashDot提供直觀的監(jiān)控界面和豐富的指標(biāo),通過cpolar可以實(shí)現(xiàn)公網(wǎng)訪問,方便用戶隨時(shí)了解服務(wù)器狀態(tài),文章詳細(xì)說明了環(huán)境準(zhǔn)備、安裝Docker、配置DashDot和cpolar的步驟2024-09-09
如何使用docker創(chuàng)建minio鏡像并上傳文件并提供demo
這篇文章主要介紹了使用docker創(chuàng)建minio鏡像并上傳文件,提供demo,minio還是很方便的,從部署到使用,都可以非??焖俚拇罱?而且比較穩(wěn)定,需要的朋友可以參考下2023-09-09
-bash:?docker-compose未找到命令的解決方案
這篇文章主要介紹了-bash:?docker-compose:?未找到命令,需要的朋友可以參考下2023-12-12
Docker?容器跨主機(jī)通信?overlay的詳細(xì)步驟
Overlay網(wǎng)絡(luò)通過VXLAN技術(shù)創(chuàng)建虛擬網(wǎng)絡(luò),實(shí)現(xiàn)不同主機(jī)上容器的邏輯連接,支持跨主機(jī)通信,具有擴(kuò)展性、隔離性和靈活性,適用于大規(guī)模容器化部署2024-10-10
Docker自定義JDK鏡像并拉取至阿里云鏡像倉庫超詳細(xì)攻略
Docker倉庫是集中存放鏡像的地方,分為公共倉庫和私有倉庫,這篇文章主要給大家介紹了關(guān)于Docker自定義JDK鏡像并拉取至阿里云鏡像倉庫的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08

