前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除
一、Docker监控工具
二、容器日志工具docker logs
三、第三方日志工具
四、容器日志驱动
五、示例
5.1、查看容器中运行的进程的信息
5.2、查看容器的资源使用情况
5.3、使用cAdvisor监控容器
5.4、使用Weave Scope监控容器
六、使用docker logs命令查看容器日志
七、配置日志驱动
7.1、配置默认的日志驱动
7.2、配置容器的日志驱动
八、容器日志清理
九、将容器的日志重定向到Linux日志
9.1、将容器日志记录到syslog
9.2、将容器日志记录到journald
十、使用Logspout收集所有容器的日志
10.1、将所有容器的输出路由到远程syslog
10.2、通过HTTP查看Logsput收集的日志
一、Docker监控工具
Docker自带监控命令:docker ps、docker top和docker stats等命令(输出的数据比较有限)。
第三方工具:Google的cAdvisor、
Weave Scope是一款开源的故障诊断与监控工具,除Docker外,还可用于Kubernetes集群
二、容器日志工具docker logs
Docker自带的docker logs命令输出正在运行的容器的日志信息,而docker service logs命令显示服务中的所有容器的日志信息(这个命令适用于集群环境)。
三、第三方日志工具
常用的是由3个开源组件Elasticsearch、Logstash和Kibana组成的ELK日志系统。
- Elasticsearch是分布式搜索引擎;
- Logstash可以对日志进行收集和分析,并将其存储下来供以后使用;
- Kibana可以为Logstash和Elasticsearch提供日志分析Web界面,用来汇总、分析和搜索重要的日志数据。
在ELK日志系统中,Logstash获取Docker中的日志,然后将日志转发给Elasticsearch进行索引,Kibana提供日志的分析和可视化。
# 个别容器的日志可以直接通过syslog日志驱动进行发布
docker run --log-driver=syslog --log-opt syslog-address=tcp://:5000
Logspout将来自某个主机上的所有容器的所有日志汇集到所需的何目标中。它是一个无状态的容器化程序,并不是用来管理日志文件或查看日志的,主要用于将所在机上容器的日志转发到其他地方。目前它只捕获容器中的程序发送到STDOUT和STDERR的日志。
四、容器日志驱动
Docker默认的日志驱动是json-file。在启动容器时可以通过--log-driver选项配置日志驱动。
选项值 | 说明 |
---|---|
none | 禁用容器日志,docker logs 命令不会输出任何日志信息 |
json-file | Docker默认的日志驱动。该驱动将日志保存在JSON文件中,Docker 负责格式化其内容并输出到STDOUT和STDERR |
syslog | 将日志信息写入syslog日志系统,syslog守护进程必须在主机上运行 |
journald | 将日志信息写入joumald 日志系统,joumald 守护进程必须在主机上运行 |
gelf | 将日志信息写入像Graylog 或 Logstash这样的GELF(Graylog Extended Log Format)终端 |
fluentd | 将日志信息写入fluentd, fuentd守护进程必须在主机上运行 |
splunk | splunk 将日志信息写入使用 HTTP 事件搜集器的 splunk |
使用Docker CE时,docker logs 命令只能用于local、json-file和journald日志驱动。
五、示例
5.1、查看容器中运行的进程的信息
docker top命令查看容器中正在运行的进程的信息,其语法:
docker top 容器 [ps 选项]
容器运行时不一定提供/bin/bash终端来交互执行top命令,而且容器中可能没有top命令
[root@docker ~]# docker run --rm -d --name redis redis
a07c78093b15...
[root@docker ~]# docker top redis
UID PID PPID ... TIME CMD
systemd+ 73452 73433 ... 00:00:00 redis-server *:6379
该命令后面的ps选项是指Linux操作系统ps命令的选项,可用于显示特定信息:例如
docke top redis aux
查看所有正在运行的容器中的进程信息:
for i in `docker ps | grep Up | awk '{print $1}'`;do echo \ && docker top $i;done
5.2、查看容器的资源使用情况
docker stats命令实时查看容器的系统资源使用情况,其语法:
docker stats [选项][容器...]
主要选项有下:
选项 | 说明 |
---|---|
--all(-a) | 显示所有的容器,包括未运行的。默认仅显示正在运行的容器。 |
--format | 根据指定格式显示内容 |
--no-stream | 仅显示第1条记录(只输出当前的状态) |
--no-trunc | 不截断输出,显示完整的信息 |
# 显示正在运行的容器资源使用情况(每隔1s刷新1次输出的内容)
[root@docker ~]# docker stats
CONTAINER ID NAME CPU % MEM USAGE ... BLOCK I/O PIDS
a07c78093b15 redis 0.16% 8.512MiB ... 0B / 0B 5
29d3cb1392b8 great_cannon 0.00% ... 0B / 0B 82
若不想持续监控容器使用资源情况,可通过--no-stream选项只输出当前的状态:
docker stats --no-stream
可以提供容器名称或ID参数查看指定容器的资源使用情况。
通过--format选项自定义输出的内容和格式:
# 仅显示容器名称(.Name)、CPU使用百分比和内存使用百分比。
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
5.3、使用cAdvisor监控容器
cAdvisor是一个开源软件,可以在主机上以原生程序的方式安装,也可以作为容器运行。
5.3.1、启动两个容器作为测试
[root@docker ~]# docker run --rm -d --name redis redis
478c2296b1a...
[root@docker ~]# docker run --rm -d -p 80:80 --name myweb httpd
55b662de612...
5.3.2、创建并启动cAdvisor容器
docker run --privileged \
--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 --name cadvisor google/cadvisor:latest
其中4个 --volume:选项所定义的绑定挂载都不能缺少,否则会无法连接到Docker守护进程;
--publish 8080:8080:示对外暴露8080以提供服务;
--detach:选项表示容器创建以后以分离方式在后台运行,让其自动完成监视功能。
对于运行CentOS或RHEL操作系统的主机来说,应当加上--privileged
选项(容器中的root才拥有真正的root权限)。
5.3.3、访问cAdvisor监控服务
首页显示当前监控的主机信息,包括CPU、内存、网络、文件系统和进程等。
单击"Docker Container"进入相应界面,显示容器列表和Docker信息(相当于docker info命令的输出)
其中"Subcontainers"显示当前正在运行的容器列表。,单击某个容器,进入该容器的监控界面,显示的是容器的CPU、进程、内存等资源使用情况
5.3.4、cAdvisor配置
--storage_duration:历史数据保存的时间,默认为2min
--allow_dynamic_housekeeping:控制cAdvisor如何和何时执行周期性的容器状态收集工作
--global_housekeeping_interval:设置检测是否有新容器的时间周期
--housekeeping_interval:统计每个容器数据的时间周期,默认每1s读取一次数据,选取统计到的最近60个数据
# 将cAdvisor的数据导出到本地文件,存储驱动可以设置为STDOUT,将容器运行于前台,将输出文件导入指定文件:
docker run --volume /:/rootfs:ro \
--volume /var/run:/var/run:rw --volume /sys:/sys:ro \
--volume /var/lib/docker/:/var/docker:ro \
--publish 8080:8080 --detach false --name cadvisor-stdout \
google/cadvisor:latest --storage_driver stdout>>data
当然还可设置相应的存储驱动以及配置参数将数据导出到数据库。
5.4、使用Weave Scope监控容器
功能:
- 实时了解容器状态
- 提供内部细节与深度链接
- 支持容器的交互与管理
- 提供插件进程扩展与定制
5.4.1、安装Weave Scope
(1)创建文件夹并上传weave scope二进制文件
[root@docker ~]# mkdir /usr/local/bin/scope && cd /usr/local/bin/scope
[root@docker scope]# rz
[root@docker scope]# ls
scope.bin
scope.bin资源已上传
(2)修改scope.bin文件为可执行文件
chmod 755 /usr/local/bin/scope/scope.bin
(3)执行文件
[root@docker scope]# ./scope.bin launch
486f2bbd7e0d3ce2cb7bdd96e686ff86519b2cd58a90a9d77ec96892bb071c05
Scope probe started
Weave Scope is listening at the following URL(s):
* http://172.18.0.1:4040/
* http://172.23.0.1:4040/
* http://10.0.0.2:4040/
(4)使用浏览器访问Weave scope界面,主机IP+服务器名:
5.4.2、熟悉Weave Scope操作界面
可以以表格形式显示对象信息:
5.4.3、监控容器
All
表示全部容器、System containers
表示系统容器,包括Weave Scope容器本身;Application containers表示应用容器;Stopped containers和Running containers分别表示已停止的容器和正在运行的容器;Both就是表示两种都显示;Show uncontained和Hide uncontained分别表示显示和隐藏非容器进程
5.4.4、监控主机
此按钮可以打开该主机的shell窗口进程命令行操作。
实验完毕,自行恢复实验环境。
六、使用docker logs命令查看容器日志
对于一个运行中的容器,Docker会将日志发送到容器的STDOUT和STDERR上,可以将STDOUT和STDERR视为容器的控制台终端。
- 如果容器以前台方式运行,日志就会输出到当前的终端端口。
-
如果容器以后台方式运行,使用docker attach连接到后台容器的控制台终端,查看日志(没必要使用)Docker自带的docker logs命令专门查看容器的日志。
docker logs [选项] 容器
其他选项说明如下:
- --details:显示更为详细的日志信息
- --follow(-f):跟踪日志输出
- --since:显示自某个时间开始的所有日志
- --tail:仅列出最新N条容器日志
- --timestamps(-t):显示时间戳
- --until:显示到某个截止时间的所有日志
# 默认输出自容器启动以来完整的日志,加上-f选项可以继续新产生日志,效果与Linux的tail -f命令一样
[root@docker ~]# docker logs -f wordpress
WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html
...
七、配置日志驱动
7.1、配置默认的日志驱动
将daemon.json文件(Linux主机中一般位于/etc/docker目录,Windows中一般位于C:ProgramData\Docker\config)中的log-driver值设为日志驱动名称即可配置驱动。
# 默认的日志驱动是json-file, 下面实例将其设置为syslog
{
"log-driver":"syslog"
}
如果日志驱动有可配置的选项,则可以在daemon.json文件的关键字log-opts中以JSON格式设置。
# 为json-file日志驱动设置了两个可配置选项
{
"log-driver":"json-file",
"log-opts":{
"labels":"production_status",
"env":"os,customer"
}
}
# 默认驱动就是json-file,因此使用docker inspect命令之类的默认输出就是JSON格式
获取当前Docker守护进程的默认日志驱动:
[root@docker ~]# docker info | grep 'Logging Driver'
Logging Driver: json-file
7.2、配置容器的日志驱动
启动容器时,通过--log-driver
选项将其匹配成与Docker守护进程使用不同的日志驱动。如果日志驱动有可配置选项,则可通过一个或多个选项(--log-opt<名称>=<值>)进行设置。
# 启动一个使用none日志驱动的redis容器
[root@docker ~]# docker run --rm -d --log-driver none --name redis redis
82370ee2ba2...
# 通过docker inspect命令找出某容器当前使用的日志驱动:
[root@docker ~]# docker inspect -f '{{.HostConfig.LogConfig.Type}}' redis
none
八、容器日志清理
容器的日志文件会占据大量的磁盘空间。在Linux中,容器日志一般放在/var/lib/docker/containers/container_id目录下以josn.log结尾的文件中。
这里提供一个shell脚本清理正在运行的容器的日志:
#!/bin/sh
log=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean logs:$log"
cat /dev/null>$log
done
根本上解决日志占用空间问题--限制容器的日志大小上限。在deamon.json配置文件中为Docker守护进程设置日志驱动时,可通过log-opts选项来限制日志大小的上限
# 日志大小上限是500MB,容器最多有2个日志文件
"log-driver":"json-file",
"log-opts":{"max-size":"500m","max-file":"2"}
对于某个容器的日志大小限制,可以通过Docker Compose配置文件的max-size选项来实现:
nginx:
image:nginx:1.6
logging:
driver:"josn-file"
options:
max-size:"500m"
九、将容器的日志重定向到Linux日志
9.1、将容器日志记录到syslog
- syslog是Linux标配的日志记录工具,rsyslog是syslog的多线程增强版,也是CentOS7默认的日志系统。
- syslog用来收集系统产生的各种日志,日志文件默认放在/var/log目录下。
-
选择syslog作为日志驱动可将日志定向输出到syslog日志系统中,前提是syslog守护进程必须在容器所在Docker主机运行。
# 使用tail工具实时监控系统日志文件记录到syslog日志文件。
[root@docker ~]# tail -f /var/log/messages
# 打开另一个终端窗口,执行以下操作,将该容器的日志记录到syslog日志文件中
[root@docker ~]# docker run --rm -d --log-driver syslog --name redis redis
# 会到tail监视窗口,发现显示了该容器相应的日志信息
May 11 20:47:46 docker f11da620bbdd[1126]: 1:C 11 May 2024 12:47:46.474 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
May 11 20:47:46 docker f11da620bbdd[1126]: 1:C 11 May 2024 12:47:46.474 * Redis version=7.2.4, bits=64, commit=00000000, modified=0, pid=1, just started
May 11 20:47:46 docker f11da620bbdd[1126]: 1:C 11 May 2024 12:47:46.474 #
...
默认情况,系统在日志数据中使用容器ID的前12个字符来标识容器。
使用docker logs命令获取redis容器的日志信息,会给出:
docker logs redis
9.2、将容器日志记录到journald
journald是一个收集并存储日志数据的systemd日志系统服务,将日志数据存储在带有索引的结构化二进制文件中,便于集中查看和管理,使用journalctl命令查看
选择journald作为日志驱动可将日志定向输出到systemd日志系统中:
docker run --rm -d --log-driver journald --name redis redis
十、使用Logspout收集所有容器的日志
Logspout本身是基于Alpine Linux构建的Docker容器。Docker主机启动一个容器运行Logspout服务,Logspout复制将同一主机上其他容器的日志根据路由设置转发给不同的日志接收端。实际中,Logspout通常将所有容器的全部日志发布到Logstash。这里转发到简单的syslog服务器中为例:
10.1、将所有容器的输出路由到远程syslog
将syslog的URL作为命令即可。这里以本机rsyslog服务作为远程syslog服务器。修改配置文件/etc/rsyslog.conf:
# 将行首的#号去掉
$ModLoad imupd
$UDPServerRun514
这样就运行rsyslog服务在UDP的514端口上接收日志信息了
保存配置,重启rsyslog,然后检查确认514端口已开启
[root@docker ~]# netstat -antup | grep 514
tcp 0 0 10.0.0.2:22 10.0.0.1:51495 ESTABLISHED 8571/sshd: root [pr
udp 0 0 0.0.0.0:514 0.0.0.0:* 11742/rsyslogd
udp6 0 0 :::514 :::* 11742/rsyslogd
启动louspout容器,将日志转发到Docker主机的syslog服务中
[root@docker ~]# docker run --name="logspout" --volume=/var/run/docker.sock:/var/run/docker.sock gliderlabs/logspout syslog+udp://10.0.0.2:514
Unable to find image 'gliderlabs/logspout:latest' locally
latest: Pulling from gliderlabs/logspout
8572bc8fb8a3: Pull complete
bd801371a862: Pull complete
58100c398b34: Pull complete
Digest: sha256:2d81c026e11ac67f7887029dbfd7d36ee986d946066b45c1dabd966278eb5681
Status: Downloaded newer image for gliderlabs/logspout:latest
2024/05/11 13:03:04 # logspout v3.2.14 by gliderlabs
2024/05/11 13:03:04 # adapters: raw syslog tcp tls udp multiline
2024/05/11 13:03:04 # options :
2024/05/11 13:03:04 persist:/mnt/routes
2024/05/11 13:03:04 # jobs : pump routes http[health,logs,routes]:80
2024/05/11 13:03:04 # routes :
# ADAPTER ADDRESS CONTAINERS SOURCES OPTIONS
# syslog+udp 10.0.0.2:514 map[]
logspout容器要访问守护进程来获取日志信息,因此将Docker主机的UNIX Socket挂载到容器内部
打开一个终端窗口,使用tail工具监控系统日志文件/var/log/messages:
tail -f /var/log/messages
打开另一个窗口,执行以下命令启动一个redis容器
docker run --rm -d --name redis redis
回到tail监控窗口,会发现显示了关于该容器输出的日志信息,再使用docker logs获取redis容器的日志信息,两者完全一致。实验完毕,关闭删除容器。
10.2、通过HTTP查看Logsput收集的日志
只需读取HTTP数据流,即可实时查看生成的聚合日志。使用Logspout的HTTP流模块:
[root@docker ~]# docker run -d --name="logspout" --volume=/var/run/docker.sock:/var/run/docker.sock --publish=127.0.0.1:8000:80 gliderlabs/logspout
# 使用curl观察容器的日志流
[root@docker ~]# curl http://127.0.0.1:8000/logs
打开另一个终端,执行容器操作。切回前面的终端窗口,会发现关于容器操作的日志流,如果收集到多个容器的日志流,则将以不同的颜色显示不同容器的日志
致谢
在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。
学习永无止境,让我们共同进步!!