你真的了解 Docker 日志吗?

你真的了解 Docker 日志吗?_第1张图片


目录

    • 前言
    • 排查
    • 总结


前言

今天服务器发送了磁盘告警通知,于是打开了尘封已久的电脑连上了公司服务器,服务器跑的是一个 Docker Swarm 集群(正是集群中的某一台服务器发生告警),告警的服务器上运行了多个游戏后台程序。一看到捕鱼游戏的程序,想都不用想(连打一条鱼都能产生日志的游戏),肯定就是它在搞鬼。于是进入该模块的数据持久化目录下查看其磁盘占用情况,结果发现就占用了 4 个多 G 不到 5 个 G,且其他容器(模块)的日志也是比较小的(几百兆)。

于是就去查看 Docker 的引擎日志,结果就是 Docker 引擎日志占用的服务器磁盘空间,接下来看看具体的排查步骤。

排查

1、先查看各游戏模块的数据持久化目录数据大小

其他模块日志的大小均小于当前查询模块的值,所以排除容器日志占用的服务器磁盘空间。

du -h --max-depth=1 ./

image-20230909204323801

2、接着查看 Docker 引擎日志(或叫驱动程序日志)

整体来说,Docker 日志无非就两类 => 容器日志驱动程序日志,第一步排查的就属于容器日志

驱动程序位于 Docker 服务的数据目录下的 container 目录下(我当前 Docker 服务的数据目录位于 /data/docker/ 下)。

进入对应目录后,查看该目录下对应的目录大小,下图可见 container 就是 Docker 的驱动程序日志目录,占了 140G。

du -h --max-depth=1 ./

你真的了解 Docker 日志吗?_第2张图片

3、进入 container 目录并查看具体是哪个容器服务产生的大数据量的驱动程序日志

首先你要清楚的是,缺省情况下的 Docker 日志驱动程序为 json-file,常见的驱动程序还有 syslog、fluentd、gelf 等。

下图可见,容器 ID 为 d99611... 产生了 128 G 的驱动程序日志(这里要清楚的是每个容器都会产生驱动程序日志)。

du -sh * | sort -nr | head

你真的了解 Docker 日志吗?_第3张图片

4、进入该容器 ID 目录并再次确认日志大小

很显然,我的日志驱动程序是 json-file 类型的,我们只需清空该日志即可释放其占用的磁盘空间

du -sh * | sort -nr | head

你真的了解 Docker 日志吗?_第4张图片

5、清空该程序驱动日志

这里要注意:尽量不要使用 rm -rf 来删除日志文件(可能空间没有真正的释放,需重启 Docker 服务)。

因此我们使用一个空值进行覆盖即可(无需重启)释放磁盘空间占用。

清理后我们可见日志文件大小瞬间变为 16K。

你真的了解 Docker 日志吗?_第5张图片

总结

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 日志吗?_第6张图片

如何查看某个容器的日志驱动程序呢?

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/

你真的了解 Docker 日志吗?_第7张图片

在生产环境中,通常会将容器的日志输出发送到集中式日志系统,以便集中存储、分析和监控。常见的集中式日志系统包括Elasticsearch、Logstash、Kibana(ELK堆栈)、Fluentd、Graylog、Splunk 等。

比如将 Docker 驱动程序日志发送到 ELK,可这样配置:

{
  "log-driver": "syslog",
  "log-opts": {
    "syslog-address": "udp://:"
  }
}

—END

你可能感兴趣的:(Docker,docker,容器,运维)