Docker 简明教程

Docker - Logging

Docker 日志对于维护和故障排除在容器内运行的应用程序至关重要。它们提供对容器行为和性能的实时洞察,以帮助识别问题,从而优化性能。它们捕获足够广泛的信息,涵盖应用程序和 Docker 引擎可能产生的错误、警告和信息性消息。此数据有利于调试:利用此功能,开发人员可以追踪哪些事件已经发生并导致特定问题,理解上下文并应用修复措施。

此外,Docker 日志在监控和审计中具有重要意义。应该收集和持续分析日志,以确保应用程序平稳安全地运行。它检测异常情况和未经授权的访问(以及其他安全威胁),以便可以及时应对潜在的漏洞。

Docker 日志使系统具备至关重要的可见性并控制任何系统管理职能,以便在生产环境中维护系统的弹性和鲁棒性,在这里,正常运行时间和可靠性至关重要。

在本章中,让我们详细了解 Docker 日志和日志记录驱动程序。

How is Docker Logging Different?

由于 Docker 的容器化性质,Docker 日志不同于传统日志。我们来看看基本差异。

Centralization and Aggregation

传统日志记录通常涉及从各个服务器或应用程序收集日志,随着服务器和应用程序数量持续增长,这些日志往往会扩展开来,并且会随着时间的推移而变得繁琐。相比之下,Docker 日志记录通常涉及集中和聚合从跨多个主机运行的多个容器收集的日志。

在集中式方法中,这将简化日志管理,即使在复杂且分布式的环境中,它也能使从单点监视或分析日志变得容易。

Log Drivers and Plugins

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

Ephemeral Nature of Containers

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

持久性对于维护事件历史的完整时间顺序至关重要,即使在容器被移除或替换后,也可以访问关键的诊断信息。这些细微差别说明了一件事:Docker 日志记录专为与容器化环境关联的动态和可扩展属性而设计。它反映在围绕集中式日志管理的解决方案中,从而使日志数据可用。

Docker Logging Strategies and Best Practices

活动日志记录是管理或支持你的 Docker 化应用程序的一个基本过程。日志条目对应用程序的行为、性能和问题提供令人难以置信的见解,从而能够主动管理并快速进行故障排除。

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

Logging Through the Application

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

Advantages of Logging through the Application

  1. Ease of Implementation − 执行起来很容易,无需其他配置。

  2. Portability − Docker 的日志记录可以轻松地本地访问日志。

  3. Compatibility − 与任何可以配置为将日志输出到 stdout 和 stderr 的应用程序配合良好。

Best Practices

  1. Structured Logging − 由于是结构化格式(即 JSON 日志),因此能够更好地解析和分析日志。

  2. Log Rotation − 使用应用程序的日志轮换来限制日志文件膨胀。

  3. Log Levels − 设置适当的日志级别(例如,调试、信息、警告、错误)以指定日志的详细程度。

Data Volumes Logging

另一种方法是拥有 Docker 数据卷,其中存储日志。如果你将数据卷附加到一个目录中,该目录在该容器内会写出日志,那么你可以确信它能承受容器的移除或重新启动。

Advantages of Data Volumes Logging

  1. Persistence − 不会因容器的销毁和重新创建而丢失日志。

  2. Separation of Concerns − 将日志存储保持在容器化应用程序之外。

  3. Flexibility − 外部日志管理工具可以直接从数据卷访问和处理日志。

Best Practices

  1. Volume Management − 监视和管理日志卷大小以确保磁盘空间不是问题。

  2. Backup and Retention − 实施你组织的日志记录备份策略及其保留策略。

  3. Access Controls − 保护日志卷免遭未经授权的访问。

Logging with the Docker Logging Driver

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

Advantages of Logging with the Docker Logging Driver

  1. Centralized Logging − 轻松从多个主机和容器收集日志。

  2. CI/CD Integration − 包括与现有基础设施和日志记录工具的集成。

  3. Scalability − 它支持多种日志存储后端和服务。

Best Practices

  1. Picking a Driver − 选择一种与您的日志基础架构和您的需求相符的日志记录驱动程序。

  2. Configuration − 已配置日志记录驱动程序,以确保提供最佳性能和可靠性。

  3. Monitoring − 持续观察驱动程序是否存在错误或日志记录问题。

Logging with a Specific Logging Container

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

Advantages

  1. Isolation − 日志记录问题仍然与其从应用程序容器中的上下文隔离有关。

  2. Scalability − 它独立于应用程序容器。

  3. Flexibility − 支持复杂的日志处理和转发配置。

Best Practices

  1. Resource Allocation − 分配足够的日志记录容器资源来处理日志卷。

  2. Network Configuration − 设置网络以在容器之间安全有效地传输日志。

  3. Redundancy − 为日志记录容器引入冗余和故障转移功能。

Logging Through the Sidecar approach

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

Benefits

  1. Proximity − 它可以确保低延迟收集日志,因为主容器被放置在靠近应用程序的地方。

  2. Modularity − 可以独立扩展和管理日志记录功能。

  3. Consistency − 在所有环境中使用相同的日志记录配置。

Best Practices

应在主容器和辅助容器之间进行适当的同步。

  1. Resource Allocation − 为辅助容器分配足够的资源,用于日志处理。

  2. Observability − 观察和监控主容器和辅助容器的运行状况和功能。

How to Work With Docker Container Logs Using the Docker Logs Command?

管理和访问日志是使用 Docker 容器的重要组成部分。因此,本指南将带您了解如何将 docker logs 命令与实际示例和最佳实践相结合使用。

Basic Usage of the Docker Logs Command

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

$ docker logs [OPTIONS] CONTAINER

此处,CONTAINER 代表要查看其日志的容器的名称或 ID。

Viewing Logs

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

$ docker logs my-container

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

Log Streaming in Real Time

-f--follow 标志将允许您查看正在运行的日志,这类似于在类似 Unix 的系统中对某个日志执行“tail -f”。它会立即从履带取下您的日志:

$ docker logs -f my-container

Tail Logs

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

$ docker logs --tail 100 my-container

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

Timestamped Logs

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

$ docker logs -t my-container

Combining Options

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

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

Filtering Logs by Date

虽然 docker logs 命令不支持从日志中过滤日期,但借助 Unix grep 命令可以实现此目的。下面是一个演示示例:

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

此命令从 my-container 中的日志进行筛选,仅显示包含 2024-06-01 日期的那部分。

Saving Logs to a File

您还可以将这些日志保存到文件中,以便稍后进行分析或归档:

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

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

Log Rotation

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

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

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

What is a Logging Driver?

Docker 日志记录驱动程序是一种将源自 Docker 容器的日志消息定向到特定位置,并以特定方式发送日志消息的方法。默认情况下,Docker 从每个容器的标准输出 (stdout) 和标准错误 (stderr) 流中捕获日志。

日志记录驱动程序指定将这些日志定向到哪里:本地文件上、远处的服务器上,或可能连接到实际日志记录系统外部的服务。Docker 还支持多个日志记录驱动程序,以实现可扩展且灵活的日志管理解决方案。

How to Configure the Docker Logging Driver?

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

Configure Docker Logging Driver for Daemon

要设置默认值,从而控制在 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

Using a Logging Driver for Individual Containers

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

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

还可以指定以下内容以选择更多日志记录选项:

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

Where are Docker logs saved by default?

默认情况下,Docker 使用日志记录驱动程序:json-file。此格式的日志文件将被丢弃到 /var/lib/docker/containers/<container-id>/ 上主机的目录中。每个容器将有一个这样的目录。日志将被写入名为 <container-id>-json.log 的文件中。

What Are Modes of Delivery?

传递模式仅定义了日志消息如何在 Docker 中传递给其最终目的地。两个主要传递模式受日志记录驱动程序支持:

Blocking (default)

在阻塞模式中,消息将同步传递。容器内的发送进程将被暂停,直到日志记录驱动程序确认已经处理了日志消息。从消息离开容器的角度来看,它很可靠。但是,如果日志记录后端很慢或不可用,这在性能方面可能会很痛苦。

Non-blocking

在非阻塞传递中,容器进程不会等待日志记录驱动程序处理日志消息,这会以牺牲日志丢失为代价来提高性能,以防日志记录驱动程序或其后端无法处理数据速率。激活非阻塞模式的一种方法是使用模式日志记录选项。

设置非阻塞模式的示例:

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

Docker Logging Driver Options/Flags

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

json-file

  1. max-size − 日志文件在轮换之前允许达到的最大尺寸。

  2. max-file − 要保留的最大日志文件数。

$ docker run --log-driver=json-file --log-opt max-size=10m
   --log-opt max-file=3 my-container

syslog

  1. syslog-address − 将发送 syslog 消息的服务器地址。

  2. syslog-facility − 要使用的 syslog 功能(例如:守护程序、用户)。

  3. syslog-tls-ca-cert − CA 证书在 TLS 计算机上的路径。

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

Fluentd

  1. fluentd-address − Fluentd 服务器地址。

  2. fluentd-async-connect − 异步连接到 Fluentd。

  3. 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

  1. awslogs-region − AWS 所在的区域。

  2. awslogs-group − CloudWatch Logs 组的名称。

  3. awslogs-stream − CloudWatch 日志流的名称。

$ 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

Conclusion

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

FAQ

Q 1. What is the default logging driver in Docker, and how does it work?

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

Q 2. Can I customize the way Docker handles logs?

当然可以!Docker 提供了多种日志驱动程序供您选择,每种驱动程序都有其独特的功能和行为。您可以选择发送日志到集中式日志服务(如 Syslog 或 Fluentd)的驱动程序,以便进行简化的管理和分析。如果现有的驱动程序都不能完美地满足您的需求,您甚至可以选择创建一个针对您的特定要求量身定制的自定义日志驱动程序。

Q 3. How do I view logs for a running Docker container?

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

Q 4. What are some best practices for logging in Docker?

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

使用诸如 JSON 的结构化格式,简化日志解析和查询,同时设置日志轮换策略或使用自动管理日志大小的驱动程序,可以防止出现存储问题。最后,主动监视日志记录有助于快速检测问题、安全威胁或性能瓶颈。

Q 5. How can I troubleshoot common logging issues in Docker?

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

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