docker logs 实现剖析

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命令进入这个容器,接着通过echo、cat等命令向容器的标准输出中打印内容,最后通过docker logs查看日志

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

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

欢迎关注Docker源码分析公众号

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-31 22:02:47

docker logs 实现剖析的相关文章

docker logs命令

docker logs命令 查看全部: docker logs -f 51ishare-platform_mall-biz_1 查看最后500行: docker logs --tail 500 51ishare-platform_mall-biz_1 查看最新日志而不读取全部: docker logs --tail 0 -f 51ishare-platform_mall-biz_1 查看指定时间log: docker logs --since="2015-08-31" 51ishare

centos7下安装docker(18docker日志---docker logs)

在微服务架构中,由于容器的数量众多以及快速变化的特性使得记录日志和监控变得越来越重要,考虑到容器的短暂和不固定周期,当我们需要排查问题的时候容器可能不在了.因此,一套集中式的日志管理系统是生产环境中不可或缺的组成部分 docker logs docker 自带的日志功能 对于一个运行的容器,docker 会将日志发送到容器的标准输出(STDOUT)和标准错误设备(STDERR),stdout和stderr实际上就是容器的控制台终端 例如: 当我们用docker run -p 80:80 http

【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志

如题: docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志 场景再现: docker部署并启动了  springboot服务,容器启动正常,docker exec 也可以正常进入容器内部,但是docker logs 控制台并没有日志打印出来. 同样的,/var/lib/docker/containers目录下的对应容器目录中,也没有对应的 *-json.log日志文件生成. 原因: dock

【docker】docker logs-查看docker容器日志

引用地址 https://www.jianshu.com/p/1eb1d1d3f25e 通过docker logs命令可以查看容器的日志. 命令格式: $ docker logs [OPTIONS] CONTAINER Options: --details 显示更多的信息 -f, --follow 跟踪实时日志 --since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟) --tail string 从日志末尾显示多少行日志, 默认是all -t, -

docker logs-查看docker容器日志

只限制最后100条的日志,并持续更新日志显示 docker logs -f --tail=100 CONTAINER_ID docker logs -f --tail 100 CONTAINER_ID https://docs.docker.com/engine/reference/commandline/logs/ https://www.jianshu.com/p/1eb1d1d3f25e 分类: docker系列 标签: docker logs-查看docker容器日志 原文地址:http

最小 Docker 镜像 hello-world 剖析

开始学习 Docker 的同学基本上都是按照官方的 guide 来安装,之后要测试是否已经安装成功,官方会让你 pull 一个 hello-world 示例镜像下来并运行,如下命令: [email protected] ? ~ ? docker pull hello-world 31cbccb51277: Pull complete e45a5af57b00: Pull complete 511136ea3c5a: Already exists hello-world:latest: The i

docker网络技术剖析

Docker 中的网络功能介绍 docker容器访问外网, 外网访问docker容器, docker容器间互访, 编译包制作成rpm包, docker容器分割VLAN通信, 实验环境:未开启selinux 防伪码: 青春以梦为马 默认情况下,容器可以建立到外部网络的连接,但是外部网络无法连接到容器. Docker 允许通过外部访问容器或容器互联的方式来提供网络服务 外部访问容器: 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过  -P  或  -p  参数来指定端口映射. 练习

docker exec 与容器日志

翻看 Docker 的历史,您会发现 Docker 一直在强调 "Application" 一词,Docker 也希望能为分布式应用提供容器化的解决方案. 从 Docker 化应用软件的生命周期来看,开发工作似乎位于 Docker 的构建之前,而后容器化的测试.部署与运维都与Docker容器息息相关.不得不说,Docker 思维下的应用软件,管理流程与传统场景有着很大的区别. 最大的区别当属:Docker 容器运行环境的封闭性.单一应用的运行,使得容器内部缺少功能丰富的服务.虽然用户可

Docker 容器日志的那些事儿

如果时光可以倒流,现实世界的每一步都可以分解到最小,记录下来,就是日志,万物即日志. 面对历史,审视日志,可以选择忘却,也可以选择铭记:经历过的,可以选择珍藏,同样也可以让它尘封. Docker容器又何尝不是?日志就像一根时间轴,你在或者不在,他都在那.有人对其善意,有人却对其随意.如若不信,可以回忆,自己是否善待Docker容器的日志. 1.传统应用的日志 如若不是被过去伤得太深,踏入一个新的世界,应该还是会怀念过往的吧.新世界的"诱惑"与崭新的节奏,相信依旧无法掩盖旧世界的铅印.数