Docker - 日志记录



Docker 日志对于维护和排查在容器中运行的应用程序至关重要。它们提供对容器行为和性能的实时洞察,有助于识别问题并优化性能。它们捕获的信息范围广泛,涵盖应用程序和 Docker 引擎可能产生的错误、警告和信息性消息。这些数据对调试非常有用:开发人员可以使用这些数据来追踪导致特定问题的事件,了解上下文并应用修复。

此外,Docker 日志在监控和审计中具有重要意义。应收集并持续分析日志,以确保应用程序平稳安全地运行。它可以检测异常和未授权访问等安全威胁的发生,以便可以快速响应潜在的漏洞。

Docker 日志使系统能够获得必要的可见性和控制能力,以便对系统进行适当的管理,以维持生产环境中系统(其中正常运行时间和可靠性至关重要)的弹性和稳健性。

在本章中,让我们进一步了解 Docker 日志和日志驱动程序。

Docker 日志有何不同?

由于 Docker 的容器化特性,Docker 日志与传统日志有所不同。让我们看看基本区别。

集中和聚合

传统日志记录通常涉及从单个服务器或应用程序收集日志,随着服务器和应用程序数量的增加,这种方式往往难以扩展,并会变得越来越麻烦。相比之下,Docker 日志记录通常涉及集中和聚合来自在各种主机上运行的多个容器的日志。

在集中式方法中,这将简化日志管理,并使即使在复杂和分布式环境中也能轻松地从单点监视或分析日志。

日志驱动程序和插件

Docker 提供广泛的日志驱动程序和插件,用于定制收集、存储和处理日志的方式。这些日志驱动程序允许将日志发送到不同的存储位置——JSON 文件、Syslog、Fluentd、AWS CloudWatch 等。这样,可以提供多种选项来调整日志设置以满足特定的需求和偏好,并与现有的日志记录和监控工具无缝集成。

容器的短暂性

容器是短暂的;它们旨在具有较短的生命周期,并可以暂停、停止或删除。这种短暂的特性似乎是传统日志记录方法的瓶颈,传统方法主要依赖于主机系统的持久本地存储。Docker 通过在容器生命周期之外存储日志来解决这个问题。

持久性对于维护完整的事件历史记录至关重要,即使在删除或替换容器后,也可以访问这些关键诊断信息。这些细微的差异突显了一点:Docker 日志记录专为与容器化环境相关的动态和可扩展特性而设计。它体现在围绕集中式日志管理的解决方案中,从而使日志数据可用。

Docker 日志记录策略和最佳实践

主动日志记录是管理或支持 Docker 化应用程序的重要流程。日志条目提供了对应用程序行为、性能和问题的宝贵洞察,从而允许主动管理和快速故障排除。

Docker 提供了几种管理日志记录的方法,每种方法都有其优点和合适的用例。让我们逐一讨论它们。

通过应用程序进行日志记录

从 Docker 化应用程序进行日志记录最简单的方法实际上是通过应用程序本身。这可以通过将其设置为使用标准输出 (stdout) 和标准错误 (stderr) 来进行日志记录来实现。Docker 收集这些输出,因此您可以使用 docker logs 命令轻松检索日志。

通过应用程序进行日志记录的优点

  • 易于实现 - 易于执行,无需额外配置。
  • 可移植性 - 可以通过 Docker 的日志记录本地轻松访问日志。
  • 兼容性 - 与可以配置为将日志输出到 stdout 和 stderr 的任何应用程序都很好地配合使用。

最佳实践

  • 结构化日志记录 - 由于采用结构化格式(即 JSON 日志),因此可以更好地解析和分析日志。
  • 日志轮换 - 通过应用程序使用日志轮换来限制日志文件膨胀。
  • 日志级别 - 设置适当的日志级别(例如,调试、信息、警告、错误)以指定日志的详细程度。

数据卷日志记录

另一种方法是使用 Docker 数据卷来存储日志。如果您将卷附加到容器内部写入日志的目录,则可以确信它将能够承受容器的删除或重新启动。

数据卷日志记录的优点

  • 持久性 - 日志不会因容器的销毁和重新创建而丢失。
  • 关注点分离 - 将日志存储与容器化应用程序分开。
  • 灵活性 - 外部日志管理工具可以直接从卷访问和处理日志。

最佳实践

  • 卷管理 - 监控和管理日志卷大小,以确保磁盘空间不是问题。
  • 备份和保留 - 实施组织的日志备份策略及其保留策略。
  • 访问控制 - 保护日志卷免受未授权访问。

使用 Docker 日志驱动程序进行日志记录

Docker 包含许多内置的日志驱动程序,这些驱动程序提供了灵活的选项,用于将容器日志发送到各种目标:syslog、journald、Fluentd 和 AWS CloudWatch 等。它可以在守护程序和容器级别进行配置。

使用 Docker 日志驱动程序进行日志记录的优点

  • 集中式日志记录 - 轻松收集来自多个主机和容器的日志。
  • CI/CD 集成 - 包括与现有的日志记录基础设施和工具的集成。
  • 可扩展性 - 它支持多个日志存储后端和服务。

最佳实践

  • 选择驱动程序 - 选择与您的日志记录基础设施和需求相匹配的日志记录驱动程序。
  • 配置 - 配置日志驱动程序以确保交付的性能和可靠性达到最佳状态。
  • 监控 - 持续监控驱动程序是否存在日志记录错误或问题。

使用特定日志记录容器进行日志记录

日志记录容器是专用的,这意味着它可以从主机上的所有其他容器收集日志。这通常意味着容器运行日志代理(如 Fluentd 或 Logstash),并聚合并将日志发送到中央日志系统。

优点

  • 隔离 - 日志记录问题与其上下文隔离,与应用程序容器分开。
  • 可扩展性 - 它独立于应用程序容器。
  • 灵活性 - 支持复杂的日志处理和转发配置。

最佳实践

  • 资源分配 - 为日志记录容器分配足够的资源以处理日志量。
  • 网络配置 - 设置网络以实现容器之间安全有效的日志传输。
  • 冗余 - 为日志记录容器引入冗余和故障转移功能。

通过 Sidecar 方法进行日志记录

Sidecar 容器与 Kubernetes 或 Docker 设置中的同一 pod 中的主应用程序容器一起运行。Sidecar 容器的职责包括收集、处理和转发应用程序日志。

优点

  • 接近性 - 由于主容器靠近应用程序,因此它确保以低延迟收集日志。
  • 模块化 - 日志记录功能可以独立扩展和管理。
  • 一致性 - 在所有环境中都具有相同的日志记录配置。

最佳实践

主容器和 Sidecar 容器之间应进行正确的同步。

  • 资源分配 - 为 Sidecar 容器分配足够的资源进行日志处理。
  • 可观察性 - 观察和监控主容器和 Sidecar 容器的运行状况和功能。

如何使用 Docker Logs 命令使用 Docker 容器日志?

管理和访问日志是使用 Docker 容器的重要组成部分。docker logs 命令提供了一种方便的方法来访问和查看正在运行的容器日志。因此,本指南将引导您学习如何使用 docker logs 命令以及实际示例和最佳实践。

Docker Logs 命令的基本用法

docker logs 命令用于获取容器的日志。语法很简单,例如:

$ docker logs [OPTIONS] CONTAINER

这里,CONTAINER 代表您要查看其日志的容器的名称或 ID。

查看日志

要查看容器的日志,我们必须使用 docker logs 命令,然后是容器的名称或 ID。例如:

$ docker logs my-container

以下命令将显示容器 my-container 生成的所有日志。

实时日志流

-f--follow 标志将允许您查看正在运行的日志,这就像在类 Unix 系统中对日志执行“tail -f”一样。它会立即显示您的日志:

$ docker logs -f my-container

尾部日志

如果您只想查看最新的日志记录,请使用 --tail 选项:这在管理大量日志文件时非常方便。

$ docker logs --tail 100 my-container

此命令将获取 my-container 的最后 100 行日志。

带时间戳的日志

对带时间戳的日志使用 -t--timestamps 选项。此选项会在每个日志条目中引入时间戳,以便更容易关联事件:

$ docker logs -t my-container

组合选项

然后可以组合多个选项来创建自定义日志视图。例如,如果您想查看包含时间戳且限制为最后 50 个条目的日志条目,可以使用 −

$ docker logs -f -t --tail 50 my-container

按日期过滤日志

虽然 docker logs 命令不支持从日志中过滤日期,但这可以使用 Unix grep 命令来实现。以下是一个演示示例 −

$ docker logs my-container | grep "2024-06-01"

此命令过滤 my-container 的日志,只显示包含 2024-06-01 日期的内容。

将日志保存到文件

您还可以将这些日志保存到文件中,以便后续分析或存档 −

$ docker logs my-container > my-container-logs.txt

此命令将 my-container 的所有日志记录到名为 my-container-logs.txt 的文件中。

日志轮转

Docker 本身并不执行日志轮转。因此,日志文件的大小可能会变得非常大。Docker 日志驱动程序选项可以配置日志轮转。例如,日志文件的限制大小和日志文件的数量:在您的 `docker-compose.yml` 文件或 `daemon.json` 中添加以下内容 −

{
   "log-driver": "json-file",
   "log-opts": {
      "max-size": "10m",
      "max-file": "3"
   }
}

它将每个日志文件的大小限制为 10 MB,最多保留三个日志文件。

什么是日志驱动程序?

Docker 日志驱动程序是将来自 Docker 容器的日志消息定向到特定位置并以特定方式进行的一种手段。默认情况下,Docker 会捕获每个容器的标准输出 (stdout) 和标准错误 (stderr) 流中的日志。

日志驱动程序指定将这些日志定向到哪里:本地文件、远程服务器,或者可能是与实际日志系统外部的服务的挂钩。Docker 还支持多个日志驱动程序,以提供可扩展和灵活的日志管理解决方案。

如何配置 Docker 日志驱动程序?

您可以在 Docker 守护程序级别和每个容器的基础上配置日志驱动程序。

配置 Docker 守护程序的日志驱动程序

要设置默认值,从而控制在 Docker 守护程序上管理的所有容器,可以使用 daemon.json 配置文件。通常,此文件位于 Linux 系统上的 /etc/docker/daemon.json。例如,以下是如何将其设置为记录到 'JSON-file' 驱动程序 −

{
   "log-driver": "json-file",
   "log-opts": {
      "max-size": "10m",
      "max-file": "3"
}

然后,要应用更改,必须通过运行以下命令重新启动 Docker 守护程序 −

$ sudo systemctl restart docker

为单个容器使用日志驱动程序

在启动容器时使用 --logdriver 选项可以覆盖默认日志驱动程序。例如,要使用 syslog 日志驱动程序,可以添加以下行 −

$ docker run --log-driver=syslog my-container

还可以指定以下内容以选择更多日志选项 −

$ docker run --log-driver=syslog --log-opt syslog-address=udp://127.0.0.1:514 my-container

Docker 日志默认保存在哪里?

默认情况下,Docker 使用日志驱动程序:json-file。这种格式的日志文件将被放到主机上的 /var/lib/docker/containers// 目录中。每个容器都将拥有其中一个目录。日志写入名为 -json.log 的文件中。

交付模式是什么?

交付模式仅定义如何在 Docker 中将日志消息传递到其最终目的地。日志驱动程序支持两种主要的交付模式 −

阻塞模式(默认)

在阻塞模式下,消息是同步交付的。容器内的发送进程将暂停,直到日志驱动程序确认已处理到日志的消息。就消息从容器中转出而言,它是可靠的。但是,如果日志后端速度慢或不可用,这可能会影响性能。

非阻塞模式

在非阻塞交付中,容器进程不会等待日志驱动程序处理日志消息,这提高了性能,但代价是,如果日志驱动程序或其后端无法处理数据速率,则可能会丢失日志。激活非阻塞模式的一种方法是使用 mode 日志选项。

设置非阻塞模式的示例 −

$ docker run --log-driver=json-file --log-opt mode=non-blocking my-container

Docker 日志驱动程序选项/标志

Docker 日志驱动程序提供了许多选项或标志,可以使用它们根据自己的需要进行配置。以下是一些常见可能性和常用日志驱动程序 −

json-file

  • max-size − 日志文件在轮转之前的最大大小。
  • max-file − 要保留的最大日志文件数量。
$ docker run --log-driver=json-file --log-opt max-size=10m 
   --log-opt max-file=3 my-container

syslog

  • syslog-address − 将发送 syslog 消息的服务器地址。
  • syslog-facility − 要使用的 syslog 设施(例如,daemon、user)。
  • syslog-tls-ca-cert − 机器上 TLS 的 CA 证书的路径。
$ docker run --log-driver=syslog --log-opt syslog-address=udp://127.0.0.1:514 
   --log-opt syslog-facility=daemon my-container

Fluentd

  • fluentd-address − Fluentd 服务器地址。
  • fluentd-async-connect − 异步连接到 Fluentd。
  • fluentd-buffer-limit − 设置 Fluentd 的缓冲区限制。
$ docker run --log-driver=fluentd --log-opt fluentd-address=localhost:24224 
   --log-opt fluentd-async-connect=true my-container

AWS-Logs

  • awslogs-region − AWS 的区域。
  • awslogs-group − CloudWatch Logs 组的名称。
  • awslogs-stream − CloudWatch Logs 流的名称。
$ docker run --log-driver=awslogs --log-opt awslogs-region=us-east-1 
   --log-opt awslogs-group=my-log-group 
   --log-opt awslogs-stream=my-log-stream my-container

结论

通过使用 Docker 提出的多种日志记录方法,从应用程序级日志记录和数据卷到高级日志驱动程序和流行的 sidecar,开发人员和系统管理员可以根据他们面临的需求和操作要求调整日志记录设置。它们各自具有优点——从简单易扩展到与外部日志系统集成,从而在异构环境中提供全面的日志管理。

常见问题

问题 1. Docker 中的默认日志驱动程序是什么,它是如何工作的?

在 Docker 中,json-file 驱动程序充当默认日志记录机制。此驱动程序捕获容器生成的日志,并将它们存储为 JSON 对象,每个容器都有其专用日志文件。这种结构化格式便于解析和分析日志数据,但如果这些文件没有得到有效管理,则需要注意潜在的存储问题。

问题 2. 我可以自定义 Docker 处理日志的方式吗?

当然!Docker 提供各种日志驱动程序供选择,每个驱动程序都具有独特的特性和行为。您可以选择将日志发送到 Syslog 或 Fluentd 等集中式日志服务的驱动程序,以便进行简化的管理和分析。如果现有的驱动程序都不完全符合您的需求,您甚至可以选择创建适合您特定要求的自定义日志驱动程序。

问题 3. 如何查看正在运行的 Docker 容器的日志?

查看正在运行的容器的日志是一项简单的任务。您可以使用 docker logs 命令,后跟容器的名称或 ID 来显示日志。要实时监控日志,请包含 --follow 选项。如果您只想查看最新的条目,请使用 --tail 选项来限制输出。对于更高级的过滤或分析,您可能需要探索专门为 Docker 设计的第三方日志记录工具。

问题 4. Docker 日志记录的一些最佳实践是什么?

Docker 中有效的日志记录涉及几个关键实践。首先,将多个容器的日志集中到一个统一的位置可以大大简化管理和分析。根据您的基础架构和特定要求选择合适的日志驱动程序也至关重要。这包括平衡性能和驱动程序所需的特性等因素。

使用 JSON 等结构化格式可以简化日志解析和查询,而设置日志轮转策略或使用自动管理日志大小的驱动程序可以防止存储问题。最后,主动监控您的日志可以帮助您及时发现问题、安全威胁或性能瓶颈。

问题 5. 如何排除 Docker 中常见的日志记录问题?

在遇到 Docker 中的日志记录问题时,首先检查您选择的日志驱动程序及其配置设置。确保日志文件正在写入正确的位置,并且权限已正确配置。如果您正在使用远程日志驱动程序,请确认网络连接已建立。

在某些情况下,只需重新启动容器或 Docker 守护程序即可解决问题。如果问题仍然存在,请参考您特定日志驱动程序的文档或寻求 Docker 社区论坛的帮助。

广告