目录
- 前言
- 排查
- 总结
前言
今天服务器发送了磁盘告警通知,于是打开了尘封已久的电脑连上了公司服务器,服务器跑的是一个 Docker Swarm 集群(正是集群中的某一台服务器发生告警),告警的服务器上运行了多个游戏后台程序。一看到捕鱼
游戏的程序,想都不用想(连打一条鱼都能产生日志的游戏),肯定就是它在搞鬼。于是进入该模块的数据持久化目录下查看其磁盘占用情况,结果发现就占用了 4 个多 G 不到 5 个 G,且其他容器(模块)的日志也是比较小的(几百兆)。
于是就去查看 Docker 的引擎日志,结果就是 Docker 引擎日志占用的服务器磁盘空间,接下来看看具体的排查步骤。
排查
1、先查看各游戏模块的数据持久化目录数据大小
其他模块日志的大小均小于当前查询模块的值,所以排除容器日志占用的服务器磁盘空间。
du -h --max-depth=1 ./
2、接着查看 Docker 引擎日志(或叫驱动程序日志)
整体来说,Docker 日志无非就两类 =>
容器日志
和驱动程序日志
,第一步排查的就属于容器日志
。驱动程序位于 Docker 服务的数据目录下的 container 目录下(我当前 Docker 服务的数据目录位于 /data/docker/ 下)。
进入对应目录后,查看该目录下对应的目录大小,下图可见 container 就是 Docker 的驱动程序日志目录,占了 140G。
du -h --max-depth=1 ./
3、进入 container 目录并查看具体是哪个容器服务产生的大数据量的驱动程序日志
首先你要清楚的是,缺省情况下的 Docker 日志驱动程序为 json-file,常见的驱动程序还有 syslog、fluentd、gelf 等。
下图可见,容器 ID 为
d99611...
产生了 128 G 的驱动程序日志(这里要清楚的是每个容器都会产生驱动程序日志)。
du -sh * | sort -nr | head
4、进入该容器 ID 目录并再次确认日志大小
很显然,我的日志驱动程序是 json-file 类型的,我们只需清空该日志即可释放其占用的磁盘空间
du -sh * | sort -nr | head
5、清空该程序驱动日志
这里要注意:尽量不要使用 rm -rf 来删除日志文件(可能空间没有真正的释放,需重启 Docker 服务)。
因此我们使用一个空值进行覆盖即可(无需重启)释放磁盘空间占用。
清理后我们可见日志文件大小瞬间变为 16K。
总结
1、Docker 日志分类
-
容器的 stdout 和 stderr
这些日志由在 Docker 容器中运行的应用程序生成。stdout 通常包含应用程序的正常输出,而 stderr 包含错误和异常信息。这些日志是最常见的 Docker 日志,它们可以通过 Docker 命令或 Docker API 进行访问。
-
Docker 守护进程日志
Docker 守护进程本身也会生成日志,用于记录容器的创建、启动、停止等活动。这些日志通常包含 Docker 守护进程的运行状态和错误信息。它们通常被记录在守护进程的日志文件中,文件位置因操作系统而异(如
/var/log/docker.log
)。 -
容器日志文件
Docker 容器内部的日志通常存储在容器的文件系统中。这些日志文件由容器内运行的应用程序生成,其位置和格式取决于应用程序的配置。你可以通过进入容器并查看这些文件来访问容器内部的日志。
-
Docker 日志驱动程序
Docker 支持不同的日志驱动程序,用于将容器的日志输出发送到不同的目标。常见的日志驱动程序包括
json-file、journald、syslog、fluentd、gelf、splunk
等。每个驱动程序都有自己的配置选项和目标,允许你将日志发送到特定的日志聚合工具或目标。
2、如何查看你 Docker 当前的日志驱动程序
全局查看 Docker 的日志驱动程序
docker info
# 或
docker info |grep "Logging Driver"
# 或
docker info --format '{{.LoggingDriver}}'
如何查看某个容器的日志驱动程序呢?
docker inspect -f '{{.HostConfig.LogConfig.Type}}' <你的容器ID>
3、如何指定设置 Docker 容器的日志驱动程序?
-
运行容器时指定日志驱动
场景:在运行少量容器服务时可这样操作
注意:该操作的优先级高于全局配置的优先级
docker run -it --log-driver none alpine ash # --log-driver:指定驱动程序 # none:驱动程序名
-
在 Docker 服务进行全局配置
场景:在运行大量容器服务时可这样操作
注意1:修改后需重新启动 Docker 以使更改对新创建的容器生效。现有容器不使用新的日志记录配置。
注意2:daemon.json 配置文件中的 log-opts 配置必须以字符串类型的方式配置(因此数字也必须引号引起来)。
{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3", "labels": "production_status", "env": "os,customer" } } # 说明 # log-driver:指定日志驱动程序 # log-opts:配置日志文件大小、文件个数及相关自定义标签等 # max-size:限制日志文件最大大小 # max-file:限制日志文件最多个数
4、Docker 支持的日志记录驱动程序
看官方文档:https://docs.docker.com/config/containers/logging/configure/
在生产环境中,通常会将容器的日志输出发送到集中式日志系统,以便集中存储、分析和监控。常见的集中式日志系统包括Elasticsearch、Logstash、Kibana(ELK堆栈)、Fluentd、Graylog、Splunk 等。
比如将 Docker 驱动程序日志发送到 ELK,可这样配置:
{
"log-driver": "syslog",
"log-opts": {
"syslog-address": "udp://<logstash-host>:<logstash-port>"
}
}
—END