最佳实践系列丨Docker EE 日志记录最佳实践(一)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 在传统上,设计和实现集中的日志记录总是成为马后炮。要等到各种问题出现,集中的日志记录成为优先事项,人们才会想到用这样的解决方案查询、查看和分析日志,以找到问题的根本原因。

screenshot

本文首发自“Docker公司”公众号(ID:docker-cn)
编译丨小东
每周一、三、五 与您不见不散!


在传统上,设计和实现集中的日志记录总是成为马后炮。要等到各种问题出现,集中的日志记录成为优先事项,人们才会想到用这样的解决方案查询、查看和分析日志,以找到问题的根本原因。但是到了容器时代,在设计使用 Docker 企业版 (Docker EE) 的容器即服务 (CaaS) 平台时,优先解决集中式日志记录是至关重要的。随着在容器中部署的微服务数量不断增多,它们以日志(或事件)形式产生的数据量会发生指数增长。


您将学到的知识

此参考架构提供了关于 Docker 日志记录功能如何工作的概述,说明了 Docker 日志的两大类别,然后讨论了 Docker 日志记录最佳实践。


了解 Docker 日志记录

在研究设计要素之前,先了解 Docker 日志记录的基本知识很重要。

Docker 支持不同的日志记录驱动,用于存储和/或流式传输主容器进程 (pid 1) 的容器 stdout 和 stderr 日志。默认情况下,Docker 使用 json-file 日志记录驱动,但也可以配置它使用许多其他驱动,方法是在 /etc/docker/daemon.json 中设置 log-driver 的值,然后重启 Docker 守护进程以重新加载其配置。

日志记录驱动设置会应用于重新配置守护进程之后启动的所有容器(在重新配置日志记录驱动之后重启现有容器并不会导致容器使用更新过的配置)。要覆盖默认的容器日志记录驱动,应使用 --log-driver 和 --log-opt 选项运行容器。另一方面,可以使用 docker service update --log-driver--log-opt 对 swarm mode 服务进行运行中更新,使其改用不同的日志记录驱动。

那么 Docker 引擎日志呢?这些日志通常由默认的系统管理节点日志记录器处理。现代的大多数发行版(CentOS 7、RHEL 7、Ubuntu 16 等)都使用 systemd,后者使用 journald 记录日志,使用 journalctl 访问日志。要访问引擎日志,可使用 journalctl -u docker.service。


Docker 日志类别和源

说过 Docker 日志记录的基础知识之后,本节将说明它们的类别和源。

Docker 日志通常可分为两种类别:基础架构管理日志或应用日志。大多数日志根据需访问日志者的角色自然地归入这两种类别。

  • 运维人员最关心平台的稳定性以及服务的可用性。
  • 开发人员比较关心其应用代码以及服务的性能。

为了实现自助服务平台,运维人员和开发人员都应该有权访问他们为了履行职责而需要访问的日志。开发运维的实践表明,在服务可用性和性能方面,大家要共同承担总体责任。但是,不应该让每一个人都有权访问平台上的每个日志。例如,开发人员应该只需要访问关于其服务和集成点的日志。运维人员则更关心 Docker 守护进程日志、UCP 和 DTR 可用性,以及服务可用性。两者的访问范围有一些重叠,因为开发人员和运维人员都应该了解服务可用性。让每个角色都能访问需要的日志,可以在发生问题时简化故障排除,并缩短解决故障平均时间 (MTTR)。


基础架构管理日志

基础架构管理日志包括 Docker 引擎、运行 UCP 或 DTR 的容器以及任何已部署的容器化基础架构服务(例如容器化的监控代理程序)的日志。

Docker 引擎日志

前文已经提到,默认情况下由 OS 的系统管理节点记录 Docker 引擎日志。可以将这些日志发送到集中的日志记录服务器。

UCP 和 DTR 系统日志

UCP 和 DTR 是作为 Docker 容器部署的。它们的所有日志都记录在容器的 STDOUT/STDERR 中。Docker 引擎的默认日志记录驱动记录这些日志。

可以配置 UCP 使用远程系统日志记录。此操作可以在安装后从 UCP UI 对其所有容器执行。

注:建议在安装 UCP 和 DTR 之前配置 Docker 引擎默认日志记录驱动,使其日志由所选的日志驱动记录。这是因为容器的日志记录驱动一旦创建就无法更改。唯一的例外是 ucp-agent,它是 UCP 的一个组件,作为 Swarm 服务而部署。

基础架构服务

基础架构运维团队部署容器化的基础架构服务,用于各种基础架构操作,例如监控、审核、报告、配置部署等。这些服务也会产生需要记录的重要日志。通常,它们的日志仅限于其容器的 STDOUT/STDERR,因此也会由 Docker 引擎默认日志记录驱动记录下来。否则,就需要另外处理。


应用日志

应用产生的日志可能是定制应用日志和应用主进程的 STDOUT/STDERR 日志的组合。前文已经说过,所有容器的 STDOUT/STDERR 日志都由 Docker 引擎默认日志记录驱动记录。所以不需要执行任何定制配置就能记录它们。如果应用有定制的日志记录(例如在容器中将日志写入 /var/log/myapp.log),那么就必须将其考虑在内。


Docker 日志记录设计注意事项

了解 Docker 日志的类型很重要。同样重要的是,定义哪些实体最适合使用和拥有它们。

分类 Docker 日志

主要有两种类别:基础架构日志和应用日志。

定义组织所有权

根据组织的结构和政策,确定这些类别是否与现有团队有直接对应关系。如果没有,则必须定义负责这些日志类别的合适组织或团队:

类别 团队
系统和管理日志 基础架构运维
应用日志 应用运维

如果组织是更大组织的一部分,那么这些类别可能过于宽泛。应将它们细分为更具体的负责团队:

类别 团队
Docker 引擎日志 基础架构运维
基础架构服务 基础架构运维
UCP 和 DTR 日志 UCP/DTR 运维
应用 A 日志 应用 A 运维
应用 B 日志 应用 B 运维

有些组织并不区分基础架构运维和应用运维,因此他们可以将这两种类别合并,让一个运维团队来负责。

类别 团队
系统和管理日志 基础架构运维
应用日志 基础架构运维

选择合适的模式来明确定义每种日志类型的相应所有权,从而缩短解决故障平均时间 (MTTR)。确定各种日志类型的组织所有权之后,就应该开始考察适合部署的日志记录解决方案。

选择日志记录基础架构

Docker 可以方便地与现有日志记录工具和解决方案集成。日志记录生态系统中的主要日志记录实用程序大多已经开发出 Docker 日志记录功能,或者提供了与 Docker 集成的相应文档。

选择的日志解决方案应该符合下列条件:

  1. 允许实现上一节定义的组织所有权模式。例如,有些组织可以选择将所有日志发送到单一的日志记录基础架构,然后向职能团队提供合适的访问级别。
  2. 组织对其极为熟悉!这是必要条件!
  3. 具有 Docker 集成:预配置的仪表板、稳定的 Docker 插件、合适的文档,等等。

Docker 企业版日志

如果使用 Docker 企业版,为了历史记录和系统维护的目的而存储所有容器日志是个好主意。建议您以可加索引的方式收集部分容器的输出,主要是出于政策原因和快速了解集群事件的目的。在下面几节中,我们将详细说明一些 Docker EE 组件和某些可能对组织有用的日志。

UCP

容器名称 日志中的信息
ucp-controller UCP API 日志、用户和登录
ucp-auth-api UCP 和 DTR 使用的身份和身份验证的集中服务
ucp-auth-store 存储用户、组织和团队的身份验证配置及数据
ucp-auth-worker 执行调度的 LDAP 同步并清除身份验证和授权数据
ucp-client-root-ca 签发客户端证书包的认证中心
ucp-cluster-root-ca 签发客户端证书包的认证中心
ucp-metrics 用于指标收集
ucp-kv 用于存储 UCP 配置的 etcd 服务
ucp-proxy 允许从本地 Docker 引擎安全访问 UCP 组件的 TLS 代理
ucp-swarm-manager Docker Swarm(经典版)的管理节点容器,提供向后兼容性

注:

  1. ucp-controller - 此容器记录所有登录尝试和集群的常规使用情况。就审核目的而言,这些信息中包含集群的日志使用方面的最重要日志。
  2. ucp-kv - 此容器适合用于监控,以确保集群中未失去法定多数。如果失去法定多数,设置警报是个好做法。

DTR

名称 日志中的信息
dtr-api- 执行 DTR 业务逻辑并为 DTR Web 应用和 API 提供服务
dtr-garant- 管理 DTR 身份验证
dtr-jobrunner- 在后台运行清理作业
dtr-nautilusstore- 存储安全扫描数据
dtr-nginx- 检索 HTTP 和 HTTPS 请求,并将它们代理至其他 DTR 组件,默认情况下监听主机的端口 80 和 443
dtr-notary-server- 接收、验证和提供内容信任元数据;启用内容信任的情况下,在向 DTR 推送或拉取时用于相关查询
dtr-notary-signer- 为内容信任元数据执行服务器端时间戳和快照签名
dtr-registry- 实现拉取和推送 Docker 镜像的功能,也处理镜像的存储
dtr-rethinkdb- 在数据库中存储持久的镜像仓库元数据

一些可以设置正则表达式的重要日志:

  1. dtr-registry- - 解析此容器将显示客户端 IP、用户和集群的一般使用情况。
  2. dtr-nginx- - 此容器记录对于集群的所有推送、拉取和 API 调用。
  3. dtr-rethinkdb- - 此容器中的日志包含关于 RethinkDB 的法定多数状态的信息。它适合用于监控,在发生任何失去法定多数的情况时可发出警报。

HTTP 网格路由

默认情况下,HTTP 网格路由不会将任何请求记录到 STDOUT。要记录来自 HRM 的日志,请运行下列命令:

docker service update --env-add DEBUG=1 ucp-hrm

然后,日志就会从 HTTP 网格路由输出。如果在引擎级别配置日志驱动,则日志输出遵循引擎级别的配置。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
12天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
23 5
|
17天前
|
存储 JSON 网络协议
Docker面试整理-如何查看和管理Docker容器的日志?
通过本文的介绍,我们了解了如何查看和管理Docker容器的日志,包括使用 `docker logs`命令、配置日志驱动、设置日志选项和集中日志管理。掌握这些技能,不仅可以在面试中展示专业水平,也能在实际工作中高效
39 3
|
1月前
|
存储 Linux Docker
centos系统清理docker日志文件
通过以上方法,可以有效清理和管理CentOS系统中的Docker日志文件,防止日志文件占用过多磁盘空间。选择合适的方法取决于具体的应用场景和需求,可以结合手动清理、logrotate和调整日志驱动等多种方式,确保系统的高效运行。
30 2
|
2月前
|
Web App开发 iOS开发 Docker
Docker 容器的日志
【10月更文挑战第31天】
34 5
|
2月前
|
jenkins 测试技术 持续交付
Docker最佳实践:构建高效的CI/CD流水线
【10月更文挑战第17天】在现代软件开发实践中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)已成为提高开发效率和软件质量的重要手段。Docker作为一种容器技术,为构建一致且隔离的开发环境提供了强有力的支撑。本文将探讨如何利用Docker来优化CI/CD流程,包括构建环境的标准化、镜像管理以及与CI/CD工具(如Jenkins、GitLab CI)的集成。
62 5
|
2月前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
56 1
|
2月前
|
安全 Devops 网络安全
【DevOps】Docker 最佳实践指南(绝对干货)
Docker 是一种领先的容器化平台,可简化应用开发、部署和管理。本文档介绍 Docker 的最佳实践,涵盖安全性、网络、镜像、主机安全及资源限制等方面,帮助用户高效利用 Docker,确保应用的安全性和性能。
139 0
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
49 2
|
3月前
|
开发者 Python
基于Python的日志管理与最佳实践
日志是开发和调试过程中的重要工具,然而,如何高效地管理和利用日志常常被忽略。本文通过Python中的logging模块,探讨如何使用日志来进行调试、分析与问题排查,并提出了一些实际应用中的优化建议和最佳实践。