You are currently viewing Docker容器日志管理–控制Docker容器日志大小

Docker容器日志管理–控制Docker容器日志大小

前言

Docker的优势已无需多言,但其内部管理的复杂性却常令人头疼。例如,我们在本地部署项目时,修改配置文件非常方便。然而,在Docker环境中,修改配置却显得麻烦得多。即使我们自己构建镜像,每次修改后也需重新构建,这无疑增加了操作成本。

本文将重点讨论Docker容器日志管理的问题。之所以单独拿出来讲,是因为Docker的文件系统和日志系统与传统部署方式有较大差异。在物理机上,我们可以直接修改日志文件,也能通过脚本轻松删除或截断日志。但Docker容器内的日志管理则相对复杂,无法像物理机一样随意剪切或删除,这给日志管理带来了挑战。

我撰写此文源于前几天的一件事。去年9月,我用Docker部署了一个容器,运行至今(2024年10月)已有一年零一个月左右。前几天我需部署新的Docker容器,顺便查看了那个项目的Docker容器日志,竟赫然发现它已达到12GB!浏览我博客的朋友多少都有些基础,应该了解服务器硬件资源有限且按时长付费。对于一个Docker容器日志大小达到12GB,这简直让人“头皮发麻”,令人唏嘘不已。

考虑到我之前几篇博客文章中曾提到使用Docker部署了一些组件,我决定撰写本文,旨在教大家如何有效进行Docker容器日志管理,并控制Docker容器日志大小。

关于重启与重新创建Docker容器逻辑问题

回忆在过去的一年里,上面提到的那个服务器Docker容器重启很多次,但是,它们的日志文件仍然存在并继续增长。这是为啥呢?

因为我们重启容器,其实就跟人打了个盹儿似的,睡醒了接着干活。当服务器重启时,Docker守护进程会正常关闭正在运行的容器,并且在启动后,它会自动启动它们,同理,使用systemctl restart docker命令手动重启 Docker服务的原理和重启服务器相同。只有Docker容器删除重新创建时,日志才会重置,也就是清空。

这里讲解这些是为了本文后面内容打基础。

查看Docker日志大小

Docker日志默认保存在物理机以下位置(您没改的情况下):

这个目录结构其实很有规律,前面/var/lib/不用管。

docker文件夹:应该很好理解。

containers文件夹:“容器”的英文。

<container-id>文件夹:表示容器ID,就是每个容器的身份证号。

<container-id>-json.log这个就是您的容器日志文件。前面的ID每个容器都不同,后面-json.log都是相同的。

这些日志文件默认以JSON格式构建,并捕获容器的标准输出stdout和标准错误stderr流(这里大家不需要过多研究,它是go语言的函数)。

接下来我们来实践一下使用find命令查找列出全部 Docker 容器日志,按从大到小的顺序排列:

列出
列出所有 Docker 容器日志

现在我们列出 Docker 容器中的所有日志文件并大小顺序排序。但是,现在又有一个问题,这些日志文件名都是<container-id>-json.log,我们如何将这些 ID 与容器的实际名称进行匹配呢?别急,同志们,马上就来讲解。

通过其 ID 查找 Docker 容器名称

我们以上面最大的 Docker 容器日志为例。该文件大小为5.9M。ID为d2e9228f92b66ac09fa35dcab36abba2eb4a7f46baa1d03b65d71ed8d42de977

ID查名称

使用这个命令docker inspect --format='{{.Name}}' <container_id>打印出容器名称:

如图:

打印名称
获取有关容器的详细信息

上面输出结果很多详细信息,我们如果只需要输出“路径+ID”,使用这个命令docker inspect --format='{{.LogPath}}' <container_name>命令:

获取特定 Docker 容器的日志文件的完整路径
获取特定 Docker 容器的日志文件的完整路径

现在我们可以实现查找获取日志的一切信息。接下来,我教大家如何清除指定的日志文件或内容。

清理 Docker 容器日志

您可以使用truncate命令清空单个日志文件的所有内容。只需提供要清除的日志文件的完整路径作为参数即可。例如:

清空单个 Docker 日志文件的所有内容
清空单个 Docker 日志文件的所有内容

如果您想清空所有日志文件的内容(非必要不要运行此命令):

设置 Docker 日志大小限制

上述方法只是一种简单机械的解决方案,对于管理大型的 Docker 日志非常好用,例如您现在接手一个大型 Docker 项目,很多之前的日志不需要了,而您的前任并没有做日志管理优化,此时,这种简单机械的方案非常nice。

但是它有一个问题就是需要定期使用这些命令。第一种方式,如果您选择手动的话。定期要进入服务器手动执行这些命令。另一种方式,您采用用我往期文章中定时任务的方式。这存在一个逻辑错误。既然它叫日志肯定是有价值的,很多日志是要用来排查容器运行问题的。您连看都没看或者您排查容器问题时候发现日志没了,这不就本末倒置了嘛。

接下来我通过 Docker 进程守护的方式来实现日志文件大小控制。

原理是将每个文件的大小设置一个阀值,例如:10M。当日志达到这个大小值时候Docker 守护进程将自动将这些日志重命名为<container_id>-json.log.1<container_id>-json.log.2……这样的形式进行存档,并且只保留最新的三份,第四个日志会覆盖替换第一个日志<container_id>-json.log.1,以此类推。这样日志文件就不会不断变大并且只保留最新的。以下是操作方法。

要将日志归档功能应用于Docker 所有容器,您可以编辑 Docker 进程守护配置文件,该文件通常位于/etc/docker/daemon.json。如果该文件不存在,您可以通过以下命令来创建它(daemon是文件名,您可以随意起名):

对于nano编辑器,我这里讲解下,以免小白不懂。

nano。它是一款Linux是一款现代化的编辑器,非常好用。Ubuntu发行版会自带,不用我们手动安装。如果您使用的发行版不带,自行搜索下载即可。

对于nano来说,您只需要知道它三个快捷键就行了。第一个是保存:CTRL+S。第二个是退出,就是退出编辑页面:CTRL+X。第三个就是查找:CTRL+W

有了这几个快捷键,基本上您就可以查找复制粘贴保存来编辑一些东西了。

然后,将以下内容粘贴到文件中,保存并退出:

上述变量含义解释:

json-file是进程名。

10m是单个日志文件阀值为10M。

3是允许存档日志文件的个数。

接下来,要使配置文件生效,需重新启动 Docker 服务:

注意:这些更改只会影响新创建的 Docker 容器,而不会影响已在运行的容器。要将更改应用于现有容器,您必须先将它们删除,然后重新创建它们。

对于容器的删除和创建本文不讲解,您能看本文应该会部署容器了,不然也不会看这篇文章。

相关Docker文章推荐:6个最佳提升生产力的Docker项目