docker搭建java運行環境(java或者springboot)

目錄

  • 1. 創建測試代碼
  • 2. 編譯打包
  • 3. 代碼環境運行
    • 使用普通運行方式
    • 使用docker掛載項目(長期運行)
      • 1. 創建 Dockerfile
      • 2. 構建并后臺運行
    • 使用docker swram實現零停機更新(推薦)
      • 1. 初始化swarm
      • 2. 創建 Dockerfile
      • 3. 使用Dockerfile 構建 Docker 鏡像
      • 4. 首次部署服務
      • 5. 更新 JAR 并發布新版本
      • 6. 回滾(如果需要)
      • 8. 停止/刪除 Swarm 服務
      • 7. docker wram架構流程圖

1. 創建測試代碼

vim HelloWorldHttp.java
// HelloWorld.java
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.HttpServer;public class HelloWorldHttp {public static void main(String[] args) throws IOException {HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);server.createContext("/hello", exchange -> {String response = "Hello, World!";exchange.sendResponseHeaders(200, response.length());OutputStream os = exchange.getResponseBody();os.write(response.getBytes());os.close();});server.start();System.out.println("Server running on http://localhost:8080/hello");}
}

2. 編譯打包

  1. 代碼 確保 Java 代碼包含 HTTP 服務器(如 HttpServer 或 Spring Boot)
  2. 編譯
 javac HelloWorldHttp.java
  1. 打包
jar cvfe HelloWorldHttp.jar HelloWorldHttp HelloWorldHttp.class

3. 代碼環境運行

使用普通運行方式

java -jar HelloWorldHttp.jar

訪問 瀏覽器打開 http://localhost:8080/hello

使用docker掛載項目(長期運行)

這種方式的缺點是 每次更新jar包就要刪除原容器 重新構建一個容器,中間服務會有中斷

1. 創建 Dockerfile

vim Dockerfile

Dockerfile配置文件內容

FROM openjdk:17
COPY HelloWorldHttp.jar /app.jar
CMD [“java”, “-jar”, “/app.jar”]

2. 構建并后臺運行

docker build -t hello-server .
docker run -d -p 8080:8080 --name my-server hello-server

使用docker swram實現零停機更新(推薦)

1. 初始化swarm

docker swarm init

2. 創建 Dockerfile

vim Dockerfile

Dockerfile配置文件內容

FROM openjdk:17
COPY HelloWorldHttp.jar /app.jar
CMD [“java”, “-jar”, “/app.jar”]

3. 使用Dockerfile 構建 Docker 鏡像

docker build -t hello-server:v1.0 .

4. 首次部署服務

docker service create --name my-java-app --replicas 2 --publish 8080:8080 --update-parallelism 1 --update-delay 10s --restart-condition any hello-server:v1.0

docker service create
–name my-java-app \ # 服務名稱
–replicas 2 \ # 啟動2個副本(確保高可用)
–publish 8080:8080 \ # 暴露端口
–update-parallelism 1 \ # 每次更新1個副本
–update-delay 10s \ # 批次間隔10秒
–restart-condition any \ # 容器異常時自動重啟
hello-server:v1.0 # 初始鏡像版本

docker service ps my-java-app  # 查看副本狀態
curl http://localhost:8080/hello  # 測試請求

5. 更新 JAR 并發布新版本

# 1. 替換新的 HelloWorldHttp.jar
# 2. 構建 v2.0 鏡像
docker build -t hello-server:v2.0 .
# 強制更新(不檢查摘要)
docker service update --image hello-server:v2.0 --force my-java-app

單機情況下,使用–force忽略版本不同步問題

關鍵配置說明
參數 作用
–replicas 2 多副本是零停機的基礎(至少2個)
–update-parallelism 控制每次更新的副本數(1表示逐個替換)
–update-delay 批次間隔時間(避免同時更新所有副本)
–restart-condition 自動重啟異常容器
–detach 非阻塞執行更新
–force # 強制更新,即使配置未變化

6. 回滾(如果需要)

# 回滾到上一個版本
docker service rollback my-java-app# 或指定歷史版本
docker service update --image hello-server:v1.0 my-java-app

8. 停止/刪除 Swarm 服務

在 Docker Swarm 中,直接使用 docker stop 停止由 service 管理的容器是無效的,因為 Swarm 會監控服務狀態并自動重啟容器以維持指定的副本數(–replicas 2)。以下是正確管理 Swarm 服務的命令:

停止并刪除服務

# 停止并刪除服務(徹底移除)
docker service rm my-java-app

僅暫停服務(不刪除)

# 將副本數設為 0(暫停服務但保留配置)
docker service scale my-java-app=0#恢復服務
docker service scale my-java-app=2

7. docker wram架構流程圖

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918774.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918774.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918774.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

哈希表特性與unordered_map/unordered_set實現分析

目錄 一、哈希表核心特性總結 1.開放地址法 2.鏈地址法 二、unordered_map/unordered_set實現要點分析 1. 哈希表核心實現(HashTable2.h) (1) 哈希函數處理 (2) 鏈地址法實現 (3) 迭代器設計 (4) hashtable設計 2. unordered_map實現要點 3. unordered_map實現要點 一…

生產環境sudo配置詳細指南

目錄 1. 語法格式 2. 配置示例 3. 使用 /etc/sudoers.d/ 目錄管理(推薦) 4. 基礎配置:用戶權限管理 4.1 ??添加用戶到sudo組 ??4.2 驗證用戶組信息 5. sudo日志配置 5.1 修改sudoers配置文件 5.2 創建日志目錄與權限設置 6. Su…

CSS動態視口單位:徹底解決移動端適配頑疾,告別布局跳動

你是否曾被這些問題困擾: 移動端頁面滾動時,地址欄收縮導致頁面高度突變,元素錯位?100vh在移動設備上實際高度超出可視區域?全屏彈窗底部總被瀏覽器UI遮擋? 這些痛點背后都是傳統視口單位的局限——無法響應…

【P27 4-8】OpenCV Python——Mat類、深拷貝(clone、copyTo、copy)、淺拷貝,原理講解與示例代碼

P27 4-8 1 Mat結構體2 深拷貝VS淺拷貝3 代碼示例1 Mat結構體 2 深拷貝VS淺拷貝 只拷貝了頭部,header,,但是data部分是共用的,速度非常快; 缺點,任意一個修改,另一個data跟著變,這就是…

容器運行時支持GPU,并使用1panel安裝ollama

前言 安裝Docker請看之前博文:Docker實戰中1panel方式安裝Docker。 安裝 NVIDIA 容器工具包 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html 安裝 先決條件 閱讀有關平臺支持的部分。為您的 Linux 發行版安裝…

高并發內存池 性能瓶頸分析與基數樹優化(9)

文章目錄前言一、性能瓶頸分析操作步驟及其環境配置分析性能瓶頸二、基數樹優化單層基數樹二層基數樹三層基數樹三、使用基數樹來優化代碼總結前言 到了最后一篇嘍,嘻嘻! ??終于是要告一段落了,接下來我們將學什么呢,再說吧&…

C#面試題及詳細答案120道(01-10)-- 基礎語法與數據類型

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

機器翻譯:回譯與低資源優化詳解

文章目錄一、機器翻譯的瓶頸二、回譯(Back-Translation)2.1 什么是回譯?2.2 為什么回譯有效?2.3 回譯的缺點與挑戰三、低資源優化詳解3.1 數據層面策略3.2 模型層面策略3.3 架構層面策略四、回譯與低資源優化對比4.1 回譯與低資源…

leetcode-python-344反轉字符串

題目: 編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 s 的形式給出。 不要給另外的數組分配額外的空間,你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。 示例 1: 輸入:s [“h”,“…

【Python】新手入門:什么是python字符編碼?python標識符?什么是pyhon保留字?

?? 個人主頁:(時光煮雨) ?? 高質量專欄:vulnhub靶機滲透測試 ?? 希望得到您的訂閱和支持~ ?? 創作高質量博文(平均質量分95+),分享更多關于網絡安全、Python領域的優質內容!(希望得到您的關注~) ??文章目錄?? 前言 ??一、編碼 ??二、標識符 ??三、Py…

為什么要使用消息隊列呢?

消息隊列(Message Queue,MQ)在分布式系統中扮演著 ?異步通信樞紐? 的角色,其核心價值在于解決系統間的解耦、流量削峰、異步處理等關鍵問題。以下是它的核心價值及典型應用場景:?? 一、核心價值:解決什…

ROS機器人云實踐案例博客建議和范文-AI版本

海報圖AI圖1AI圖2zhangrelay的博客以技術深度、跨界思考和社會洞察為特色,內容兼具實用性與前瞻性,但部分觀點存在爭議,需結合具體主題辯證看待。以下從內容特色、技術深度、社會洞察、爭議點四個維度展開分析:一、內容特色&#…

UE小:編輯器模式下「窗口/鼠標不在焦點」時仍保持高幀率

要在UE編輯器模式下「窗口/鼠標不在焦點」時仍保持高幀率,可按下面做法: 關閉編輯器的后臺降頻選項:在 Edit -> Editor Preferences -> General -> Performance 中取消勾選 “Use Less CPU when in Background”。

VS2022 + Qt 5.15.2+Occ開發環境搭建流程

Visual Studio 2022 Qt 5.15.2 圖形處理開發環境搭建流程 1. 安裝 Visual Studio 2022 下載安裝程序:Visual Studio 官網選擇工作負載: ?? “使用C的桌面開發”?? “通用Windows平臺開發”(可選) 安裝組件: ??…

多任務并發:進程管理的核心奧秘

多任務(并發):讓系統具備同時處理多個任務的能力1. 多進程2. 多線程3. 進程間通信一、進程的基本概念1. 什么是進程?正在運行的程序,其運行過程中需要消耗內存和CPU。進程的特點:動態性:進程是程…

高效TypeScript開發:VSCode終極配置指南

?? VSCode TypeScript 專屬效率設置大全 (純 settings.json 配置) // .vscode/settings.json {/* 🔍 引用與類型追蹤 */"typescript.referencesCodeLens.enabled": true, // 顯示引用計數(點擊查看所有引用處)"typescript.implementationsCod…

資本的自我否定:四重矛盾中的歷史辯證法

資本自誕生以來,便以“增殖”為唯一使命,如同一個不知疲倦的擴張機器,在推動生產力飛躍的同時,也埋下了自我毀滅的種子。這種自我否定并非外部力量的強加,而是其內在邏輯的必然展開——從價格戰的困局到經濟危機的周期…

Linux系統安裝Docker及常見問題解決

1.1 解決安裝Docker問題 Linux的發行版本,大多數還是在用CentOS,雖然CentOS已經不更新了。。。。。CentOS因為不更新了,所以很多的yum源都失效了。導致安裝Docker失敗! 只需要更新一下yum源。直接將之前默認的yum源替換為阿里的…

CICD-Devops整合Kubernetes-4

Devops整合Kubernetes Kubernetes部署快速安裝Kubernetes **官網:**https://kuboard.cn/選擇默認支持docker的版本1.19前置環境部署 所有節點均需執行同操作 # 配置主機名解析 [rootKubernetes-master ~]# echo "127.0.0.1 $(hostname)" >> /etc/ho…

C/C++ 指針與內存操作詳解——從一級指針到字符串轉換函數的完整解析

C/C 指針與內存操作詳解——從一級指針到字符串轉換函數的完整解析 本文將帶你系統理解 一級指針與二級指針的區別、數組拷貝的注意事項、字符串轉整數函數實現 等 C/C 編程中常見且易混淆的知識點,并配合詳細代碼示例與常見坑點分析,讓你從入門到掌握。…