使用docker swarm滚动更新java项目,部署集群,这一切的前提是使用Jenkins+maven进行项目打包,分发等功能

具体可以参考我的另外三篇文章

https://www.cnblogs.com/mumengyun/p/10037246.html

https://www.cnblogs.com/mumengyun/p/10000739.html

https://www.cnblogs.com/mumengyun/p/10143203.html

以下写的就是如何使用docker swarm进行java项目的发布,滚动更新,回滚,镜像管理

大致的流程:
对打包好的jar包制作镜像-->上传到私服-->集群拉取镜像-->根据docker-compose.yaml文件创建swarm集群

Dockerfile文件
FROM x.x.x.x/java:8-jre
MAINTAINER xxx xxxx <xxxx@163.com>

LABEL image_category="fwx"

ADD ./jar/xxx.jar /app/

CMD ["java", "-Xmx1000m", "-jar", "/app/xxx.jar"]

x.x.x.x 这个IP为docker私有仓库的地址

LABEL标签 是为了删除未使用镜像的标签,当然作用不仅仅只这一个,后面的jenkins.sh脚本会使用这个标签

jenkins.sh内容
#!/bin/bash

# set -e
export BUILD_ID=dontkillme

\cp -f $WORKSPACE/target/fbl-findhousewx.jar /data/docker/findhousewx/jar && \

# 容器名称
CONTAINER="findhousewx"

# 服务名称
SERVICE_NAME="findhousewx_fbl-findhousewx-service"

# docker私有仓库的地址
REG_URL="x.x.x.x:8082/"

# 私有仓库账户密码
USER="admin"
PASSWD="fbl*#!"

# 登陆私有仓库
docker login -u $USER -p $PASSWD $REG_URL && \

# 镜像名称(以日期时间为镜像标签,防止重复)
IMAGE=$REG_URL$CONTAINER":"$(date -d "today" +"%Y%m%d_%H%M%S")

# dockerfile目录
cd /data/docker/findhousewx && \

# 创建新镜像
docker build -t $IMAGE . && \

# 上传镜像到私有仓库
docker push $IMAGE && \

echo "上传镜像完成" && \

# 定义删除未使用镜像和容器的函数
deletenotused(){
    # 删除未使用的pod
    docker container prune -f --filter "label=pod_category=fwx" --filter "until=48h"
    # 删除未使用的image(使用标签label来定位改服务的pod,防止删除其他服务的pod)
    docker image prune -a -f --filter "label=image_category=fwx" --filter "until=48h"
}
docker service ls | grep -i $CONTAINER
# 如果服务正在运行则滚动更新,如果没有就创建
if [ $? -eq 0 ];then
    # 滚动升级
    docker service update --image $IMAGE $SERVICE_NAME && \
    deletenotused
else
    # 删除 docker-compose.jenkins.yml 文件,防止使用相同镜像
    rm -rf docker-compose.yml && \

    # 复制 docker-compose.src.yml 文件,防止污染原文件
    cp docker-compose.src.yml docker-compose.yml && \

    # 替换镜像名标志位为最新镜像
    sed -i s%IMAGE_LATEST%$IMAGE%g docker-compose.yml && \

    # 使用 docker stack 启动服务
    docker stack deploy --with-registry-auth -c docker-compose.yml $CONTAINER && \

    deletenotused
fi
  1. export BUILD_ID=dontkillme 因为这个脚本实在jenkins中使用的,jenkins在执行完一项任务后,会将启动的进程杀掉,如果不加这个参数,在构建项目后,java -jar会退出

  2. 为什么要将镜像传到私有仓库?

    因为swarm集群的其他节点在启动容器时,也需要自己构建的镜像,这个镜像不能仅仅存在在manager节点上,worker上也需要能pull

  3. 定义删除未使用镜像和容器的函数

    函数的作用是删除未使用的镜像和exit状态的容器

    docker container prune -f --filter "label=pod_category=fwx" --filter "until=48h"

    删除有pod_category标签,且标签值为fwx;并且创建时间超过48小时的容器。 prune参数的作用是删除未运行的conrainer

    docker image prune -a -f --filter "label=image_category=fwx" --filter "until=48h"
    也是一样

  4. docker stack deploy --with-registry-auth -c docker-compose.yml $CONTAINER && \

    这里是重点啊!!! 这条命令是在最开始未创建服务的时候执行的,-c制定了docker-compose.yaml文件

    --with-registry-auth 这个是将docker login的登陆状态也传到swarm集群的其他节点。当创建一项服务的时候,各个节点第一步就是从docker私服仓库去拉取需要部署的镜像,但是我们只会在manager节点进行操作,docker login 也只会在manager节点进行登陆,那woker节点不登录肯定不能成功拉取镜像,这个参数就是来解决这个痛点的

docker-compose.src.yaml
version: '3'
services:
  fbl-findhousewx-service:
    image: IMAGE_LATEST
    labels:
       pod_category: fwx
       ismust: unnecessary
       branch: test
    hostname: fbl-findhousewx
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://baidu.com && exit 0 || exit 1"]
      interval: 10s
      timeout: 3s
      retries: 10
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 30s
      update_config:
        parallelism: 1
        delay: 15s
      mode: replicated
      replicas: 2
      labels:
        service_category: fwx
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /data/wwwlogs/:/data/wwwlogs/findhousewx
    ports:
      - 5020:5020
    restart: always
    networks:
      - fbl

networks:
   fbl:
     driver: overlay

这里说下LABEL:

在Dockerfile文件中的LABEL是images的标签

在docker-compose.yaml文件中services.fbl-findhousewx-service.labels是container的标签

在docker-compose.yaml文件中services.fbl-findhousewx-service.deploy.lebels是service的标签

也就是说镜像,容器,用容器启动的服务都有各自的标签

更多具体的可以学习官网的参考

主要是jenkins.sh这个脚本很重要!

docker swarm实现java项目的发布/滚动更新/回滚/镜像管理的更多相关文章

  1. docker swarm集群搭建以及使用滚动更新

    基础环境,三台虚拟机 172.17.3.70 172.17.3.71 172.17.3.72 系统配置:centos 7,关闭selinux 需要优化的基础配置: [root@sw1 ~]# vim ...

  2. Java学习之道:Java项目打包发布

    Java项目打包发布 如果只想发布为一个可执行的jar包,使用eclipse的Export功能就可以了 使用eclipse的Export功能,将项目中的所有package打包为一个pet.jar文件, ...

  3. Java项目打包发布

    Java项目打包发布 如果只想发布为一个可执行的jar包,使用eclipse的Export功能就可以了 使用eclipse的Export功能,将项目中的所有package打包为一个pet.jar文件, ...

  4. 利用ansible-playbook从测试环境获取tomcat中java项目新版本发布到生产环境

    一.环境描述 安装有ansible的服务器:192.168.13.45 测试环境服务器:192.168.13.49 /home/app/api-tomcat/webapps/api.war为测试环境新 ...

  5. 如何调用docker swarm service的API来创建及更新服务

    平衡的推进,先作一个原型吧. #!/usr/bin/env python # -*- coding: utf-8 -*- import requests import json #定义docker s ...

  6. 入门Kubernetes - 滚动升级/回滚

    一.前言 上一篇文章中对yaml文件格式进行了解,并对k8s中各种主要资源通过yaml创建时的定义模板.接来下就进一步学习k8s的各种特点.并应用在示例中. 接下来先实现.Net Core Api程序 ...

  7. Docker swarm实战总结

    一.简介 Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源 ...

  8. 如何滚动更新 Service?- 每天5分钟玩转 Docker 容器技术(102)

    在前面的实验中,我们部署了多个副本的服务,本节将讨论如何滚动更新每一个副本. 滚动更新降低了应用更新的风险,如果某个副本更新失败,整个更新将暂停,其他副本则可以继续提供服务.同时,在更新的过程中,总是 ...

  9. docker swarm 部署服务时,限制服务启动后所在的机器

    借助容器技术,可以方便的在不同环境下部署服务,保证服务环境的一致性.docker swarm这个东西,可以方便的对容器进行编排管理. docker swarm集群中,有manager节点与worker ...

随机推荐

  1. SQL点点滴滴_判断字段或者字符中是否包含有特殊字符

    SQL Server中,如果我们想判断一个字符串或者数据字段中是否包含有特殊字符.可以使用正则来实现.除了大小字母和数字之外全是特殊字符[^a-zA-Z0-9]

  2. ORA-12514

    ORA-12514: TNS:listener does not currently know of service requested in connect descriptor 监听器目前不知道在 ...

  3. [EffectiveC++]item06:若不想使用编译器自动生成的函数,就该明确决绝

  4. c++计算器后续(1)

    自娱自乐: 大概是一直在说的代码规范,大概是玩一玩,以上. 代码规范: 参考原文:链接 相关节选: 4 程序的版式 4.4规则:较长的语句(>80字符)要分成多行书写. 4.5规则:不允许把多个 ...

  5. Scala高阶函数

    1.作为参数的函数 函数可以作为一个参数传入到一个方法当中去 def main(args: Array[String]): Unit = { val myFunc1 =(x:Int) =>{ x ...

  6. c++ 一般虚函数

    类图: 代码: #include <iostream> using namespace std; class CFather //父类 { public: virtual void dis ...

  7. Java对html标签的过滤和清洗

    OWASP HTML Sanitizer 是一个简单快捷的java类库,主要用于放置XSS 优点如下: 1.使用简单.不需要繁琐的xml配置,只用在代码中少量的编码 2.由Mike Samuel(谷歌 ...

  8. 给trac的ticket添加提交时字段验证

    我们在项目管理中使用了trac系统,并且对于ticket添加了以下自定义字段并且对它们的格式都有一定要求: svn版本号:格式为 r1234.多个版本号之间使用半角逗号隔开.如:r1234,r5678 ...

  9. 关于IntelliJ IDEA 文档无法编辑的解决办法

    问题:在调试的时候,光标无法聚焦到代码区,导致无法编辑代码.停止调试后,问题仍然存在,需要重启idea. 这个问题纠结了我一个上午,百狗一通,发现都是说要卸载vim插件啥的,但是我是没装过vim插件. ...

  10. JDK(五)JDK1.8源码分析【集合】HashMap

    本文转载自无始无终,原文连接 HashMap 在 JDK 1.8 后新增的红黑树结构 传统 HashMap 的缺点 JDK 1.8 以前 HashMap 的实现是 数组+链表,即使哈希函数取得再好,也 ...