监控,这一个词对于我们开发人员已经习以为常,我们通过对于内存、IO、CPU等性能的监控去判断当前运行状态的情况,容器作为一个已经打包好的虚拟环境亦是如此,特别是多个容器运行,需要收集docker各容器的运行状态和运行信息,本章将进行容器监控,第三方容器监控来进行讲解。
一、Docker命令监控
我们先去运行几个容器
docker run -d -p 80 --name ceshi-1-httpd httpd docker run -d -it --name ceshi-2-busybox busybox docker run -d -it --name ceshi-3-centos centos
| 命令 | 解释 |
| ps | 查看容器状态 |
| container ls | 查看容器状态 |
| top 【容器ID】 | 查看容器内进程 |
| stats | 查看容器各项资源消耗情况 |
像有些命令我们已经非常常见了,Docker所自带的容器指令可以实时的去捕捉信息,但是我们也会存在一些问题,数缺形时少直观,无法反应所占用的趋势,为此,我们引入第三方监控软件。
二、Sysdig
2.1介绍
Sysdig 是一款命令行监控工具,因其轻量级的特点深受广大用户的喜爱。Svsdig 就像放大镜,使用户可以更清晰地看到宿主机与容器的各项行为。它相当干多种 Linux 监控工具的合集。同时docker上为我们提供了他的容器镜像!
docker run -it --rm --name sysdig --privileged=true \ --volume=/var/run/docker.sock:/host/var/run/docker.sock \ --volume=/dev:/host/dev \ --volume=/proc:/host/proc:ro \ --volume=/boot:/host/boot:ro \ --volume=/lib/modules:/host/lib/modules:ro \ --volume=/usr:/host/usr:ro sysdig/sysdig #--privileged=true:赋予特殊权限;
其实看到这里,我们会有一个疑问,他作为一个容器,他怎么去获取我们的容器的信息的,我们注意到这个命令**/var/run/docker.sock**我们现在来详细参看下命令,我们在前面的学习中,已经知道我们docker是由client和server组成,我们输入命令实际上是通过客户端将请求发送到同一台电脑上的Doceker Daemon服务,由Docker Daemon返回信息,客户端收到信息后展示在控制台上。我们去看Docker Daemon的信息
我们试着来监听一下
curl --unix-socket /var/run/docker.sock http://localhost/events
docker run -it --rm nginx sh
现在,我们就可以很清楚的知道,Sysdig通过对于/var/run/docker.sock数据卷的共享,可以来获取我们容器的信息。
我们接着往下走,等到我们上面命令执行完输入csysdig(退出的话ctrl+P+Q)
csysdig
2.2 基本操作
2.2.1 切换视图
点击我们下面的views
界面左边列出了sysdig支持的View,一共30多项,涵盖了操作系统的各个方面因为这里主要是讨论容器监控
所以我们将光标移到Containers这一项,界面右边立即显示出此View的功能介绍,双击可以进入视图
2.2.2 查看标签含义
点击legend
2.2.3 排序
双击头部
2.2.4 查看内部进程
双击容器进入
2.2.5 查找
2.2.6 暂停
2.2.7 上一级
退格
2.2.8 退出
按住q
三、Weave Scope
3.1介绍
Weave Scope的最大特点是会自动生成一张Docker容器地图,能够直观地理解、监控和控制容器。
#下载scope命令脚本文件并赋予x执行权限: curl -L git.io/scope -o /usr/local/bin/scope 【真的太慢了,百度网盘都比他快】 链接:https://pan.baidu.com/s/1HWePWMZBkhkyYVlrqHY2Rw?pwd=3wva 提取码:3wva --来自百度网盘超级会员V4的分享 | ————网盘下的,这样操作 cp 你放的位置 /usr/local/bin/scope #加入权限 chmod a+x /usr/local/bin/scope #以容器的方式启动Weave Scope scope launch #授权端口 apt install firewalld firewall-cmd --add-port=4040/tcp --permanent firewall-cmd --reload firewall-cmd --list-all
3.2基本操作
3.2.1 显示容器
3.2.2 选择容器
单击小图标,同时会将容器信息进行显示
3.2.3 按照CPU使用情况排序
3.2.4 控制容器
attach到容器启动进程,相当于执行docker container attach
打开shell,相当于执行docker container exec
重启容器,相当于执行docker container restart
暂停容器,相当于执行docker container pause
关闭容器,相当于执行docker container stop
3.2.5 搜索容器
3. 两台主机监控
| 名称 | IP地址 |
| 小唐A | 192.168.2.98 |
| 郑崽B | 192.168.2.108 |
因为小唐的已经装好了,所以直接传到郑崽的目录就好 username<登录用户名你服务器的名字【就是你直接打开控制台的名字】> serverip<客户端ip(ip addr查看)> 192.168.2.108 scp -r -p <本机地址> username@serverip:<要传的地址> scp -r -p /usr/local/bin/scope root-u@192.168.2.108:/usr/local/bin/scope 【郑崽B】:chmod 777 /usr/local/bin -------------等待小唐传输------------- 【小唐A】:scp -r -p /usr/local/bin/scope root-u@192.168.2.108:/usr/local/bin/scope -------------传输完毕----------------- 【郑崽B】:ls /usr/local/bin (检查一下) 【郑崽B】:chmod +x /usr/local/bin/scope 【郑崽B】:scope launch 192.168.2.108 192.168.2.98 【郑崽B】:docker run -d -it --name ceshi-4-centos centos 各自的ip在前,其他主机的在后 【小唐A】:scope launch 192.168.2.98 192.168.2.108
四、cAdvisor
4.1介绍
cAdvisor是google开发的容器监控工具,我们一起来看看吧
docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:rw \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=8080:8080 \ --detach=true \ --name=cadvisor \ google/cadvisor:latest
如果出现
docker: Error response from daemon: driver failed programming external connectivity on endpoint cadvisor (dbd62fd04c955df34e34aa72b78de70f21019a08da5bb1a06da55c4a1fad228a): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8090 -j DNAT --to-destination 172.17.0.2:8090 ! -i docker0: iptables: No chain/target/match by that name. 【停止再重启docker】 docker stop $(docker ps -q) & docker rm $(docker ps -aq) systemctl restart docker
4.2 基本操作
4.2.1查看容器
4.2.1查看单个容器状态
五、Prometheus
5.1介绍
Prometheus是一个非常优秀的监控工具。准确地说,应该是监控方案Prometheus提供了监控数据搜集、存储、处理、可视化和告警一套完整的解决方案。我们先来看看他的架构,这个真的是这篇文章中最硬核的东西了
1.Prometheus Server ------服务端 —处理,储存数据
Prometheus Server负责从Exporter拉取和存储监控数据,并提供一套灵活的查询语言 (PromQL) 供用户使用。
2. Exporter-----客户端 —采集数据
Exporter负责收集目标对象 (host、container等)的性能数据,并通过HTTP接口供Prometheus Server获取。
3.可视化组件
监控数据的可视化展现对于一个监控方案至关重要,以前Prometheus自己开发了一套>>工具,不过后来废弃了,因为开源社区出现了更为优秀的产品Grafana。Grafana能够与Prometheus无缝集成,提供完美的数据展示能力。
4.Alertmanager—告警方式—实现告警
用户可以定义基于监控数据的告警规则,规则会触发告警。一旦Alertmanager收到告警,会通过预定义的方式发出告警通知。支持的方式包括Email.PagerDuty、Webhook等
工作流程
- Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
- Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
- Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。
- 在图形界面中,可视化采集数据。
下面我们来对Prometheus进行一个简单的实践
| 名称 | IP地址 |
| 小唐A | 192.168.2.98 |
| 郑崽B | 192.168.2.108 |
我们将使用Prometheus对于小唐A和郑崽B进行监控
(1)同时Prometheus Server, Prometheus Server本身也将以容器的方式运行在小唐A上
Node Exporter: 负责收集host硬件和操作系统数据,它将以容器方式运在所有host上
cAdvisor: 负责收集容器数据,它将以容器方式运行在所有host上
(2) Grafana,显示多维数据,Grafana本身也将以容器方式运行在小唐A上
1.运行Node Exporter【所有host都做】
docker run -d --net="host" --name node_exporter --restart=unless-stopped -p 9100:9100 \ -v "/proc:/host/proc:ro" \ -v "/sys:/host/sys:ro" \ -v "/:/rootfs:ro" \ prom/node-exporter
2.运行cAdvisor【所有host都做】
docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:rw \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=8080:8080 \ --detach=true \ --name=cadvisor \ google/cadvisor:latest
3.运行Prometheus Server【小唐A做】
【会报错,但是我们会拿到prometheus.yml,我们接着去修改我们的yml文件】 docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus 【复制到本地】 docker cp prometheus:/etc/prometheus/prometheus.yml . 【修改配置文件】 【开个管理员】 sudo su ls /root vi /root/prometheus.yml targets: ["localhost:9090","localhost:8080","localhost:9100","192.168.2.108:9090","192.168.2.108:8080","192.168.2.108:9100"] 【删除刚刚的容器】 docker rm prometheus -f 【再次运行】 docker run -d -p 9090:9090 \ --name prometheus \ --net=host \ -v /root/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
4.运行grafana容器【小唐A做】
docker run -d -i -p 3000:3000 \ -e "GF_SERVER_ROOT_URL=http://grafana.server.name" \ -e "GF_SECURITY_ADMIN_PASSWORD=secret" \ --net=host \ grafana/grafana
做到这里的时候我已经想哭了,终于出来了
账号:admin
密码:secret
添加数据
5.2数据大屏导入
当然也可以到官网去看其他的图标
这里需要我们去登陆一下,github或者微软的账号都可以
导入
然后选择好我们的对于的仓库,完成!!!
六、对比
部署容易度
ps/top/stats无疑是最容易使用的,它们是Docker自带的子命令,随时随地都可以用来快速了解容器的状态。其余几种也都可以容器的方式运行,总的来说都不算复杂。相对而言,Prometheus涉及的组件比较多,搭建整个方案需要运行的容器数量也要多些,部署和管理的难道稍大。
数据详细度
ps/top/stats和cAdvisor能够监控容器基本的资源使用情况,Sysdig、 WeaveScope和Prometheus则能提供更丰富的数据
多Host监控
Weave Scope和Prometheus可以监控整个集群,而其余的工具只提供单个Host的监控能力。
告警功能
只有Prometheus具备原生的告警功能
监控非容器资源
Sysdig、 Weave Scope和 Advisor可 以监控到 Host操 作系统的状态,而Prometheus则可以通过Exporter支持应用级别的监控,比如监控ceph、haproxy等。