目錄
- 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