docker logs 实现剖析

2023-11-02

「Allen 谈 Docker 系列」

DaoCloud 正在启动 Docker 技术系列文章,每周都会为大家推送一期真材实料的精选 Docker 文章。主讲人为 DaoCloud 核心开发团队成员 Allen(孙宏亮),他是 InfoQ 「Docker 源码分析」专栏作者,已出版《Docker 源码分析》一书。Allen 接触 Docker 近两年,爱钻研系统实现原理,及 Linux 操作系统。


Docker 完全可以轻易构建用户的应用,即为 build;

Docker 还可以将应用快速分发,即为 ship;

最后,Docker 依然有能力秒级启动应用,即为 run。

Build,Ship,Run,简单的3步,分分钟为 DevOps 创建了管理应用生命周期的捷径。

应用是运行起来了,应用运行后,运行状态相信是工程师最关心的点。这一点,Docker 如何帮工程师排忧解难呢?

想知道应用是否仍在运行?docker ps  会告诉您。

想获知应用的资源使用情况如何?docker stats  为您呈现。

想了解应用的运行日志?docker logs  绝对是您最好的选择。

如今,Docker 容器应用的日志分析,已经是一个获悉应用运行逻辑的状态,以及分析应用运行性能的不二法宝。

基于 Docker 容器的日志,已然有很多人在做;那大家是否了解 Docker 容器的日志是怎么来的呢?如果大家还不清楚 Docker 日志的实现原理,那么本文可以带您窥探 docker logs 的究竟。

1. Docker 容器应用如何产生日志?

大家可以试想一下,如果没有 Docker,您的应用如何打印日志?普遍情况有以下两种:

  • 第一,向标准输出(stdout)中打印日志;
  • 第二,设置日志文件 app.log (或其它文件名),向此文件中打印日志。

Docker 从诞生伊始,就从未对用户应用做出标准性规范,日志也不例外,从未有过限制。既然如此,Docker 容器应用的日志也不外乎以上两种。第二种很好理解,依然往容器中某个日志文件打印;然而第一种,应用通过标准输出(stdout)的方式打印日志,该如何呈现给用户?

2. Docker 容器应用的日志实现

对于日志文件,Docker 不可能也不应该深入应用内部逻辑,截获并接管日志文件内容,这只会破坏 Docker 的通用性。但是对于 Docker 容器内应用的标准输出,Docker 则是做了工作的。具体实现,可以参考下图:

假设 application 是 Docker 容器内部运行的应用,那么对于应用的第一部分标准输出(stdout)日志,Docker Daemon 在运行这个容器时就会创建一个协程(goroutine),负责标准输出日志。

由于此 goroutine 绑定了整个容器内所有进程的标准输出文件描述符,因此容器内应用的所有标准输出日志,都会被 goroutine 接收。goroutine 接收到容器的标准输出内容时,立即将这部分内容,写入与此容器一一对应的日志文件中,日志文件位于 /var/lib/docker/containers/<container_id> ,文件名为 <container_id>-json.log 。

至此,关于容器内应用的所有标准输出日志信息,已经全部被 Docker Daemon 接管,并重定向到与容器一一对应的日志文件中。

3. 用户如何查看容器日志?

日志总是需要被用户查看的,Docker 则通过 docker logs  命令向用户提供日志接口。docker logs  实现原理的本质均基于与容器一一对应的 <container-id>-json.log ,除了 docker logs -f  命令。

以下简要介绍 docker logs  命令下各参数的含义:

  • 无参数:直接显示容器的所有日志信息
  • tail:从尾部开始按需显示容器日志
  • since:从某个时间开始显示容器日志
  • timestamp:显示容器日志时显示日志时间戳
  • f:将当前时间点,容器日志文件 <container-id>-json.log 中的日志信息全部打印;此时间点之后所有的日志信息与日志文件无关,直接接收goroutine 往日志文件中写的文件描述符,并显示

总而言之,Docker 容器日志的处理并不会很复杂。此文阅完,日志的来龙去脉,一清二楚。

当然,您也可以做两个实验检验以上内容:

  • Experiement 1:通过 Docker 运行一个应用,日志会从标准输出打印日志,然后通过 docker logs  查看日志。
  • Experiement 2:运行一个 Docker 容器,随后 docker exec  命令进入这个容器,接着通过 echocat 等命令向容器的标准输出中打印内容,最后通过 docker logs  查看日志。

实验是检验真理的唯一标准。您会发现,Experiement 1 中,查看日志会有日志;而 Experiement 2 中却找不到 echocat 等命令标准输出的日志内容。

Experiement 2 做完,瞬间毁三观,难道以上内容有差错?可以明确告诉您没有,那矛盾如何会存在?

欲知后事如何,关注「Allen 谈 Docker」系列,且听下回分解。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker logs 实现剖析 的相关文章

随机推荐

  • 列表解析

    gt gt gt squared x 2 for x in range 4 gt gt gt for i in squared print i 0 1 4 9 gt gt gt sqdEvens x 2 for x in range 8 i
  • 【Vue.js】全局与局部自定义指令的区别

    示例中介绍了全局自定义指令与局部自定义指令的区别 全局自定义指令 可以在任何实例中应用 局部自定义指令 只能在本身的vue实例中应用 div p 局部自定义指令 p div
  • Windows下JDK安装与环境变量配置

    文章目录 每日一句正能量 前言 安装步骤 配置环境变量 验证环境变量是否配置成功 后记 每日一句正能量 生命 就像一场永无休止的苦役 不要惧怕和拒绝困苦 超越困苦 就是生活的强者 任何经历都是一种累积 累积的越多 人就越成熟 经历的越多 生
  • Java 开发工具类Pager

    import java util ArrayList import java util List 分页工具类 author user public class Pager private static final int DEFAULT P
  • IC卡16个扇区简介

    IC卡 Integrated Circuit Card 集成电路卡 也称智能卡 Smart card 智慧卡 Intelligent card 微电路卡 Microcircuit card 或微芯片卡等 它是将一个微电子芯片嵌入符合ISO
  • 【动态规划】62. 不同路径

    62 不同路径 一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 在下图中标记为 Finish 问总共有多少条不同的路径 示例 1 输入 m 3
  • Prism 框架

    Prism 框架应用 基础知识篇 Prism 框架概念 prism was the code name for the guidance formally known as the Composite Application Guidanc
  • JSON字符串解析成key-value获取键值对的值

    最近在做日志解析这块 记录一下 转为map 循环得到key value dt VENUS TDS V0700R0200B20150601 level 30 id 152321043 type Alert Log time 146795835
  • db2有MySQL那样的时间戳_Oracle、Db2、SqlServer、MySQL 数据库插入当前系统时间

    做易买网项目 由于对数据库插入系统时间不了解 常常遇到的问题 1 java sql SQLException ORA 01861 文字与格式字符串不匹配 原因 由于获取系统时间类型不对 应为systdate 下面介绍Oracle Db2 S
  • Firefly 问题集锦

    1 当打开Firefly与VS2010报这个错误的时候 显示下面这个错误 解决办法 打开 C Windows System32 drivers etc hosts文件 在文件末尾添加2行 注意 这两行前可能会被杀毒软件添加添加 号 添加后就
  • c# 操作MongoDB

    项目要求 将外部数据同步到mongodb 需要安装mongodb驱动包 MongoDB Driver 此处用到的版本是2 12 3 实现代码 using MongoDB Bson using MongoDB Driver using Sys
  • delete NULL是合法的!

    http bbs csdn net topics 390684584
  • 普通程序员和顶级程序员5个思维模式上的区分!

    细说硅谷普通程序员和顶级程序员5个思维模式上的区分 gineer 是一本很顶尖的书 作者为了这本书 采访了很多硅谷顶级科技公司的顶尖软件工程师 他发现这些给世界带来巨大影响的的工程师们竟然有几个共同点 我感觉大家有必要一起学习一下他们的这些
  • win8网络信息服务器,Win8.1怎么设置DNS服务器地址

    一 首先在Win8 1桌面右下角任务栏的网络图标中 右键鼠标 然后选择 打开网络和共享中心 如下图所示 二 进入Win8 1网络和共享中心后 我们点击已经连接的本地连接或者无线连接网络名称 如下图所示 注 由于笔者目前使用的是无线网络 因此
  • 【Python】猎聘网招聘数据爬虫(Python网络爬虫课设简要)

    Python 猎聘网招聘数据爬虫 Python网络爬虫课设简要 注 本文仅供学习交流使用 合肥学院 20信管 20302211009 项目文件可自行前往博客主页下载或联系作者qq 3416252112 爬取数据耗时约50分钟 1 背景介绍
  • 工信部发布2015年中国软件业务收入"百强"发展报告(zz)

    z 2016 10 25 16 03 39 L 67 28581 BG57IV3 T3610511221 K F3651456730 T295 L7194 R267 V5862 2016中关村高成长企业TOP100 1 北京远程视界眼科医院
  • 服务器怎样共享文件夹共享文件夹,服务器怎样共享文件夹共享文件夹

    服务器怎样共享文件夹共享文件夹 内容精选 换一换 该任务指导用户在SSL证书管理平台下载证书 证书状态为已签发或托管中 仅支持在证书有效期内 不限次数的下载证书 下载后即可在服务器 华为云的或非华为云的均可 上进行部署 证书请求文件选择的是
  • 【项目实训】篮球计分系统设计(无线nRF905版本)

    将单片机项目实训 篮球计分系统 无线nRF905版本 分享出来 如有不足 敬请指出 实验图片 视频视频 项目实训 篮球积分系统 nRF905版本 目录 一 设计要求 二 方案设计 三 硬件电路设计 四 软件设计 五 其他图片 六 资料链接
  • 无线上外网,有线上内网的方式(转)

    原文地址 无线上外网 有线上内网的方式 转 atongmu2017的博客 CSDN博客 在外面调试程序 内网是调试程序必须的 而要上外网 又只有通过无线连接 不过发现这样有个问题 就是在笔记本的无线连上外网的时候 只要插上内网的网线 就发现
  • docker logs 实现剖析

    Allen 谈 Docker 系列 DaoCloud 正在启动 Docker 技术系列文章 每周都会为大家推送一期真材实料的精选 Docker 文章 主讲人为 DaoCloud 核心开发团队成员 Allen 孙宏亮 他是 InfoQ Doc