docker logs

这篇具有很好参考价值的文章主要介绍了docker logs。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

docker logs命令

$ docker logs [OPTIONS] CONTAINER

Options:

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

示例:docker logs -t cid

docker logs 命令会吧容器内的stdout、stderr 标准输出和标准错误都显示出来。具体原理见下文

原理

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

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

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

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

docker logs

当输入docker logs的时候会转化为Docker Client向Docker Daemon发起请求,Docker Daemon 在运行容器时会去创建一个协程(goroutine),绑定了整个容器内所有进程的标准输出、标准错误文件描述符。因此容器内应用的所有只要是标准输出、标准错误日志,都会被 goroutine 接收,Docker Daemon会根据容器id和日志类型读取日志内容,最终会输出到用户终端上并且通过json格式存放在/var/lib/docker/containers目录下。

1、docker exec和容器日志:

1)做一个实验:

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

实验是检验真理的唯一标准。您会发现,Experiement 1 中,查看日志会有日志;而 Experiement 2 中却找不到 echo、cat 等命令标准输出的日志内容。Experiement 2 做完,瞬间毁三观,难道以上内容有差错?可以明确告诉您没有,那矛盾如何会存在?

2)容器进程树和docker exec:

翻看 Docker 的历史,您会发现 Docker 一直在强调「Application」一词,Docker 也希望能为分布式应用提供容器化的解决方案。

从 Docker 化应用软件的生命周期来看,开发工作似乎位于 Docker 的构建之前,而后容器化的测试、部署与运维都与 Docker 容器息息相关。不得不说,Docker 思维下的应用软件,管理流程与传统场景有着很大的区别。

最大的区别当属 Docker 容器运行环境的封闭性。单一应用的运行,使得容器内部缺少功能丰富的服务。虽然用户可以通过 Docker 的层面,获取部分容器的信息,但是依然无法直接获悉应用内部的状态信息(虽然 Docker 倡导容器运行无状态的应用),比如应用容器内部持久化的日志文件、应用容器内部的临时存储等等。而这些信息在传统模式下,都可以较为轻易的获取。

为了缓解容器运行环境封闭性带来的使用障碍,Docker 提供了 docker exec 命令,方便用户在容器之外让容器执行指定的命令,以实现用户的需求。

随着 Docker 的普及,相信越来越多的 Docker 爱好者已经意识到:

  1. Docker 容器其实就是若干进程构成;
  2. 而「一般情况下」这些进程呈现出「树状」关系;
  3. 容器内 pid 为 1 的进程为容器主进程;
  4. 一旦容器主进程退出,容器内所有进程退出。

其实,在 Docker 1.3 之前还不支持 docker exec 的时候,以上观点鲜有不妥,但是现在的情况却已然不同,且看下图:

docker logs

简述上图中 docker exec 的原理可以理解为以下两个步骤:

  • Docker Daemon 创建一个用户指定的进程 /bin/bash ,因此 /bin/bash 的父进程为 Docker Daemon;
  • Docker Daemon 为进程 P5 设定限制,如:加入容器主进程 P1 所在的隔离环境(namespaces),与其他进程一样受到资源限制(cgroups)等。

观察上图,分析原理,不难发现,容器内部的进程关系已然不是树。然而,为什么总是强调「树状「」关系呢?答案是:树状的继承关系,有利于容器管理。以上文实验「docker exec 的标准输出不会作为容器日志」为例,Docker Daemon 创建容器主进程时,负责接管主进程的标准输出,从而保证容器主进程下所有进程的标准输出被接管,然而 Docker Daemon 在新创建 docker exec 所需执行的进程时,后者的标准输出并未与容器主进程作关联,也并未被 Docker Daemon 特殊处理,故 docker exec 所执行进程的标准输出不会进入容器的日志文件中。

虽然 docker exec 所执行的进程也是容器的一部分,但是更准确的理解 Docker 容器的日志,可以是这样子的:Docker 容器的日志只负责应用本身的标准输出,不包括 docker exec 衍生进程的标准输出。

虽然本文标题与日志相关,但是几乎都在谈论 docker exec ,既然说到,不妨在这个屡试不爽的命令上提个醒:

(1)docker exec 完成容器内外的交互,但希望完成大量标准输出时需谨慎;

(2)每次 docker exec ,Docker Daemon 均会记录一次 execID,切忌过于频繁。

从描述 docker exec 的原理到引入容器日志的一些小 trick,再加上前文的 docker logs 分析,相信很多人都会觉得对 Docker 容器的日志有了一个较为完整的认识。

2、Docker时代的日志

应用 Docker 化之后,日志依然是一件非常棘手的事。笔者认为:容器内部日志文件 app.log 与 docker logs 依然无法满足传统模式下对日志的需求。

目标:通过标准输出,传递 Docker 容器内部的应用持久化日志文件。

问题假设:原先应用 Dockerfile 的 CMD 指令为 CMD ["python", "app.py"] ,应用打印日志的路径为 /var/log/app.log 。

具体实现:

1)原先 Dockerfile 所在目录下,创建一个 run.sh 文件,文件内容为:

#!/bin/bash

tail -F /var/log/app.log &

exec python app.py

2)修改 Dockerfile ,删除原先的 CMD,替换为三个指令。

指令一:ADD run.sh /

指令二:RUN chmod +x run.sh

指令三:CMD ["./run.sh"]

原理剖析:

run.sh 中启动了一个后台进程,使用 tail 命令强制将 /var/log/app.log 的内容传输至标准输出,随后使用 exec 命令将 python app.py 作为容器的主进程运行。示意图:

docker logs

http://guide.daocloud.io/dcs/docker-logs-9153967.html

https://segmentfault.com/a/1190000010086763文章来源地址https://www.toymoban.com/news/detail-415995.html

到了这里,关于docker logs的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TCP选项字段(options)

    TCP头部的最后一个选项字段(options)是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。典型的TCP头部选项结构如图所示。 选项的 第一个字段kind说明选项的类型 有的TCP选项没有后面两个字段,仅包含1字节的

    2024年02月10日
    浏览(33)
  • Prism使用Options选项

    Options是微软提供的选项模块,该模块依赖于容器使用。除了微软的IServiceCollection,当然也可以使用其它的依赖注入容器。本文演示如何在prism中使用Options。 创建一个Avalonia应用(或其它类型应用),然后使用NuGet包管理器添加Prism.DryIoc.Avalonia包。创建Views和ViewModels文件夹,将

    2024年02月05日
    浏览(76)
  • ValidationError: Invalid options object. Ignore Plugin has been initialized using an options object

    1.vscode中vue项目报错  ValidationError: Invalid options object. Ignore Plugin has been initialized using an options object that does not match the API schema. 2.解决方案 删除项目内nodemodules的webpackpack所有版本  安装webpack-cli  重新安装低版本webpack 3.其他   安装 webpack版本 查看  如果觉得可以就点个👍吧

    2024年02月16日
    浏览(40)
  • Go functional options pattern

    好处:结构体增加新的字段不影响现有功能。  Go设计模式之函数选项模式_Generalzy的博客-CSDN博客

    2024年02月13日
    浏览(49)
  • X-Frame-Options简介

            最近安全检查,发现没有保障和避免自己的网页嵌入到别人的站点里面,于是需要设置X-Frame-Options增加安全性。         网上查了查资料,这里记录一下。         可以使用下面工具进行验证:Clickjacking Tool | Test | UI Redressing   X-Frame-Options  HTTP 响应头是用来给浏览

    2023年04月08日
    浏览(35)
  • BurpSuite—Project options模块(项目选择)

    本文主要BurpSuite—Project options模块(项目选择)介绍的相关内容 关于BurpSuite的安装可以看一下之前这篇文章: http://t.csdn.cn/cavWt Project options主要用来对Project的一些设置。 Project options主要由五个模块组成: 1.Connections 连接 2.HTTP 3.SSL 4.Sessions 5.Misc  杂项 1.Connections 连接 选项1:Pl

    2024年02月06日
    浏览(38)
  • selenium 选项 chrome_options

    当前环境: Windows 10 + Python 3.7 + selenium  3.141.0 + urllib3 1.26.2 + Google Chrome 115.0.5790.110 (64 位) 如果是urllib3 版本过高会出现:ValueError: Timeout value connect was <...>, but it must be an int, float or None. 一种方法: 说明: 当使用 xp 49.0.2623.112 (正式版本) (32 位) 无法自定义 chrome 路

    2024年02月14日
    浏览(43)
  • 你知道this.$options吗?(Vue)

    我们在Vue项目中会有很多情况下需要用到this.$options,所以接下来我们介绍几个场景会用到$options,我们想第一个问题当我们在template经常使用filter,那么你可以直接在methods里边用过滤器吗?我们在表单输入一般可不可以直接清空啊回到起点,我们在一个别人已经写的代码的复杂

    2024年02月09日
    浏览(31)
  • K8S---kubectl options

    kubectl options 可以打印出所有命令行的共有选项 [root@yyzc-zjjcs01 ~]# /opt/kubernetes/bin/kubectl --kubeconfig /opt/kubernetes/conf/default-admin.kubeconfig options The following options can be passed to any command: –add-dir-header=false: If true, adds the file directory to the header of the log messages –alsologtostderr=false: log to sta

    2024年02月02日
    浏览(40)
  • IIS短文件名泄露-OPTIONS

    IIS短文件漏洞影响范围及危害 IIS 1.0,Windows NT 3.51  IIS 3.0,Windows NT 4.0 Service Pack 2  IIS 4.0,Windows NT 4.0选项包 IIS 5.0,Windows 2000  IIS 5.1,Windows XP Professional和Windows XP Media Center Edition  IIS 6.0,Windows Server 2003和Windows XP Professional x64 Edition  IIS 7.0,Windows Server 2008和Windows Vista  IIS

    2024年02月03日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包