Docker监控
Docker监控涉及对容器的资源使用情况和性能指标进行实时监控和分析,以确保应用程序的正常运行并优化资源使用。
监控容器最简单是使用Docker自带的监控命令,如docker ps、docker top和docker stats等命令,但其输出的数据有限。
Docker监控工具
cAdvisor
cAdvisor是Google的一个开源工具,专门用于容器资源使用和性能分析。它可以收集、聚合、处理和导出关于运行容器的各种信息。是具有图形界面、最易于入门的Docker容器监控工具。
部署cAdvisor
1.使用wget获取二进制文件;
[root@workstation ~]# wget https://github.com/google/cadvisor/releases/download/v0.46.0/cadvisor-v0.46.0-linux-amd64
2.编写Dockerfile;
FROM ubuntu:latest
COPY ./cadvisor-v0.46.0-linux-amd64 /usr/bin/cadvisor
RUN chmod +x /usr/bin/cadvisor
ENTRYPOINT ["/usr/bin/cadvisor"]
3.使用docker build命令构建镜像;
[root@workstation ~]# docker build -t cadvisor:0.46.0 .
4.运行容器;
[root@workstation ~]# docker run --privileged --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 --device=/dev/kmsg cadvisor:0.46.0
5.添加防火墙端口规则;
[root@workstation ~]# firewall-cmd --add-port=8080/tcp --permanent
[root@workstation ~]# firewall-cmd --reload
访问cAdvisor
点击Docker Containers查看容器状态;
查看主机详细信息状态;
Weave Scope
Weave Scope是一款开源的故障诊断与监控工具,除了用于Docker外,还可以用于Kubernetes(k8s)集群。Weave Scope会自动生成容器之间的关系图,便于管理员直观地以可视化的方式监控容器化和微服务化应用。Weave Scope能够进行跨主机监控,并且消耗的资源非常少。
部署Weave Scope
本地部署
1.登录到workstation虚拟机,在该虚拟机内的hosts文件内添加以下两行内容(相当于代理);
185.199.109.133 raw.githubusercontent.com
20.205.243.166 github.com
2.执行以下命令下载Weave Scope的二进制安装脚本文件;
[root@workstation ~]# curl -L https://github.com/weaveworks/scope/releases/download/latest_release/scope -o /usr/local/bin/scope
3.执行以下命令赋予该安装脚本可执行权限;
[root@workstation ~]# chmod a+x /usr/local/bin/scope
4.执行以下命令从docker hub中下载Weave Scope镜像并启动容器;
[root@workstation ~]# scope launch
5.防火墙加入4040端口规则;
[root@workstation ~]# firewall-cmd --add-port=4040/tcp --permanent
[root@workstation ~]# firewall-cmd --reload
6.访问http://192.168.72.150:4040/
可以看到此时没有一个被监控的容器;
7.在本地运行一个容器;
[root@workstation ~]# docker run -d -p 9090:9090 --name mysiteweb nginx:latest
此时再查看Weave Scope的监控状态;
同样的,Weave Scope也可以监控主机的状态;
跨主机监控
确保所有主机(即已经部署Weave Scope的主机和其他主机)可以通过网络相互通信。这包括网络连接和防火墙设置。
在所有需要监控的主机上安装Weave Scope。可以使用与单主机部署相同的步骤来安装:
curl -L https://github.com/weaveworks/scope/releases/download/latest_release/scope -o /usr/local/bin/scope
chmod a+x /usr/local/bin/scope
scope launch
或者将workstation中/usr/local/bin/scope文件分别复制到测试机,然后执行后面的命令。
启动Weave Scope并配置跨主机监控:启动Weave Scope时,您需要指定其他主机的IP地址,使得所有Weave Scope实例能够相互发现并通信。
如果自动发现不能满足需求,你可以通过scope launch命令手动指定其他Scope实例的IP地址。
例如,在第一台主机上运行:
scope launch
在第二台主机上运行,并指定第一台主机的IP地址:
scope launch <IP_OF_FIRST_HOST>
3. 配置多主机连接
如果你有更多的主机,需要将每台主机的IP地址添加到scope launch命令中。例如,在第三台主机上,你可以指定第一台和第二台主机的IP地址:
scope launch <IP_OF_FIRST_HOST> <IP_OF_SECOND_HOST>
这样,每台主机的Weave Scope实例将能够相互通信并共享监控数据。
示例:
以workstation、servera虚拟机为实验平台;
1.在两台服务器上执行以下命令:
curl -L https://github.com/weaveworks/scope/releases/download/latest_release/scope -o /usr/local/bin/scope
chmod a+x /usr/local/bin/scope
2.在workstation上执行以下命令;
scope launch 192.168.72.151(servera的IP)
在servera上执行以下命令;
scope launch 192.168.72.150(workstation的IP)
注意:如果开启了防火墙,注意添加端口规则。
3.访问weave scope;
Docker日志
在 Docker 环境中进行日志管理可以帮助你有效地监控和排查容器的运行情况。
Docker自带的docker logs命令输出正在运行的容器的日志信息,而docker service logs命令显示服务中心的所有容器的日志信息,这个命令用于集群环境。
查看容器日志
查看指定容器的日志;
docker logs <container_id>
实时查看日志;
docker logs -f <container_id>
日志选项
你可以使用以下选项来控制日志输出:
--tail:显示日志的最后几行。
--since:显示某个时间点后的日志。
配置日志驱动
Docker 支持多种日志驱动程序,用于将日志记录到不同的地方。常见的日志驱动程序包括:
- json-file(默认)
- syslog
- journald
- gelf
- fluentd
- awslogs
- splunk
可以在启动容器时指定日志驱动程序,例如:
docker run --log-driver=syslog <image>
配置日志选项
在 Docker 的 daemon.json 文件中,可以配置全局日志选项。通常这个文件位于 /etc/docker/daemon.json。例如,配置 JSON 文件日志驱动程序的选项:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
配置完后,重启 Docker 服务以使更改生效:
sudo systemctl restart docker
docker日志管理工具(Logspout+syslog)
Logspout本身是基于AIpine Linux构建的Docker容器。Docker主机启动一个容器运行Logspout服务,Logspout负责将同一主机上其他容器的日志根据路由设置转发给不同的日子接收端。这里以syslog为例。
这里以两台RHEL虚拟机为实验环境。启用rsyslog接收外部信息功能,修改rsyslog日志服务器的配置文件/etc/rsyslog.conf,从中找到以下两行,将注释去掉;
[root@serverc ~]# vim /etc/rsyslog.conf
module(load="imudp") # needs to be done just once
input(type="imudp" port="514") 启用UDP
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514") 启用TCP
保存该配置文件,重启rsyslog,然后检查514端口是否开启;
[root@serverc ~]# systemctl restart rsyslog.service
[root@serverc ~]# netstat -antup | grep 514
添加对514的防火墙端口规则;
[root@serverc ~]# firewall-cmd --add-port=514/tcp --permanent
[root@serverc ~]# firewall-cmd --add-port=514/udp --permanent
[root@serverc ~]# firewall-cmd --reload
拉取 Logspout 镜像;
[root@serverc ~]# docker pull gliderlabs/logspout
运行 Logspout 容器,将日志发送到 Syslog 服务器;
[root@workstation ~]# docker run -d --name="logspout" \
--volume=/var/run/docker.sock:/var/run/docker.sock \
gliderlabs/logspout \
syslog://192.168.72.153:514
在容器测试机上启用rsyslog的接收外部信息功能;配置/etc/rsyslog.conf将以下行的注释去掉,然后重启服务;
module(load="imudp") # needs to be done just once
input(type="imudp" port="514") 启用UDP
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514") 启用TCP
systemctl restart rsyslog.service
添加针对514的防火墙端口规则;
firewall-cmd --add-port=514/tcp --permanent
firewall-cmd --add-port=514/udp --permanent
firewall-cmd --reload
在容器测试机上运行一个容器,在日志收集服务器上查看效果;
docker run -d --name testweb nginx:latest