docker下載運行java項目的實現(xiàn)步驟
核心常用參數(shù)(開發(fā) / 生產(chǎn)高頻)
| 參數(shù) | 作用 | 示例 |
|---|---|---|
| -it | 分配偽終端并保持標準輸入打開,實現(xiàn)交互模式(如進入容器終端) | docker run -it ubuntu:20.04 /bin/bash |
| -d | 后臺運行容器(守護進程模式),不占用當前終端 | docker run -d nginx:1.25 |
| --name | 為容器自定義名稱(默認是隨機字符串),方便管理 | docker run -d --name my-nginx nginx |
| -p | 端口映射(宿主機端口:容器內(nèi)端口),實現(xiàn)外部訪問容器 | docker run -d -p 8080:80 nginx |
| -v | 數(shù)據(jù)卷掛載(宿主機路徑:容器內(nèi)路徑),實現(xiàn)數(shù)據(jù)持久化 / 文件共享 | docker run -d -v /host/html:/usr/share/nginx/html nginx |
| -e | 設(shè)置容器內(nèi)的環(huán)境變量 | docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0 |
| --network | 指定容器接入的 Docker 網(wǎng)絡(luò),實現(xiàn)容器間網(wǎng)絡(luò)互通 | docker run -d --network app-network mysql:8.0 |
| --restart | 容器重啟策略(如 always 異常退出自動重啟),適合生產(chǎn)環(huán)境 | docker run -d --restart always nginx |
| --rm | 容器停止后自動刪除,適合臨時測試的容器 | docker run --rm -it ubuntu /bin/bash |
一、基礎(chǔ)場景:運行 Java JAR 包項目
在 JAR 包同級目錄下創(chuàng)建名為 Dockerfile 的文件(無后綴),內(nèi)容如下(分基礎(chǔ)版和指定 JDK 版本版):
步驟 1:基礎(chǔ)版(使用官方 OpenJDK 鏡像,自動適配)
# 1. 選擇基礎(chǔ)鏡像:使用官方 OpenJDK 的 JRE 鏡像(輕量,僅運行環(huán)境) FROM openjdk:8-jre-slim # 若項目用 Java 11,改為 openjdk:11-jre-slim;Java 17 改為 openjdk:17-jre-slim # 2. 維護者信息(可選) MAINTAINER yourname <yourname@example.com> # 3. 創(chuàng)建容器內(nèi)目錄,用于存放 JAR 包 WORKDIR /app # 4. 將本地的 JAR 包復制到容器內(nèi)的 /app 目錄下,并重命名為 app.jar(簡化名稱) COPY demo-0.0.1-SNAPSHOT.jar /app/app.jar # 5. 暴露項目的端口(如 Spring Boot 項目的 8080 端口,僅聲明,不實際映射) EXPOSE 8080 # 6. 容器啟動時執(zhí)行的命令:運行 JAR 包 ENTRYPOINT ["java", "-jar", "/app/app.jar"]
步驟 2:指定具體 JDK 版本(如國產(chǎn)龍蜥 / 華為鏡像,適配國產(chǎn)化)
若需要指定更精細的 JDK 版本,或使用國產(chǎn)鏡像:
# 使用阿里云的 OpenJDK 鏡像(國內(nèi)速度快) FROM registry.cn-hangzhou.aliyuncs.com/acs/openjdk:8-jre WORKDIR /app COPY demo-0.0.1-SNAPSHOT.jar /app/app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app/app.jar"]
步驟 3:構(gòu)建 Docker 鏡像
在 Dockerfile 所在目錄執(zhí)行構(gòu)建命令,<image-name> 為鏡像名稱(如 java-demo),<tag> 為版本(如 v1.0):
docker build -t <image-name>:<tag> . # 示例:docker build -t java-demo:v1.0 .
- 命令末尾的
.表示當前目錄是構(gòu)建上下文(Docker 會讀取該目錄下的文件)。 - 構(gòu)建完成后,執(zhí)行
docker images可看到新創(chuàng)建的鏡像。
步驟 4:啟動 Docker 容器
通過鏡像啟動容器,映射端口(容器內(nèi) 8080 → 宿主機 8080),并命名容器(可選):
docker run -d -p 8080:8080 --name <container-name> <image-name>:<tag> # 示例:docker run -d -p 8080:8080 --name my-java-app java-demo:v1.0
- 參數(shù)說明:
-d:后臺運行容器(守護進程模式)。-p 宿主機端口:容器端口:端口映射(關(guān)鍵,外部通過宿主機端口訪問)。--name:給容器命名,方便管理。
步驟 5:驗證運行結(jié)果
- 查看容器狀態(tài):
docker ps(若顯示容器為Up狀態(tài),說明啟動成功)。 - 訪問項目:瀏覽器 / Postman 訪問
http://宿主機IP:8080(如本地則http://localhost:8080)。 - 查看容器日志:
docker logs <container-name>(排查啟動失敗問題)。
二、進階場景:運行 Java WAR 包項目
適用于傳統(tǒng) Java Web 項目(如 SSH/SSM),打包為 WAR 包,需部署到 Tomcat 容器。
步驟 1:準備 WAR 包
將項目打包為 demo.war,放在本地目錄(如 ~/java-war-docker/)。
步驟 2:編寫 Dockerfile
使用官方 Tomcat 鏡像作為基礎(chǔ)鏡像,將 WAR 包復制到 Tomcat 的 webapps 目錄:
# 1. 選擇官方 Tomcat 鏡像(內(nèi)置 JRE,可指定版本) FROM tomcat:8.5-jre8-slim # 若用 Tomcat 9,改為 tomcat:9-jre11-slim # 2. 維護者信息(可選) MAINTAINER yourname <yourname@example.com> # 3. 刪除 Tomcat 自帶的默認項目(可選,清理無用文件) RUN rm -rf /usr/local/tomcat/webapps/* # 4. 將本地 WAR 包復制到 Tomcat 的 webapps 目錄 COPY demo.war /usr/local/tomcat/webapps/ROOT.war # 重命名為 ROOT.war,訪問時無需加項目名 # 5. 暴露 Tomcat 端口(默認 8080) EXPOSE 8080 # 6. 啟動 Tomcat(Tomcat 鏡像默認入口命令就是啟動腳本,可省略) CMD ["catalina.sh", "run"]
步驟 3:構(gòu)建并啟動容器
# 構(gòu)建鏡像 docker build -t java-war-demo:v1.0 . # 啟動容器 docker run -d -p 8080:8080 --name my-war-app java-war-demo:v1.0
步驟 4:驗證
訪問 http://宿主機IP:8080,即可訪問 WAR 包項目(因 WAR 包重命名為 ROOT.war,無需加項目上下文路徑)。
三、優(yōu)化 Docker 鏡像(減小體積 + 提升安全性)
上述基礎(chǔ)鏡像(如 openjdk:8-jre-slim)雖已輕量化,但可進一步優(yōu)化:
1. 使用更小的基礎(chǔ)鏡像(Alpine 版本)
Alpine 是輕量級 Linux 發(fā)行版,鏡像體積僅幾 MB:
# Java 8 Alpine 鏡像(體積約 80MB,而 slim 版本約 200MB) FROM openjdk:8-jre-alpine # Alpine 缺少時區(qū)依賴,需手動安裝(解決項目時區(qū)問題) RUN apk add --no-cache tzdata ENV TZ=Asia/Shanghai # 設(shè)置時區(qū)為上海 WORKDIR /app COPY demo-0.0.1-SNAPSHOT.jar /app/app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app/app.jar"]
2. 非 root 用戶運行容器(提升安全性)
默認容器以 root 用戶運行,存在安全風險,可創(chuàng)建普通用戶:
FROM openjdk:8-jre-alpine # 創(chuàng)建普通用戶 appuser RUN addgroup -S appgroup && adduser -S appuser -G appgroup # 切換到普通用戶 USER appuser WORKDIR /app COPY demo-0.0.1-SNAPSHOT.jar /app/app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app/app.jar"]
3. 分層構(gòu)建(分離編譯和運行環(huán)境)
適用于需要在容器內(nèi)編譯項目的場景(如源碼打包),使用多階段構(gòu)建減小鏡像體積:
# 第一階段:編譯階段(使用帶 JDK 的鏡像,打包源碼) FROM maven:3.8.5-openjdk-8 AS builder WORKDIR /src COPY pom.xml . COPY src ./src # 執(zhí)行 maven 打包(跳過測試) RUN mvn clean package -DskipTests # 第二階段:運行階段(僅使用 JRE 鏡像,復制編譯后的 JAR 包) FROM openjdk:8-jre-alpine WORKDIR /app # 從編譯階段復制 JAR 包到運行階段 COPY --from=builder /src/target/demo-0.0.1-SNAPSHOT.jar /app/app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app/app.jar"]
四、常見問題排查
- 容器啟動后立即退出:查看日志
docker logs <容器名>,大概率是 JAR 包路徑錯誤、端口被占用或項目代碼異常。 - 外部無法訪問項目:檢查宿主機防火墻是否開放端口,或 Docker 端口映射是否正確(
-p參數(shù))。 - 時區(qū)問題:項目中時間顯示錯誤,需在 Dockerfile 中設(shè)置時區(qū)(如 Alpine 鏡像安裝
tzdata并指定TZ環(huán)境變量)。 - 鏡像構(gòu)建緩慢:使用國內(nèi)鏡像源(如阿里云 Docker 鏡像加速器),或更換基礎(chǔ)鏡像為國內(nèi)倉庫(如阿里云的 OpenJDK/Tomcat 鏡像)。
通過以上步驟,即可完成 Java 項目的 Docker 容器化部署,適配絕大多數(shù) Java 項目場景。
五、jdk下載失敗問題
方式一:手動下載官方 OpenJDK 17 壓縮包(通用所有 Linux 發(fā)行版)
這是最通用的安裝方式,不受發(fā)行版限制,可精準控制安裝路徑和版本。
一、選擇下載源并獲取 JDK 17 壓縮包
推薦從 OpenJDK 官方鏡像 或 Adoptium(Eclipse Temurin) 下載(Adoptium 提供穩(wěn)定的 OpenJDK 發(fā)行版,更推薦)。
- 打開終端,進入下載目錄(如
/usr/local/src):cd /usr/local/src
- 下載 OpenJDK 17 壓縮包(以 Adoptium 的 Temurin 17 為例,適配 x86_64 架構(gòu)):
# 下載 x86_64 架構(gòu)的 Temurin 17 最新版(Linux tar.gz 包) wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.11%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.11_9.tar.gz
- 若需其他架構(gòu)(如 aarch64/ARM)或版本,可訪問 Adoptium 官網(wǎng) 復制對應下載鏈接。
- 若沒有
wget,可先安裝:apt install wget(Debian/Ubuntu)或yum install wget(CentOS/RHEL)。 - 實在下載不了就外部下載了再傳到linux
二、編寫 Dockerfile
創(chuàng)建 Dockerfile 文件,內(nèi)容分為基礎(chǔ)鏡像選擇、JDK 解壓配置、項目運行三個部分,核心是將本地 JDK 包復制到容器并配置環(huán)境變量。
# 1. 選擇基礎(chǔ) Linux 鏡像(以輕量的 CentOS 7 為例,也可用 alpine) FROM centos:7 # 2. 維護者信息(可選) MAINTAINER yourname <yourname@example.com> # 3. 創(chuàng)建JDK安裝目錄,將本地JDK包復制到容器內(nèi)并解壓 RUN mkdir -p /usr/local/jdk COPY jdk-8u361-linux-x64.tar.gz /usr/local/jdk/ RUN cd /usr/local/jdk && tar -zxvf jdk-8u361-linux-x64.tar.gz && rm -rf jdk-8u361-linux-x64.tar.gz # 4. 配置JDK環(huán)境變量(容器內(nèi)生效) ENV JAVA_HOME=/usr/local/jdk/jdk1.8.0_361 # 解壓后的JDK實際目錄 ENV JRE_HOME=$JAVA_HOME/jre ENV CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib ENV PATH=$JAVA_HOME/bin:$PATH # 5. 創(chuàng)建項目目錄,復制Java項目JAR包到容器內(nèi) RUN mkdir -p /app COPY demo-0.0.1-SNAPSHOT.jar /app/app.jar # 6. 暴露項目端口(如Spring Boot的8080端口) EXPOSE 8080 # 7. 容器啟動時運行JAR包 ENTRYPOINT ["java", "-jar", "/app/app.jar"]
關(guān)鍵說明:
- 若使用 Alpine 基礎(chǔ)鏡像(更輕量),需替換
FROM centos:7為FROM alpine:3.18,并添加RUN apk add --no-cache tar(Alpine 默認無tar解壓工具)。 - 若使用國產(chǎn) JDK(如華為畢昇 JDK、阿里 Dragonwell),只需替換本地 JDK 包,解壓路徑和環(huán)境變量配置邏輯不變。
三、構(gòu)建 Docker 鏡像
在項目目錄(java-docker/)下執(zhí)行構(gòu)建命令,指定鏡像名稱和標簽:
docker build -t custom-jdk-java:v1.0 .
-t custom-jdk-java:v1.0:給鏡像命名為custom-jdk-java,版本為v1.0。- 末尾的
.:表示 Docker 構(gòu)建上下文為當前目錄(會讀取目錄下的 JDK 包、JAR 包和 Dockerfile)。
構(gòu)建過程中,Docker 會依次執(zhí)行 Dockerfile 中的指令:復制 JDK 包 → 解壓 → 配置環(huán)境 → 復制項目 JAR 包。構(gòu)建完成后,執(zhí)行 docker images 可看到新創(chuàng)建的鏡像。
四、啟動 Docker 容器
通過構(gòu)建好的鏡像啟動容器,映射宿主機端口到容器端口(如 8080):
# 后臺啟動容器,端口映射 宿主機8080 → 容器8080,命名為my-java-app docker run -d -p 8080:8080 --name my-java-app custom-jdk-java:v1.0
常用參數(shù)補充:
-v /host/logs:/app/logs:若項目有日志輸出到容器內(nèi)/app/logs,可通過數(shù)據(jù)卷掛載到宿主機/host/logs,實現(xiàn)日志持久化。--restart always:配置容器異常退出時自動重啟(生產(chǎn)環(huán)境推薦)docker run -d -p 8080:8080 -v /host/logs:/app/logs --restart always --name my-java-app custom-jdk-java:v1.0
五、驗證運行結(jié)果
- 查看容器狀態(tài):執(zhí)行
docker ps,若容器狀態(tài)為Up,說明啟動成功。 - 訪問項目:瀏覽器 / Postman 訪問
http://宿主機IP:8080,即可訪問 Java 項目。 - 查看容器日志:若啟動失敗,通過日志排查問題:
docker logs my-java-app # 查看日志 docker logs -f my-java-app # 實時跟蹤日志
六、優(yōu)化方案(可選)
制作自定義 JDK 基礎(chǔ)鏡像:若多個 Java 項目需要相同的自定義 JDK 環(huán)境,可先構(gòu)建僅包含 JDK 的基礎(chǔ)鏡像,后續(xù)項目直接基于該鏡像構(gòu)建,避免重復解壓配置 JDK:
# 構(gòu)建自定義JDK基礎(chǔ)鏡像的Dockerfile FROM centos:7 RUN mkdir -p /usr/local/jdk COPY jdk-8u361-linux-x64.tar.gz /usr/local/jdk/ RUN cd /usr/local/jdk && tar -zxvf jdk-8u361-linux-x64.tar.gz && rm -rf *.tar.gz ENV JAVA_HOME=/usr/local/jdk/jdk1.8.0_361 ENV PATH=$JAVA_HOME/bin:$PATH # 構(gòu)建命令:docker build -t custom-jdk8:v1.0 .
后續(xù)項目的 Dockerfile 可直接引用該基礎(chǔ)鏡像:
dockerfile
FROM custom-jdk8:v1.0 # 引用自定義JDK基礎(chǔ)鏡像 RUN mkdir -p /app COPY demo-0.0.1-SNAPSHOT.jar /app/app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app/app.jar"]
精簡鏡像體積:使用
alpine基礎(chǔ)鏡像替代centos,并通過jlink工具制作精簡版 JRE(僅保留項目所需的 Java 模塊),可將鏡像體積從幾百 MB 壓縮到幾十 MB。
七、常見問題排查
- JDK 解壓路徑錯誤:檢查 Dockerfile 中
JAVA_HOME的路徑是否與容器內(nèi)解壓后的 JDK 目錄一致(可通過docker exec -it 容器ID /bin/bash進入容器查看)。 - 容器啟動后立即退出:查看日志
docker logs 容器名,大概率是 JAR 包路徑錯誤、端口被占用或項目代碼異常。 - 外部無法訪問項目:檢查宿主機防火墻是否開放端口,或 Docker 端口映射是否正確(
-p參數(shù))。 - JDK 包復制失敗:確保 JDK 包在 Docker 構(gòu)建上下文目錄內(nèi),且文件名與 Dockerfile 中一致。
八、進入運行中的容器(狀態(tài)為 Up)
使用docker exec進入交互終端(推薦)
exec 是 Docker 官方推薦的進入容器的方式,會在容器內(nèi)啟動一個新的 shell 進程,不影響容器原有進程,退出后容器仍正常運行。
# 通用Linux鏡像(CentOS/Ubuntu)用 /bin/bash docker exec -it cad120a3ea47 /bin/bash # 若容器是Alpine系統(tǒng)(輕量Linux),需替換為 /bin/sh docker exec -it cad120a3ea47 /bin/sh # 先停止容器 docker stop <容器名或ID> # 刪除容器 docker rm <容器名或ID> # 重新運行 docker run [參數(shù)] <鏡像> # 重命名鏡像 # 用原長名稱作為標識 docker tag registry.cn-hangzhou.aliyuncs.com/my-namespace/very-long-app-name:v1 myapp:v1 # 也可以用鏡像ID作為標識(更快捷) docker tag 8f9b89f23768 myapp:v1 # 刪除之前長鏡像(不能通過id刪除,因為重命名的鏡像id都是同一個) docker rmi registry.cn-hangzhou.aliyuncs.com/my-namespace/very-long-app-name:v1
參數(shù)說明:
-i:保持標準輸入打開,實現(xiàn)交互。-t:為容器分配一個偽終端。cad120a3ea47:容器 ID(也可使用容器名,如my-java-app)。
執(zhí)行后,終端提示符會變成容器內(nèi)的格式(如 root@cad120a3ea47:/#),表示已成功進入容器,可執(zhí)行任意 Linux 命令(如查看環(huán)境變量、修改文件等)。
九、jar包替換
當容器啟動后,Java 項目的 JAR 包需要頻繁修改替換時,無需重新構(gòu)建鏡像或重啟容器(可選輕量重啟),核心思路是通過Docker 數(shù)據(jù)卷掛載將宿主機的 JAR 包目錄映射到容器內(nèi),替換宿主機的 JAR 包后,重啟容器內(nèi)的 Java 進程即可生效。以下是兩種主流方案,按「便捷性」和「規(guī)范性」劃分,適配不同場景:
方案一:數(shù)據(jù)卷掛載(推薦,最便捷)
這是生產(chǎn) / 測試環(huán)境最常用的方式,提前將宿主機的 JAR 包目錄掛載到容器內(nèi)的 JAR 包路徑,后續(xù)只需替換宿主機的 JAR 包,重啟容器 / 進程即可生效,無需重新構(gòu)建鏡像。
步驟 1:啟動容器時掛載數(shù)據(jù)卷
在docker run命令中通過-v參數(shù)將宿主機 JAR 包目錄映射到容器內(nèi) JAR 包所在目錄。假設(shè):
- 宿主機 JAR 包存放路徑:
/opt/java-projects/demo.jar - 容器內(nèi) JAR 包運行路徑:
/app/app.jar
啟動容器的命令:
# 后臺啟動容器,掛載宿主機JAR包到容器內(nèi),同時映射端口 docker run -d -p 8080:8080 \ --name my-java-app \ -v /opt/java-projects/demo.jar:/app/app.jar \ # 掛載單個JAR包 custom-jdk-java:v1.0 # 你的鏡像名
進階:掛載整個目錄(更適合頻繁替換)若需替換多個文件(如配置文件 + JAR 包),可掛載整個目錄:
docker run -d -p 8080:8080 \ --name my-java-app \ -v /opt/java-projects/:/app/ # 宿主機目錄 → 容器目錄 custom-jdk-java:v1.0
此時容器內(nèi)/app/目錄會同步宿主機/opt/java-projects/的所有文件(包括 JAR 包、配置文件)。
步驟 2:替換宿主機的 JAR 包
直接將新的 JAR 包覆蓋宿主機的/opt/java-projects/demo.jar(或目錄內(nèi)的 JAR 包):
# 示例:用本地新JAR包替換宿主機的舊包(可通過rz/scp/FTP上傳新包) cp /root/new-demo.jar /opt/java-projects/demo.jar
步驟 3:重啟容器 / 進程使新 JAR 包生效
JAR 包替換后,需重啟 Java 進程才能加載新包,有兩種方式:
方式 1:輕量重啟容器內(nèi)的 Java 進程(推薦,不中斷容器)
進入容器,找到 Java 進程并殺死,容器會自動重啟 Java 進程(需保證容器的啟動命令是「前臺運行」,如java -jar /app/app.jar)
# 1. 進入容器 docker exec -it my-java-app /bin/bash # 2. 查找Java進程ID ps -ef | grep java # 3. 殺死舊進程(替換為實際PID) kill -9 1 # 容器內(nèi)的主進程通常是PID 1,殺死后容器會重啟主進程 # 4. 退出容器 exit
原理:Docker 容器的主進程退出后會自動重啟(若未配置
--restart,需手動啟動),而容器的啟動命令是運行 JAR 包,因此重啟后會加載新的 JAR 包。
方式 2:直接重啟容器(更簡單,適合測試環(huán)境
# 重啟容器 docker restart my-java-app
該方式會短暫中斷服務,適合測試環(huán)境或?qū)Ψ湛捎眯砸蟛桓叩膱鼍啊?/p>
方案二:通過 Docker Compose 掛載(規(guī)范,適合多容器)
若使用docker-compose管理容器,只需在docker-compose.yml中配置volumes掛載,后續(xù)替換宿主機 JAR 包后重啟服務即可。
步驟 1:編寫docker-compose.ym
version: '3.8'
services:
java-app:
image: custom-jdk-java:v1.0
ports:
- "8080:8080"
volumes:
- /opt/java-projects/demo.jar:/app/app.jar # 掛載單個JAR包
# 或掛載整個目錄:- /opt/java-projects/:/app/
restart: always # 進程退出后自動重啟
container_name: my-java-app
步驟 2:啟動服務
docker-compose up -d
步驟 3:替換 JAR 包并重啟服務
# 1. 替換宿主機JAR包 cp /root/new-demo.jar /opt/java-projects/demo.jar # 2. 重啟服務 docker-compose restart java-app
方案三:不掛載卷(臨時替換,適合應急)
若未提前掛載數(shù)據(jù)卷,可通過docker cp命令直接將新 JAR 包復制到容器內(nèi),再重啟進程,但該方式替換的 JAR 包會在容器重啟后丟失(適合應急場景)。
步驟 1:將新 JAR 包復制到容器內(nèi)
# 格式:docker cp 宿主機文件 容器名:容器內(nèi)路徑 docker cp /root/new-demo.jar my-java-app:/app/app.jar
步驟 2:重啟容器內(nèi)的 Java 進程或容器
同方案一的步驟 3,重啟后新 JAR 包生效。
關(guān)鍵注意事項
容器啟動命令必須是前臺運行確保 Dockerfile 的
ENTRYPOINT/CMD是前臺運行 JAR 包(如ENTRYPOINT ["java", "-jar", "/app/app.jar"]),而非后臺運行(如java -jar /app/app.jar &),否則殺死進程后容器不會重啟。數(shù)據(jù)卷掛載的權(quán)限問題若容器內(nèi)的用戶不是
root,需給宿主機的 JAR 包 / 目錄添加權(quán)限:chmod 777 /opt/java-projects/demo.jar # 臨時授權(quán) # 或修改目錄所屬用戶(適合生產(chǎn)) chown -R 1000:1000 /opt/java-projects/
避免容器重啟后數(shù)據(jù)丟失僅通過
docker cp替換的 JAR 包會在容器重啟后丟失,生產(chǎn)環(huán)境必須使用數(shù)據(jù)卷掛載。配置文件同步若 JAR 包依賴外部配置文件(如
application.yml),可將配置文件也放入掛載目錄,實現(xiàn) JAR 包 + 配置文件的同步替換。
總結(jié)
| 方案 | 優(yōu)點 | 缺點 | 適用場景 |
|---|---|---|---|
| 數(shù)據(jù)卷掛載 | 無需重構(gòu)鏡像,永久生效 | 需提前配置掛載 | 生產(chǎn) / 測試環(huán)境(推薦) |
| Docker Compose 掛載 | 規(guī)范,適合多容器管理 | 需學習 Compose 配置 | 多容器微服務環(huán)境 |
| docker cp 臨時替換 | 應急,無需提前配置 | 容器重啟后丟失 | 臨時應急、測試 |
生產(chǎn)環(huán)境優(yōu)先使用數(shù)據(jù)卷掛載,既能實現(xiàn) JAR 包的快速替換,又能保證數(shù)據(jù)持久化,避免容器重啟后配置丟失。
十、容器網(wǎng)絡(luò)互通,創(chuàng)建自定義網(wǎng)絡(luò) app-network 后再連接容器
這是推薦的方式,自定義網(wǎng)絡(luò)的容器間互通性更好,支持通過容器名直接訪問(默認橋接網(wǎng)絡(luò)也支持,但自定義網(wǎng)絡(luò)更隔離、更規(guī)范)。
步驟 1:創(chuàng)建app-network網(wǎng)絡(luò)
執(zhí)行以下命令創(chuàng)建一個橋接模式的自定義網(wǎng)絡(luò)(Docker 網(wǎng)絡(luò)默認模式為 bridge):
docker network create app-network
執(zhí)行后會輸出網(wǎng)絡(luò)的 ID,說明創(chuàng)建成功。可通過以下命令查看所有網(wǎng)絡(luò),確認 app-network 已存在:
docker network ls
輸出中會包含類似這樣的條目:
NETWORK ID NAME DRIVER SCOPE xxxxxxxxx app-network bridge local
步驟 2:將容器連接到app-network網(wǎng)絡(luò)
現(xiàn)在重新執(zhí)行連接命令,即可成功將 my-java-app 容器接入該網(wǎng)絡(luò):
docker network connect app-network my-java-app
若你還有 MySQL 容器(如 mysql-db),也需將其接入同一網(wǎng)絡(luò),實現(xiàn)容器間互通:
docker network connect app-network mysql-db
步驟 3:驗證容器是否接入網(wǎng)絡(luò)
執(zhí)行以下命令查看 app-network 網(wǎng)絡(luò)的詳細信息,確認容器已接入:
docker network inspect app-network
在輸出的 Containers 節(jié)點下,能看到 my-java-app 和 mysql-db 容器的信息,說明接入成功。
到此這篇關(guān)于docker下載運行java項目的實現(xiàn)步驟的文章就介紹到這了,更多相關(guān)docker下載運行java內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker安裝ClickHouse并初始化數(shù)據(jù)測試
clickhouse作為現(xiàn)在流行的數(shù)據(jù)分析數(shù)據(jù)庫,非常熱門,docker如何安裝ClickHouse,很多朋友并不是很明白,今天小編抽空給大家分享一篇教程關(guān)于Docker安裝ClickHouse并初始化數(shù)據(jù)測試的問題,一起看看吧2021-06-06
國內(nèi)最新可用Docker鏡像源網(wǎng)址與配置方法(全網(wǎng)最全)
使用國內(nèi)鏡像源可以大幅提升鏡像拉取速度,減少網(wǎng)絡(luò)波動,幫助初學者快速上手Docker,本文將詳細介紹國內(nèi)最熱門的Docker鏡像源平臺,希望對大家有所幫助2025-06-06
同一宿主機內(nèi)不同docker間通訊的實現(xiàn)示例
本文主要介紹了同一宿主機內(nèi)不同docker間通訊的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-11-11
Docker網(wǎng)絡(luò)之自定義網(wǎng)絡(luò)方式
文章介紹了Docker的網(wǎng)絡(luò)模式,包括bridge、none、container、host和用戶自定義網(wǎng)絡(luò),并詳細說明了docker0網(wǎng)絡(luò)的特點和自定義網(wǎng)絡(luò)的創(chuàng)建2025-01-01

