Docker 容器日志的那些事儿

如果时光可以倒流,现实世界的每一步都可以分解到最小,记录下来,就是日志,万物即日志。

面对历史,审视日志,可以选择忘却,也可以选择铭记;经历过的,可以选择珍藏,同样也可以让它尘封。

Docker容器又何尝不是?日志就像一根时间轴,你在或者不在,他都在那。有人对其善意,有人却对其随意。如若不信,可以回忆,自己是否善待Docker容器的日志。

1.传统应用的日志

如若不是被过去伤得太深,踏入一个新的世界,应该还是会怀念过往的吧。新世界的“诱惑”与崭新的节奏,相信依旧无法掩盖旧世界的铅印。数十年岁月,应用的生命是如何在记录?

1.1 很多人注重结果,对过程可能不闻不问,应用的日志可能随着标准输出标准错误(stdout、stderr)扬长而去,无法捕捉,无法定格,结果不如意时万分嗟叹;

1.2 红袖添香,满腹经纶的才子也许会赋诗一首,书于内墙。故地重游,即唤起那良宵之夜。应用的日志也是如此,有心之人也会记录日志(赋诗一首),持久化至某处(书于内墙),便于他日查阅。

1.3 随时随地都可以吟诗题字,古人走万里路,相信很难将所有的题诗悉数记忆。不管多远,如果记忆可以藏在一处便于日后美忆,方为上策。十年前,陈老师那一台电脑做到了;去年,大表姐的手机也帮她做到了。人生如此,遑论日志。日志日志,其实应用的日志也可以发往某处,集中处理。

2.Docker时代的日志

Docker时代的日志,步子并未跨得太大,毕竟安全第一。然而,不可否认发展的时代总有让你意想不到的亮点。

如果你是容器中的应用,哪怕你是始乱终弃,抑或是洒脱不羁,Docker容器都会记录下你的点点滴滴,只要你对着标准输出标准错误说一句action。(Docker容器所有的标准输出标准错误都会被Docker Daemon接管)

如果你是个阅尽人间无数,拳打南山,脚踢北海,四海流窜的Docker容器,你在北京的One Night,兴许第二天在上海的你早已酒醒如初;第三天出差杭州的你,更是不记得昨天在上海住的是几星级宾馆。(Docker容器本身理应尽量无状态,容器内应用持久化的日志则有状态,频繁迁移不宜容器日志管理)。

如果你有一部肾机,如果你继续支持大表姐。Docker容器中的你,很容易将容器走南闯北的经历传至云端,以便他日传看。(Docker容器的应用日志,如果自己发往集中的日志处理中心,则为上上策,易统一;问题是成本高,得有钱买肾机,还需统一化的标准)

3.获取Docker容器持久化日志

阅尽人间无数,却难忆点滴,想必并非君台所愿。梦醒时分,如何获悉北京One Night的一切,现授君些许技巧,从而轻易输送应用在Docker容器内部持久化的日志。

如果你已经熟知docker logs的原理,那么标准输出标准错误的那些事儿,在你看来自然不在话下。如果再加上一些Dockerfile的CMD知识,以下内容的理解自然也是水到渠成。

目标:

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

方法:

简单重构应用Dockerfile的CMD指令。

问题假设:

原先应用Dockerfile的CMD指令为CMD [“python”, “app.py”],应用打印日志的路径为/var/log/app.log。

具体实现:

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

`#!/bin/bash

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

exec python app.py

第二步:修改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容器的日志管理也是如此。毕竟One Night in 北京,只需对Docker容器中安个镜头,对他说句Action,人力物力都省了,绝对比三里屯的一分钟轻松不少。

大概这样,成本应该还不算高吧。

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

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

时间: 2024-12-24 13:45:21

Docker 容器日志的那些事儿的相关文章

日志系统之基于flume收集docker容器日志

最近我在日志收集的功能中加入了对docker容器日志的支持.这篇文章简单谈谈策略选择和处理方式. 关于docker的容器日志 docker 我就不多说了,这两年火得发烫.最近我也正在把日志系统的一些组件往docker里部署.很显然,组件跑在容器里之后很多东西都会受到容器的制约,比如日志文件就是其中之一. 当一个组件部署到docker中时,你可以通过如下命令在标准输出流(命令行)中查看这个组件的日志: docker logs ${containerName} 日志形如: 但这种方式并不能让你实时获

Docker容器日志清理

前言 最近发现公司Gitlab服务器磁盘满了,经排查发现是docker容器日志占用了几十个G容量,那么这些日志怎么去查看和清理呢? 本节主要讲到的知识点如下: (1)Docker容器日志路径 (2)如何清理Docker容器日志 (3)如何从根本上解决Docker容器日志占用空间问题 Docker容器日志路径 在linux上,容器日志一般存放在/var/lib/docker/containers/container_id/下面,以json.log结尾的文件(业务日志).如下: 如何清理Docker

Docker容器日志管理介绍

Docker容器日志分为2类: Docker引擎日志(Docker本身运行的日志). 容器日志,各个容器内产生的日志. Docker引擎日志Centos系统下Docker引擎log一般给systemd管理,可通过 journalctl -u docker.service 命令查看. 容器日志一.查看日志命令docker logs 容器ID 显示当前运行容器的log,输出Linux下的STDOUT(标准输出).STDERR(标准错误输出),docker logs 显示的内容包含STDOUT和STD

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

使用jar包格式化Docker 容器日志

前面使用JS格式化textarea中的日志内容,但局限于JS语言性能,在日志内容较多时效率无法接受,建议日志内容大于5000行时转投本java程序,文末提供jar包下载. LogsFormat.java package com.geostar.gfstack.docker.util; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.apache.commons.io.IOUtils;

Graylog2实现Docker容器日志收集

Graylog2 是一个开源的日志存储系统,是由java语言编写的server,能够接收TCP,UDP,AMQP的协议发送的日志信息,并且基于mongodb数据库服务器快速存储,能够通过一个基于ruby编写的web管理界面,让轻松管理你的日志. 1.组件准备 名称 组件名称 备注 1 mongodb 2 elasticsearch 3 graylog2 2.安装使用Docker-compose部署docker-compose安装,参考:http://hujianxiong.com/linuxan

【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】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容器从入门到实战0826

##docker容器安装和配置### #docker的git-hub网站(账号rshare,密rshare520):https://github.com/login #docker官网hub仓库(账号flyer520,密码rhsare520):https://hub.docker.com #docker官网文档和镜像:https://docs.docker.com/samples/centos/ #docker官网的容器网络配置:https://docs.docker.com/engine/us