docker怎样实现java的服务不中断滚动升级
学习地址:www.skillup.host/1/java/roll...
1.滚动升级存在难点
1.1 滚动升级时至少有两个节点支撑服务,意味着要开两个同样的端口,普通手段同时映射到宿主机会冲突
2.2 如果不映射到宿主机,得使用负载中间件,不能同时映射,那么必须使用负载中间件
2.3 java启动时候,不是运行了就立马可以服务请求,得等待端口监听好了才行
2.4 滚动升级,新容器起来后,老容器得移除掉
2.5 新的jar文件不能直接替换,需要拷贝个副本,否则旧的容器读到新的文件会报错
2.找到网上开源的方案haproxy+docker-compose实现
docker-compose文件写法如下
bash
services:
lb:
image: haproxy
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
links:
- web
ports:
- 8080:8080
environment:
- HEALTH_CHECK=check inter 1000 rise 2 fall 2 # 1s内两次连接失败定为失败容器,不接受外部服务
- TIMEOUT=connect 1000
networks:
- mynet
web:
image: amazoncorretto:11-al2023-jdk
restart: always
hostname: 'jeiat'
environment:
- TZ=Asia/Shanghai
- VIRTUAL_HOST=*:8080
ports:
- '127.0.0.0::8080'
volumes:
- ./jar/api-0.0.1-SNAPSHOT.jar:/app-new.jar #映射jar文件到容器,更新时只用拷贝文件
- ./jar/lib:/lib #库地址,减少jar包大小
- ./entry-point.sh:/entry-point.sh
entrypoint: /entry-point.sh
command: ["java","-Dloader.path=./lib","-jar","/app.jar"]
3.入口脚本文件
bash
#!/bin/sh
cp /app-new.jar /app.jar
exec "$@"
4.勿忘给定入口文件可执行权限
推荐阅读
配置 docker0 网桥:www.skillup.host/1/docker/do...