Docker 简明教程
Docker - Logging
Docker 日志对于维护和故障排除在容器内运行的应用程序至关重要。它们提供对容器行为和性能的实时洞察,以帮助识别问题,从而优化性能。它们捕获足够广泛的信息,涵盖应用程序和 Docker 引擎可能产生的错误、警告和信息性消息。此数据有利于调试:利用此功能,开发人员可以追踪哪些事件已经发生并导致特定问题,理解上下文并应用修复措施。
此外,Docker 日志在监控和审计中具有重要意义。应该收集和持续分析日志,以确保应用程序平稳安全地运行。它检测异常情况和未经授权的访问(以及其他安全威胁),以便可以及时应对潜在的漏洞。
Docker 日志使系统具备至关重要的可见性并控制任何系统管理职能,以便在生产环境中维护系统的弹性和鲁棒性,在这里,正常运行时间和可靠性至关重要。
在本章中,让我们详细了解 Docker 日志和日志记录驱动程序。
How is Docker Logging Different?
由于 Docker 的容器化性质,Docker 日志不同于传统日志。我们来看看基本差异。
Centralization and Aggregation
传统日志记录通常涉及从各个服务器或应用程序收集日志,随着服务器和应用程序数量持续增长,这些日志往往会扩展开来,并且会随着时间的推移而变得繁琐。相比之下,Docker 日志记录通常涉及集中和聚合从跨多个主机运行的多个容器收集的日志。
在集中式方法中,这将简化日志管理,即使在复杂且分布式的环境中,它也能使从单点监视或分析日志变得容易。
Docker Logging Strategies and Best Practices
活动日志记录是管理或支持你的 Docker 化应用程序的一个基本过程。日志条目对应用程序的行为、性能和问题提供令人难以置信的见解,从而能够主动管理并快速进行故障排除。
Docker 提供多种管理日志记录的方式,每种方式都有其优点和合适的用例。让我们逐一讨论每一个。
Logging Through the Application
从 Docker 化应用程序记录的最简单方法实际上是从应用程序本身进行。可以通过设置它来完成,使得它使用标准输出 (stdout) 和标准错误 (stderr) 进行记录。Docker 收集这些输出,因此对于日志,你可以使用 docker logs 命令轻松检索它们。
Data Volumes Logging
另一种方法是拥有 Docker 数据卷,其中存储日志。如果你将数据卷附加到一个目录中,该目录在该容器内会写出日志,那么你可以确信它能承受容器的移除或重新启动。
Logging with the Docker Logging Driver
Docker 包含许多内置日志记录驱动程序,这些驱动程序提供了将容器日志发送到各种目的地的灵活选项:syslog、journald、Fluentd 和 AWS CloudWatch 等。它可以在守护程序和容器级别进行配置。
Logging with a Specific Logging Container
日志记录容器是专用的,这意味着它可以从主机上的所有其他容器收集日志。这通常意味着容器运行日志代理,如 Fluentd 或 Logstash,并汇总并发送日志到中央日志记录系统。
Logging Through the Sidecar approach
辅助容器在 Kubernetes 或 Docker 设置的同一 Pod 中与主应用程序容器一起运行。辅助容器的职责包括收集、处理和转发应用程序日志。
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 日期的那部分。
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
What Are Modes of Delivery?
传递模式仅定义了日志消息如何在 Docker 中传递给其最终目的地。两个主要传递模式受日志记录驱动程序支持:
Docker Logging Driver Options/Flags
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 功能(例如:守护程序、用户)。
-
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
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 设计的第三方日志记录工具。