目录
- 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. 编译打包
- 代码 确保 Java 代码包含 HTTP 服务器(如 HttpServer 或 Spring Boot)
- 编译
javac HelloWorldHttp.java
- 打包
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