docer swarm集群部署springboot项目
1.准备两台服务器,安装好docker、docker-compose
因为用到了docker仓库,安装harbor,可以从github下载离线安装包
2. 我这边用到了gitlab-ci,整体流程也都差不多
1)打包mvn clean install
2)打镜像 docker-compose -f docker-compose.yaml build
3) 登陆harbor
docker login -u admin -p *** 192.168.178
// 版本号可通过${CI_COMMIT_SHA:0:8}设置为每次提交的hash值,我这边方便就写laster了
4) 打tag docker tag 192.168.1.78/test/test-server:laster 192.168.1.78/test/test-server:laster
5) 上传到harbor docker push 192.168.1.78/test/test-server:laster
docker-compose.yaml例子
version: '3.7'
services:
test-server:
build:
context: ./server #context指明dockerfile路径
environment:
- JAVA_OPS=${JVMOPS}
- DB_OPS=${DBOPS}
container_name: test-server #容器名
hostname: test-server
image: ${IMAGE_TAG} #镜像名
healthcheck: #健康检查
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
interval: 10s #间隔时间
timeout: 10s
retries: 3 #重试次数
start_period: 60s #开始时间
deploy:
mode: replicated #用户可以指定集群中容器的数量(默认),global:每个节点一个
replicas: 2 #replicated时指定共几个容器
# 更新配置
restart_policy:
condition: on-failure #非0退出容器后才重启
max_attempts: 1 #重启1次
update_config:
# 每次更新数量
parallelism: 1
# 每次更新时间(更新完这个,就更新第二个)
delay: 60s
order: start-first #首先启动新任务, 并且正在运行的任务暂时重叠
failure_action: continue
networks:
- default
networks:
default:
driver: overlay
ipam:
config:
- subnet: 10.0.2.0/24 #设置2网段,腾讯内网ip默认1网段,冲突了
6)拉镜像 docker pull 192.168.1.78/test/test-server:laster
7) 运行 docker stack deploy -c docker-compose.yaml --with-registry-auth test
遇到的问题
- docker容器为10.0.1.0/24网络段,和腾讯的内网ip冲突,所以在docker-compose.yaml中设置网络段为2网段
- 更新时,流量还是会分发至重启的节点,就肯定是访问不到接口报错了,后来百度说用健康检查,所以在docker-compose.yaml中增加了 healthchek模块,start_period试自己项目启动时间设置
- 上一点虽说加了健康检查 ,但是发现,启动的容器,刚开始时strarting ,看日志已经启动成功,但是过了一会就unhealth,就自动stop了,百度说是健康检查失败,但是docker logs看日志也没错,后来百度说看 docker inspect 容器名,有个state,Health的log,看到是找不到curl的命令,于是就在dockerfile中,增加了RUN apt update && apt install -y curl
- springboot的健康检查,需依赖actuator组建,具体可以百度,本地运行时,可直接访问提示{“status”:“UP”}
- order: start-first 后面测试发现,通过健康检查后,旧的才会stop掉