使用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. Exchange Server 2016 管理邮箱收发限制

    备注:本文是Exchange Server 2016管理系列的配套课件,更加详细的讲解请参考视频课程,文章结尾有视频课程主页的链接. 进行收发邮件大小的限制是很有必要的,因为邮件服务器不能当作文件服务 ...

  2. August 10th 2017 Week 32nd Thursday

    Break through the psychological barrier to surpass themselves. 突破心理障碍,才能超越自己. To break through those ...

  3. December 27th 2016 Week 53rd Tuesday

    A journey of one thousand miles begins with one step. 千里之行始于足下. No matter how slowly you walk, as lo ...

  4. 深入了解Node模块原理

    深入了解Node模块原理 当我们编写JavaScript代码时,我们可以申明全局变量: var s = 'global'; 在浏览器中,大量使用全局变量可不好.如果你在a.js中使用了全局变量s,那么 ...

  5. angularJs的工具方法2

    一.angular.isArray     判断是否是数组 var a = []; console.log(angular.isArray(a)); //判断参数里面的是否是数组 二.angular. ...

  6. iOS UI(绘图)的几张原理图

    Core Animation是对OpenGL ES的Objective-C封装,具有与OpenGL ES几乎等价的高性能,却隐藏了OpenGL ES的复杂性. https://www.cnblogs. ...

  7. urllib下使用Xpath表达式示例

    urllib下使用Xpath表达式示例 使用xpath表达式需要先将需要匹配的数据转换成tree格式,这就需要先装lxml模块.安装方法可以使用pip安装. 示例代码: import urllib.r ...

  8. Tomcat的免安装配置

    Tomcat免安装配置 以下配置说明全部针对免安装版本 基于tomcat的安装目录和运行目录是可以不同的,本文都会进行说明 首先简单介绍一下tomcat的目录结构,一般情况下,tomcat包括以下子目 ...

  9. TP框架---Model模型层---做模型对象

    TP框架----Model模型层---------------做模型对象 Model模型层是用来做什么的呢???? 主要是用来做操作数据库访问的. 也就说明TP框架自带了一种访问数据库的方式,使用的是 ...

  10. FRM一级备考感想

    作为金融小白,工作四年多,边边角角有了些许的最直观认识,决定深入了解下金融相关123. 曾经尝试CFA失败,转战FRM安慰下失败的灵魂. 2018.11.17 FRM Part I 考试结束,自7月初 ...