持续集成(CI)和容器管理 学习笔记
1. DockerMaven插件
微服务部署方式:
- 手动部署:基于源码打包生成jar,上传到服务器。
- 通过Maven插件自动部署。
1.1 Maven插件自动部署步骤:
- 修改宿主机docker配置,让其可以远程访问。在
docker.service文件的ExecStart=后添加-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
vi /lib/systemd/system/docker.service

- 刷新配置,重启服务
systemctl daemon-reload
sudo systemctl restart docker
docker start registry
- 在
pox.xml文件中添加以下内容
<build>
<finalName>dockerDemo</finalName>
<plugins>
<!-- springboot maven插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker 插件 -->
<plugin>
<!-- 版本信息 -->
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<!-- 配置信息 -->
<configuration>
<!-- docker 生成的镜像名称 -->
<imageName>192.168.2.11:5000/${project.artifactId}:${project.version}</imageName>
<!-- 基础镜像 == Dockerfile中的 FROM jdk1.8 -->
<baseImage>jdk1.8</baseImage>
<!-- 入口点 -->
<entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<dockerHost>http://192.168.2.11:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>
以上配置会自动生成 Dockerfile 文件
FROM jdk1.8
ADD dockerDemo.jar /
ENTRIPOINT ["java","-jar","/dockerDemo.jar"]
- 在cmd下,进入项目工程,进行打包和上传镜像。
mvn clean package docker:build -DpushImage
示例:
[INFO] Building image 192.168.2.11:5000/springboot-demo:0.0.1-SNAPSHOT
Step 1/3 : FROM jdk1.8
---> 79f8c221d4f6
Step 2/3 : ADD /dockerDemo.jar //
---> d0a85948e94f
Step 3/3 : ENTRYPOINT ["java","-jar","/dockerDemo.jar"]
---> Running in ded9a19061e8
Removing intermediate container ded9a19061e8
---> 61d57ebbc410
ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
Successfully built 61d57ebbc410
Successfully tagged 192.168.2.11:5000/springboot-demo:0.0.1-SNAPSHOT
[INFO] Built 192.168.2.11:5000/springboot-demo:0.0.1-SNAPSHOT
[INFO] Pushing 192.168.2.11:5000/springboot-demo:0.0.1-SNAPSHOT
The push refers to repository [192.168.2.11:5000/springboot-demo]
9f8f970adb5a: Pushed
5739a69f0bb7: Mounted from jdk1.8
f967d613a659: Mounted from jdk1.8
174f56854903: Mounted from jdk1.8
0.0.1-SNAPSHOT: digest: sha256:39f341edef265ddfbfab7227c63ffa12e41862e5601198f7a530cbc29061ab79 size: 1161
null: null
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 37.979 s
[INFO] Finished at: 2021-11-01T23:16:33+08:00
[INFO] --------------------------------------------------------
- 进入宿主机centos查看镜像:
docker images - 启动容器:
docker run -di --name=dockerDemo -p 88:8080 192.168.2.11:5000/springboot-demo:0.0.1-SNAPSHOT
注:这里编写了一个SpringBoot的程序。
@RestController
public class HiController {
@RequestMapping("/hello")
public String k8s(){
return "<h1>HELLO</h1> <h1>HUATHY</h1>";
}
}
2. 持续集成与Jenkins
2.1 什么是持续集成
- 持续集成Continuous integration,简称CI
- 如何更好的协同工作,确保软件开发质量。敏捷开发,如何在不断变化的需求中保证质量。
- 持续集成是针对此类问题的一种开发实践。倡导团队经常集成。每次集成都通过自动化构建来验证,包括自动编译、发布、测试,从而尽快的发现集成的错误,使团队更快的开发内聚的软件。
- 持续集成的特点:
- 是一个自动化的周期性集成测试过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成,无需人工干预。
- 需要有专门的集成服务器来执行集成构建。
- 需要有代码托管工具支持,eg:GitHub、Gitee、GitLab、Gogs。
- 持续集成的作用:
- 保证团队开发人员代码提交的质量,减轻软件发布时的压力。
- 持续集成中任何一个环节都是自动完成,无需太多人工干预,有利于减少重复过程以节省时间、费用、工作量。
2.2 Jenkins简介
- 开源持续集成工具。
- 特点:
- 易安装:java -jar jenkins.war即可运行。无需数据库。
- 易配置:提供友好的GUI界面。
- 变更支持:Jenkins能从(SVN/CVS)中获得产生代码更新列表,并输出到编译输出信息中。
- 支持永久连接:用户是通过web来访问Jenkins的,web地址是永久的,可以在各种文档中使用地址。
- 集成E-Mail,RSS,IM:当完成一次集成时,可以通过这些工具实时告诉集成结果。
- Junit/TestNG测试报告:以图表等形式提供详细的测试报表功能。
- 支持分布式构建:Jenkins可以把集成构建等工作分发到多台计算机中完成。
- 文件指纹信息:Jenkins会保存哪次集成构建产生了哪些jars文件, 哪一次集成构建使用了哪个版本的jars文件等构建记录;
- 支持第三方插件:使得Jenkins变得越来越强大。
2.3 Jenkins安装
2.3.1 JDK安装
- 将jdk1.8安装包上传至服务器(这里我下载的是Oracle的Jdk8版本)
附下载地址:https://www.injdk.cn/ - 执行安装命令
rpm -ivh jdk-8u301-linux-x64.rpm
RPM方式安装的JDK其根目录为/usr/java/jdk1.8.0_301-amd64。会自动配置环境。
示例:
[root@localhost ~]# rpm -ivh jdk-8u301-linux-x64.rpm
警告:jdk-8u301-linux-x64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ec551f03: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:jdk1.8-2000:1.8.0_301-fcs ################################# [100%]
Unpacking JAR files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
rt.jar...
jsse.jar...
charsets.jar...
localedata.jar...
2.3.2 开始Jenkins安装
- 下载Jenkin镜像上传服务器: https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.249.3-1.1.noarch.rpm
或使用命令
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.249.3-1.1.noarch.rpm
- 安装Jenkins
rpm -ivh jenkins-2.249.3-1.1.noarch.rpm
[root@localhost softPkg]# rpm -ivh jenkins-2.249.3-1.1.noarch.rpm
警告:jenkins-2.249.3-1.1.noarch.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID 45f2c3d5: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:jenkins-2.249.3-1.1 ################################# [100%]
- 配置Jenkins
vi /etc/sysconfig/jenkins
# 修改以下内容
JENKINS_PORT="8888" # 端口默认为8080
JENKINS_USER="root" # 用户名默认为jenkins。注意这里不能太随便了。不然的话会出现错误。
# 11月 02 22:14:53 localhost.localdomain jenkins[5959]: Starting Jenkins runuser: user huathy does not exist

同时还要改一下 vi /etc/init.d/jenkins 配置文件。将/usr/bin/java修改为jdk安装目录。

2.3.3 启动Jenkins
- 启动命令
sudo service jenkins start - 访问 http://192.168.2.11:8888/

- 查看密码并解锁
[root@localhost /]# cat /var/lib/jenkins/secrets/initialAdminPassword
8a8c90252fb493f9918d35beba5ed2
- 选择左边的安装推荐的插件,进入入门界面

- 创建一个管理员账户。
- 安装配置完成。
2.4 Jenkins插件安装
在Jenkins主界面下,找到系统管理(管理Jenkins)并进入,选择管理插件,安装maven插件。

2.5 全局工具配置
2.5.1 安装maven与本地仓库
- 下载并将Maven压缩包上传至服务器
https://dlcdn.apache.org/maven/maven-3/3.8.3/binaries/apache-maven-3.8.3-bin.tar.gz - 解压:
tar zxvf apache-maven-3.8.3-bin.tar.gz - 移动目录:
mv apache-maven-3.8.3 /usr/local/maven - 编辑
setting.xml配置文件,vi /usr/local/maven/conf/settings.xml,配置本地仓库目录,内容如下:
<localRepository>/usr/local/maven/maven_jar</localRepository>
- 将开发环境的本地仓库上传到服务器maven仓库。这么操作是为了后面打包的时候不必要的重新下载,缩短打包时间。
2.5.2 全局工具配置
- 选择
系统管理(管理Jenkins),全局工具配置。

- JDK配置:
3. Maven配置:
- Git配置:先执行
yum -y install git命令安装git
注意:使用yum安装的git路径是/usr/bin/git。
2.6 代码上传到服务器
2.6.1 Gogs搭建与配置
- 下载镜像:
docker pull gogs/gogs
[root@localhost java]# docker pull gogs/gogs
Using default tag: latest
latest: Pulling from gogs/gogs
ddad3d7c1e96: Pull complete
98bfa715d475: Pull complete
41833e5090f7: Pull complete
0eaa2e62e844: Pull complete
099dafadbd3c: Pull complete
a65e863c4361: Pull complete
6f047877c3f9: Pull complete
Digest: sha256:1c42233010268ef058cd98ca42e4940d20ff2276f01a7db83f9114b1dd8e17ed
Status: Downloaded newer image for gogs/gogs:latest
docker.io/gogs/gogs:latest
- 创建容器:
docker run -di --name=gogs -p 10022:22 -p 3000:3000 -v /var/gogsdata:/data gogs/gogs
# 注意:这里做了两个端口映射
[root@localhost java]# docker run -di --name=gogs -p 10022:22 -p 3000:3000 -v /var/gogsdata:/data gogs/gogs
WARNING: IPv4 forwarding is disabled. Networking will not work.
ffa8059dfe7893e2ac6ee9f1eb38d5fd3726e497448099ca77d26971a73ea880
- 安装提示进行基本配置与账号注册登录。

- 点击右上角的
+号可以创建一个新的仓库。并按照创建后的提示上传代码。

2.7 任务创建与执行
- 回到Jenkins首页,点击
新建Item,输入名称,选择新建一个Maven项目。




3 容器管理工具Rancher
3.1 什么是Rancher
Rancher是一个企业级全栈化容器部署及管理平台。为容器提供基础架构服务、CNI兼容的网络服务、存储服务、主机管理、负载均衡、防火墙…并可以使上述服务跨越公有云、私有云、虚拟机、物理机,实现一键式部署和管理。
3.2 Rancher安装
- 下载Rancher镜像:
docker pull rancher/server - 创建Rancher容器:
docker run -di --name=rancher -p 18080:8080 rancher/server - 等待容器启动后,访问宿主机IP:18080,可以看到欢迎界面。
3.3 Rancher初始化
3.3.1 添加环境
- 作用:起到配置隔离的作用。开发环境、测试环境、生产环境。
- 配置步骤:
Default菜单 ->环境管理->添加环境-> 填写名称与描述 ->创建

3.3.2 添加主机
选择基础架构 -> 主机菜单 -> 点击添加主机 -> 拷贝脚本 复制到服务器执行。


3.3.3 添加应用
- 应用指的是某一开发的项目。
- 添加步骤:点击
应用-> 选择用户-> 点击添加应用
3.4 应用部署
3.4.1 mysql部署

3.4.2 RabbitMQ部署
镜像:rabbitmq:management
端口映射:5671 5672 4369 15671 15672 25672

访问:宿主机IP:15672
3.4.3 Redis部署

3.4.4 微服务部署
注:如果已经进行过的步骤可以省略
- 搭建私有仓库
- 启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry打开宿主机IP:5000/v2/_catalog,看到{"repositories":[]}表示成功。 - 修改
daemon.json
vi /etc/docker/daemon.json添加以下内容并保存退出。
{"insecure-registries":"宿主机IP:5000"} - 启动私有仓库容器
- 修改docker配置,允许远程访问。
vi /lib/systemd/system/docker.service,在ExeStart=后添加如下配置信息:
修改之后要刷新配置,重启服务-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.socksystemctl daemon-reload sudo systemctl restart docker docker start registry - 修改微服务工程,添加DockerMaven插件
- 添加微服务项目
- 测试微服务,打开地址。
- 另外如果发现端口填写错误,可以点击升级按钮,进行修改配置。


3.5 扩容与缩容
3.5.1 扩容
- 在rancher将创建的demo服务删除
- 重新创建demo服务,不设置端口映射

API->Webhooks->扩缩容服务->扩容->选择需要扩容的服务->POST请求触发地址

3.5.2 负载均衡器
上面容器完成了扩容,但是要怎么访问呢?Rancher提供了负载均衡器。


4. influxDB
4.1 什么是influxDB
是一个分布式时间序列数据库。常用于存储系统监视数据,而不应用于系统应用开发。运维常使用的数据库。
cAdvisor仅现实实时信息,但不存储监视数据。因此,需要提供时序数据库来存储cAdvisor组件所提供的监控信息。以便显示除实时信息以外的时序数据。
4.2 influxDB安装
- 下载镜像:
docker pull tutum/influxdb - 创建容器:(端口概述:8083-web访问端口;8086-数据写入端口)
docker run -di -p 8083:8083 -p 8086:8086 \
--expose 8090 --expose 8099 \
--name=influxsrv tutum/influxdb
- 访问:宿主机IP:8083
4.3 influxDB常用操作
4.3.1 创建数据库
输入:CREATE DATABASE "cadvisor" -> 回车执行 -> 使用SHOW DATABASES查询数据库


4.3.2 创建用户并授权
- 创建用户:
CREATE USER "cadvisor" WITH PASSWORD ' a' WITH ALL PRIVILEGES - 查看用户:
SHOW USERS - 用户授权:grant privilege on databaseName to userName
--语法:grant privilege on databaseName to userName grant all privileges on cadvisor to cadvisor grant WRITE on cadvisor to cadvisor grant READ on cadvisor to cadvisor
4.3.3 查看采集的数据
切换到cadvisor数据库,使用以下命令查看采集的数据
SHOW MEASUREMENTS
现在我们还没有数据,如果想采集系统的数据,我们需要使用Cadvisor软件来实现。
5 cAdvisor
5.1 什么是cAdvisor
cAdvisor是Google开源用于监控容器基础设施应用的监控工具。不需要任何配置就可以通过运行在docker容器上来监控docker容器。且可以监控docker主机。数据存放于influxDB。
5.2 cAdvisor安装
- 下载镜像
docker pull google/cadvisor - 创建容器
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=influxdbsrv:8086 ## 参数解释: # --volume == -v # --publish == -p # --link 表示连接,另外的容器名称 # --storage_driver 存储驱动 # --storage_driver_db 存储数据库 # --storage_driver_host 存储主机和端口 - web前端访问地址:宿主机IP:8080/containers
- 再次查看influxDB,可以看到里面已经有很多数据了。
- 性能指标含义参照如下图所示。引用自:https://blog.csdn.net/liumiaocn/article/details/52099969
- 此处附录一本文踩坑记录第二点。如果启动不起来可提供参考!
6 Grafana
6.1 什么是Grafana
Grafana是一个可视化面板( Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器。支持Graphite、zabbix、InfluxDB、 Prometheus和OpenTSDB作为数据源。
Grafana主要特性:灵活丰富的图形化选项;可以混合多种风格;支持白天和夜间模式;多个数据源。
6.2 Grafana安装
- 下载镜像
docker pull grafana/grafana - 创建容器
docker run -d -p 13000:3000 -e INFLUXDB_HOST=influxsrv \ -e INFLUXDB_PORT=8086 -e INFLUXDB_NAME=cadvisor \ -e INFLUXDB_NAME=cadvisor -e INFLUXDB_PASS=cadvisor \ --link influxsrv:influxsrv --name grafana grafana/grafana - 访问宿主机IP:13000 。用户名密码均为admin。
结果发现了这个问题。问题的原因是浏览器不兼容。升级到最新的谷歌,或者使用其他浏览器打开试试。

6.3 Grafana的使用
6.3.1 添加数据源
- 点击
设置->DataSource->add data source->Time series databases->InfluxDB


- 依次配置名称、URL、数据库名、用户名、密码。

6.3.2 添加仪表盘
Dashboards->Manage->New dashboard->Add an empty panel->



6.3.3 预警通知设置
Alerting->Notification channels->Add channel

- 进行通知配置

- 通知的使用:进入
Dashboards-> 选择刚创建的面板 -> 点击Alert-> 进行配置

附录及说明:
附录一:踩坑记录
一、Jenkins配置完成后,发现Jenkins构建出错Cannot run program "git"。
- 问题原因:Jenkins中的git配置错误。
- 关键信息:
Cannot run program "git" (in directory "/var/lib/jenkins/workspace/bookstore"): error=2, 没有那个文件或目录 - 错误日志:
Started by user huathy
Running as SYSTEM
Building in workspace /var/lib/jenkins/workspace/bookstore
The recommended git tool is: NONE
No credentials specified
Cloning the remote Git repository
Cloning repository http://192.168.2.11:3000/huathy/bookstore_springBoot.git
> git init /var/lib/jenkins/workspace/bookstore # timeout=10
ERROR: Error cloning remote repo 'origin'
hudson.plugins.git.GitException: Could not init /var/lib/jenkins/workspace/bookstore
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$5.execute(CliGitAPIImpl.java:997)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$2.execute(CliGitAPIImpl.java:752)
at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1221)
at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1299)
at hudson.scm.SCM.checkout(SCM.java:505)
at hudson.model.AbstractProject.checkout(AbstractProject.java:1206)
at hudson.model.AbstractBuild$AbstractBuildExecution.defaultCheckout(AbstractBuild.java:574)
at jenkins.scm.SCMCheckoutStrategy.checkout(SCMCheckoutStrategy.java:86)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:499)
at hudson.model.Run.execute(Run.java:1894)
at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:543)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:428)
Caused by: hudson.plugins.git.GitException: Error performing git command: git init /var/lib/jenkins/workspace/bookstore
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2457)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2380)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2376)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:1923)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$5.execute(CliGitAPIImpl.java:995)
... 12 more
Caused by: java.io.IOException: Cannot run program "git" (in directory "/var/lib/jenkins/workspace/bookstore"): error=2, 没有那个文件或目录
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at hudson.Proc$LocalProc.<init>(Proc.java:252)
at hudson.Proc$LocalProc.<init>(Proc.java:221)
at hudson.Launcher$LocalLauncher.launch(Launcher.java:996)
at hudson.Launcher$ProcStarter.start(Launcher.java:508)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2443)
... 16 more
Caused by: java.io.IOException: error=2, 没有那个文件或目录
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
at java.lang.ProcessImpl.start(ProcessImpl.java:134)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 21 more
ERROR: Error cloning remote repo 'origin'
Finished: FAILURE
二、docker run启动cAdvisor失败,docker ps不显示
- 我们利用
docker logs cadvisor命令来查看错误日志 - 检查发现报错问题:
flag provided but not defined: -storeage_driver_db系参数没有指定,这里是我一开始写错了的问题。修改容器创建命令,再次启动。
[root@localhost ~]# docker logs cadvisor
flag provided but not defined: -storeage_driver_db
Usage of /usr/bin/cadvisor:
-storage_driver_db string
database name (default "cadvisor")
# 注:这里删除了不相关的错误信息,仅保留于本次错误相关的错误,以节省篇幅。
附录二:说明
本文所采用环境:jdk1.8,centos7,VM15,周志明老师的凤凰架构中的系统做案例。
本文引用文章地址
- Monitor:单节点监控之Cadvisor
- Fenix’s BookStore后端:以单体架构实现
// TODO 未完待续
本文来自博客园,作者:Huathy,遵循 CC 4.0 BY-NC-SA 版权协议。转载请注明原文链接:https://www.cnblogs.com/huathy/p/17253823.html


浙公网安备 33010602011771号