目录

  • 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 编程中常见且易混淆的知识点,并配合详细代码示例与常见坑点分析,让你从入门到掌握。…