持续集成和容器管理
DockerMaven插件
微服务部署有两种方法:
- 手动部署:首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚拟机并拷贝至JDK容器。
- 通过Maven插件自动部署。
自动部署 是企业实际开发中经常使用的方法。
Maven插件自动部署步骤:
修改宿主机的docker配置,让其可以远程访问
1 | vim /lib/systemd/system/docker.service |
其中ExecStart=后添加配置-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

刷新配置,重启服务
1 | systemctl daemon-reload |
在工程pom.xml 增加配置
1 | <build> |
以上配置会自动生成Dockerfile
ENTRYPOINT ["java","-jar","/app.jar"]会自动执行命令
1 | FROM jdk1.8 |
在命令提示符下,进入工程所在的根目录
1 | mvn install |
进入tensquare_base 所在的目录,输入以下命令,进行打包和上传镜像
1 | mvn docker:build -DpushImage |
执行后,会有如下输出,代码正在上传
进入宿主机 , 查看镜像
1 | docker images |
1 | REPOSITORY TAG IMAGE ID CREATED SIZE |
输出如上内容,表示微服务已经做成镜像
浏览器访问 http://192.168.184.141:5000/v2/_catalog ,输出:
1 | {"repositories":["tensquare_base"]} |
启动容器:
1 | docker run -di --name=base -p 9001:9001 192.168.184.141:5000/tensquare_base:1.0-SNAPSHOT |
持续集成工具-Jenkins
持续集成
持续集成 Continuous integration ,简称CI
随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要。
持续集成正是针对这一类问题的一种软件开发实践。它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证,包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。
持续集成具有的特点:
- 它是一个自动化的周期性的集成测试过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,无需人工干预;
- 需要有专门的集成服务器来执行集成构建;
- 需要有代码托管工具支持,Git以及可视化界面Gogs
持续集成的作用:
- 保证团队开发人员提交代码的质量,减轻了软件发布时的压力;
- 持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;
Jenkins简介
Jenkins,原名Hudson,2011年改为现在的名字,一个开源的实现持续集成的软件工具。官方网站:http://jenkins-ci.org/。
Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。
特点:
- 易安装:仅仅一个 java -jar jenkins.war,从官网下载该文件后,直接运行,无需额外的安装,更无需安装数据库;
- 易配置:提供友好的GUI配置界面;
- 变更支持:Jenkins能从代码仓库(Subversion/CVS)中获取并产生代码更新列表并输出到编译输出信息中;
- 支持永久链接:用户是通过web来访问Jenkins的,而这些web页面的链接地址都是永久链接地址,因此,你可以在各种文档中直接使用该链接;
- 集成E-Mail/RSS/IM:当完成一次集成时,可通过这些工具实时告诉你集成结果
- JUnit/TestNG测试报告:也就是用以图表等形式提供详细的测试报表功能;
- 支持分布式构建:Jenkins可以把集成构建等工作分发到多台计算机中完成;
- 文件指纹信息:Jenkins会保存哪次集成构建产生了哪些jars文件,哪一次集成构建使用了哪个版本的jars文件等构建记录;
- 支持第三方插件:使得 Jenkins 变得越来越强大
Jenkins安装
JDK安装
将jdk-8u171-linux-x64.rpm上传至服务器(虚拟机)
1 | rpm -ivh jdk-8u171-linux-x64.rpm |
RPM方式安装JDK,其根目录为:/usr/java/jdk1.8.0_171-amd64
Jenkins安装与启动
下载jenkins
1 | wget https://pkg.jenkins.io/redhat/jenkins-2.83-1.1.noarch.rpm |
或将jenkins-2.83-1.1.noarch.rpm上传至服务器
安装jenkins
1 | rpm -ivh jenkins-2.83-1.1.noarch.rpm |
配置jenkins
1 | vi /etc/sysconfig/jenkins |
修改用户和端口
1 | JENKINS_USER="root" |
启动服务
1 | systemctl start jenkins |
访问链接 http://192.168.184.135:8888
cat ``/var/lib/jenkins/secrets/initialAdminPassword获取初始密码串

安装插件

新建用户,完成安装进入主界面
Jenkins插件安装
以安装maven插件为例
点击左侧的“系统管理”菜单 ,然后点击“管理插件”。选择“可选插件”选项卡,搜索maven,在列表中选择Maven Integration ,点击“直接安装”按钮
全局工具配置
安装Maven与本地仓库
将Maven压缩包上传至服务器(虚拟机)
解压
1 | tar zxvf apache-maven-3.5.4-bin.tar.gz |
移动目录
1 | mv apache-maven-3.5.4 /usr/local/maven |
编辑setting.xml配置文件vi /usr/local/maven/conf/settings.xml,配置本地仓库目录,内容如下:
1 | <localRepository>/usr/local/repository</localRepository> |
将开发环境的本地仓库上传至服务器(虚拟机)并移动到/usr/local/repository
1 | mv reponsitory_boot /usr/local/repository |
执行此步是为了以后在打包的时候不必重新下载,缩短打包的时间。
全局工具配置
选择“系统管理”–> “全局工具配置”
- JDK配置:设置javahome为 /usr/java/jdk1.8.0_171-amd64
- Git配置 (本地已经安装了Git软件),实现代码下载

- Maven配置,执行mvn

代码上传至Git服务器
Gogs搭建与配置
Gogs 是一款极易搭建的自助 Git 服务。
Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 所有平台,包括 Linux、Mac OS X、Windows 以及 ARM 平台。
地址:https://gitee.com/Unknown/gogs
下载镜像
1 | docker pull gogs/gogs |
创建容器
数据放在宿主机
1 | docker run -di --name=gogs -p 10022:22 -p 3000:3000 -v /var/gogsdata:/data gogs/gogs |
centos虚拟机IP为192.168.184.141 在地址栏输入http://192.168.184.141:3000 会进入首次运行安装程序页面,可以选择一种数据库作为gogs数据的存储,最简单的是选择SQLite3。如果对于规模较大的公司,可以选择MySQL

注意上面的应用URL要变成虚拟机的IP
点击“立即安装”
注册,登录,创建仓库,复制仓库的URL添加到项目中:

提交代码
- 在本地安装git
- 在IDEA中选择菜单 : File – settings , 在窗口中选择Version Control – Git
- 选择菜单VCS –> Enable Version Control Integration…–>选择Git
- 设置远程地址: 右键点击工程选择菜单 Git –> Repository –>Remotes…
- 右键点击工程选择菜单 Git –> Add
- 右键点击工程选择菜单 Git –> Commit Directory…
- 右键点击工程选择菜单 Git –> Repository –> Push …
任务的创建与执行
注意创建的是微服务项目,所以创建maven项目的时候是以一个微服务为单位进行创建的:
进入Jenkins首页,点击新建按钮输入名称,选择构建一个Maven项目,点击OK
源码管理,选择Git,将Git地址填入
Build项中的Root POM选择要使用的pom.xml
Build项中的Goals and Options 命令: clean package docker:build -DpushImage 用于清除、打包,构建docker镜像
最后点击“保存”按钮。点击项目的右侧三角即可执行任务
容器管理工具Rancher
Rancher是一个开源的企业级全栈化容器部署及管理平台。Rancher为容器提供一揽子基础架构服务:CNI兼容的网络服务、存储服务、主机管理、负载均衡、防护墙……Rancher让上述服务跨越公有云、私有云、虚拟机、物理机环境运行,真正实现一键式应用部署和管理。
Rancher安装
下载Rancher 镜像
1 | docker pull rancher/server |
创建Rancher容器
1 | docker run -di --name=rancher -p 9090:8080 rancher/server |
在浏览器输入地址: http://192.168.184.136:9090 ,Got It 进入主界面。点击右下角的English 在弹出菜单中选择中文
Rancher初始化
添加环境
Rancher 支持将资源分组归属到多个环境。 每个环境具有自己独立的基础架构资源及服务,并由一个或多个用户、团队或组织所管理。
例如,您可以创建独立的“开发”、“测试”及“生产”环境以确保环境之间的安全隔离,将“开发”环境的访问权限赋予全部人员,但限制“生产”环境的访问权限给一个小的团队。
(1)选择“Default –>环境管理” 菜单
(2)填写名称,点击“创建”按钮
(3)按照上述步骤,添加十次方测试环境和生产环境
(4)你可以通过点击logo右侧的菜单在各种环境下切换
添加主机
(1)选择基础架构–>主机 菜单,点击添加主机
(2)拷贝脚本在主机上注册Rancher
(3)在服务器(虚拟机)上运行脚本
(4)点击关闭按钮后,会看到界面中显示此主机。我们可以很方便地管理主机的每个容器的开启和关闭
添加应用
点击应用–>全部(或用户) ,点击“添加应用”按钮
填写名称和描述
点击“创建”按钮,列表中增加了新增的应用
服务部署
一个应用中可有多个服务
MySQL部署
在对应的应用中点击右上角添加服务,以图形化的方式增加数据库服务。
注意:
- 添加环境变量 MYSQL_ROOT_PASSWORD=123456
- 镜像:选择主机上拉取下来的MySQL镜像
- 设置端口转发
点击创建按钮,完成创建 上述操作相当于以下docker命令
1 | docker run -di --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7 |
完成后服务列表中存在并且状态为激活 使用SQLyog测试链接,执行建表语句
RabbitMQ部署
在对应的应用中点击右上角添加服务,以图形化的方式增加rabbitMQ服务。
注意:
- 镜像:rabbitmq:management
- 端口映射5671 5672 4369 15671 15672 25672
浏览器访问 http://192.168.184.136:15672/
Redis部署
在对应的应用中点击右上角添加服务,以图形化的方式增加rabbitMQ服务。
注意:
- 名称redis ,镜像redis ,端口映射6379
创建后使用客户端测试链接
1 | redis-cli -h 192.168.184.144 |
测试成功
微服务部署
搭建私有仓库
启动私有仓库容器
1 | docker run -di --name=registry -p 5000:5000 registry |
打开浏览器 输入地址http://192.168.184.144:5000/v2/_catalog看到`{"repositories":[]}` 表示私有仓库搭建成功并且内容为空
修改daemon.json
1 | vi /etc/docker/daemon.json |
添加以下内容,保存退出。
1 | {"insecure-registries":["192.168.184.144:5000"]} |

修改docker配置,允许远程访问
1 | vi /lib/systemd/system/docker.service |
其中ExecStart=后添加配置-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
1 | systemctl daemon-reload |

打包镜像提交到仓库
修改微服务工程pom.xml,添加DockerMaven插件
进入tensquare_base 所在的目录,输入以下命令,进行打包和上传镜像
1 | mvn docker:build -DpushImage |
注意安装jdk环境
连接mysql数据库
连接虚拟机里面的docker容器MySQL,初始化数据库的数据
微服务部署
添加服务base-service
注意:
- 镜像,使用的是上传到registry的:192.168.184.144:5000/tensquare_base:1.0-SNAPSHOT
- 端口映射9001
测试微服务 浏览器打开网址 http://192.168.184.144:9001/label
扩容与缩容
扩容
(1)在Rancher将创建的base-service(基础信息微服务)删除
(2)重新创建base-service ,不设置端口映射,创建即可
(3)在上方选择“API” –>WebHooks ,点击“添加接收器”按钮
(4)填写名称等信息“scale-base”,选择类型:扩缩容服务,,操作选择自己需要的,目标服务选择刚刚创建的,步长就是每次触发的时候要增加的容器数量,点击创建按钮
(5)接收器列表中新增了一条记录 ,点击触发地址将地址复制到剪切板
(6)使用postman测试:post方式请求,测试后,发现容器由原来的1个变为了3个
缩容
(1)添加接收器 ,选择缩容,步长为1表示每次递减1个 ,点击创建按钮
(2)创建成功后,复制触发地址
(3)使用postman测试
负载均衡器
上述扩容缩容的时候没有指定端口


influxDB
influxDB是一个分布式时间序列数据库。cAdvisor仅仅显示实时信息,但是不存储监视数据。
因此,需要提供时序数据库用于存储cAdvisor组件所提供的监控信息,以便显示除实时信息之外的时序数据。
influxDB安装
(1)下载镜像
1 | docker pull tutum/influxdb |
(2)创建容器
1 | docker run -di \ |
8083端口:web访问端口
8086:数据写入端口
打开浏览器 http://192.168.184.144:8083/
influxDB常用操作
创建数据库
浏览器点击:query template,执行
1 | CREATE DATABASE "cadvisor" |
1 | SHOW DATABASES |
创建用户并授权
创建用户
1 | CREATE USER "cadvisor" WITH PASSWORD 'cadvisor' WITH ALL PRIVILEGES |
查看用户
1 | SHOW USRES |
用户授权
1 | grant all privileges on cadvisor to cadvisor |
查看采集的数据
切换到cadvisor数据库,使用以下命令查看采集的数据
1 | SHOW MEASUREMENTS |
现在我们还没有数据,如果想采集系统的数据,需要使用Cadvisor软件来实现
cAdvisor
Google开源的用于监控基础设施应用的工具,它是一个强大的监控工具,不需要任何配置就可以通过运行在Docker主机上的容器来监控Docker容器,而且可以监控Docker主机。更多详细操作和配置选项可以查看Github上的cAdvisor项目文档。
cAdvisor安装
(1)下载镜像
1 | docker pull google/cadvisor |
(2)创建容器
1 | docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --link influxsrv:influxsrv --name=cadvisor google/cadvisor -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086 |
- -storage_driver=influxdb
- 数据库名字-storage_driver_db=cadvisor
WEB前端访问地址
http://192.168.184.144:8080/containers/
性能指标含义参照如下地址
https://blog.csdn.net/ZHANG_H_A/article/details/53097084
再次查看influxDB,发现已经有很多数据被采集进去了。
Grafana
Grafana是一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器。支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源。
Grafana主要特性:灵活丰富的图形化选项;可以混合多种风格;支持白天和夜间模式;多个数据源。
Grafana安装
(1)下载镜像
1 | docker pull grafana/grafana |
(2)创建容器
1 | docker run -d -p 3001:3000 -e INFLUXDB_HOST=influxsrv -e INFLUXDB_PORT=8086 -e INFLUXDB_NAME=cadvisor -e INFLUXDB_USER=cadvisor -e INFLUXDB_PASS=cadvisor --link influxsrv:influxsrv --name grafana grafana/grafana |
(3)访问
1 | http://192.168.184.144:3001 |
用户名密码均为admin
(4)登录后提示你修改密码
(5)之后进入主页面
Grafana的使用
添加数据源
(1)点击设置–>DataSource
(2)点击添加data source
(3)为数据源起个名称,指定类型、地址、以及连接的数据库名、用户名和密码。点击保存。数据源建立成功


添加仪表盘
可视化数据
- 选择Dashboards –> Manage
- 点击“添加”按钮–> 点击Graph 图标–> 点击Panel Title 选择Edit (编辑)
- General : 定义标题等基础信息,
- Metrics:设置DataSource,下面可以设置筛选查询条件,设置查询的信息为内存,指定容器名称
- Axes:指定y轴的单位 为M
- 保存,基础微服务内存监控
预警通知设置
(1)选择铃 alerting–> Notification channels
(2)点击Add channel 按钮
(3)填写名称,选择类型为webhook ,填写钩子地址,这个钩子地址是之前对base微服务扩容的地址,post请求
(4)点击SendTest 测试 观察基础微服务是否增加容器
(5)点击save保存
(6)按照同样的方法添加缩容地址
仪表盘预警设置
(1)再次打开刚刚编辑的仪表盘,打开下拉编辑
(2)点击Alert –> Create Alert,设置预警线

(3)选择通知

