docker swarm实现java项目的发布/滚动更新/回滚/镜像管理
使用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
export BUILD_ID=dontkillme因为这个脚本实在jenkins中使用的,jenkins在执行完一项任务后,会将启动的进程杀掉,如果不加这个参数,在构建项目后,java -jar会退出为什么要将镜像传到私有仓库?
因为swarm集群的其他节点在启动容器时,也需要自己构建的镜像,这个镜像不能仅仅存在在manager节点上,worker上也需要能pull
定义删除未使用镜像和容器的函数
函数的作用是删除未使用的镜像和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"
也是一样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项目的发布/滚动更新/回滚/镜像管理的更多相关文章
- docker swarm集群搭建以及使用滚动更新
基础环境,三台虚拟机 172.17.3.70 172.17.3.71 172.17.3.72 系统配置:centos 7,关闭selinux 需要优化的基础配置: [root@sw1 ~]# vim ...
- Java学习之道:Java项目打包发布
Java项目打包发布 如果只想发布为一个可执行的jar包,使用eclipse的Export功能就可以了 使用eclipse的Export功能,将项目中的所有package打包为一个pet.jar文件, ...
- Java项目打包发布
Java项目打包发布 如果只想发布为一个可执行的jar包,使用eclipse的Export功能就可以了 使用eclipse的Export功能,将项目中的所有package打包为一个pet.jar文件, ...
- 利用ansible-playbook从测试环境获取tomcat中java项目新版本发布到生产环境
一.环境描述 安装有ansible的服务器:192.168.13.45 测试环境服务器:192.168.13.49 /home/app/api-tomcat/webapps/api.war为测试环境新 ...
- 如何调用docker swarm service的API来创建及更新服务
平衡的推进,先作一个原型吧. #!/usr/bin/env python # -*- coding: utf-8 -*- import requests import json #定义docker s ...
- 入门Kubernetes - 滚动升级/回滚
一.前言 上一篇文章中对yaml文件格式进行了解,并对k8s中各种主要资源通过yaml创建时的定义模板.接来下就进一步学习k8s的各种特点.并应用在示例中. 接下来先实现.Net Core Api程序 ...
- Docker swarm实战总结
一.简介 Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源 ...
- 如何滚动更新 Service?- 每天5分钟玩转 Docker 容器技术(102)
在前面的实验中,我们部署了多个副本的服务,本节将讨论如何滚动更新每一个副本. 滚动更新降低了应用更新的风险,如果某个副本更新失败,整个更新将暂停,其他副本则可以继续提供服务.同时,在更新的过程中,总是 ...
- docker swarm 部署服务时,限制服务启动后所在的机器
借助容器技术,可以方便的在不同环境下部署服务,保证服务环境的一致性.docker swarm这个东西,可以方便的对容器进行编排管理. docker swarm集群中,有manager节点与worker ...
随机推荐
- Scratch www 系统搭建
原文地址:https://blog.csdn.net/litianquan/article/details/82735809 Scratch www要基于Nodejs的环境才可以运行,我尝试了在Win ...
- Oracle案例08——xx.xx.xx.xx,表空间 SYSAUX 使用率>95%%
本实例主要针对Oracle表空间饱满问题处理方法做个步骤分享. 一.告警信息 收到zabbix告警信息,表空间 SYSAUX 使用率>95%%,系统表空间sysaux使用率超过了95%. 二. ...
- 高级mask应用
高级mask应用 用mask做遮罩可以实现复杂的效果: 用来形成遮罩的图片: 原始图片: 如果你熟悉Photoshop,那这种效果绝对是你的菜,看代码你会秒懂...... // // RootView ...
- Visual Studio 2017 连接Oracle
VS 2017 连接 Oracle 12 因为Visual Studio自带的数据文件已经不能支持超过10g以上的了,所以需要另外 下载插件 本机环境 宿主机的环境:win7,Visual Studi ...
- August 30th 2017 Week 35th Wednesday
A lion does not concern himself with the opinion of sheep. 狮子可不会在意绵羊是怎么想的. As a sheep, you must run ...
- [转载] c++对结构体数组排序
按结构体中某个成员进行排序,下面代码以成员b1为升序的排序 代码: #include<iostream> #include<algorithm> using namespace ...
- Angular Reactive Form - 填充表单模型
setValue 使用setValue,可以通过传递其属性与FormGroup后面的表单模型完全匹配的数据对象来一次分配每个表单控件值. 在分配任何表单控件值之前,setValue方法会彻底检查数据对 ...
- linux服务器nginx的卸载和安装
刚接触的linux服务器上,nginx配置乱的有点令人发指,就把老的卸载了重新装一下. 卸载 linux有一系列的软件管理器,比如常见的linux下的yum.Ubuntu下的apt-get等等.通过这 ...
- 协议森林09 爱的传声筒 (TCP连接)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在TCP协议与"流"通信中,我们概念性的讲解了TCP通信的方式 ...
- the longest distance of a binary tree
版权声明:欢迎查看本博客.希望对你有有所帮助 https://blog.csdn.net/cqs_2012/article/details/24880735 the longest distance ...