Docker是一个流行的容器化平台,可以在容器中运行应用程序。对于Docker的日志,我们通常会希望它们被保存在文件中,以便于分析和排除问题。然而,日志文件很容易变得非常大,这可能会占用大量磁盘空间并影响性能。因此,我们需要配置Docker以限制日志文件的大小。

Docker使用日志驱动程序来记录容器的输出。默认情况下,Docker使用json-file驱动程序来记录日志,以下会从两方面来进行日志大小限制。

json-file驱动程序

限制单个容器

  1. 确定要限制日志大小的Docker容器的名称或ID。
  2. 停止该容器并删除其现有的日志文件。可以使用以下命令来执行此操作:
    docker container stop <container_name_or_id>
    docker container rm <container_name_or_id>
    rm /var/lib/docker/containers/<container_id>/<container_id>-json.log
    
    注意:第三个命令将删除该容器的JSON日志文件。如果您希望保留旧日志文件,请将此命令更改为重命名或移动该文件。
  3. 在启动Docker容器时,使用以下命令设置json-file日志驱动程序,并指定最大日志文件大小和最大文件数量:
    docker run --log-driver=json-file --log-opt max-size=<max_size> --log-opt max-file=<max_file_count> <image_name>
    
    其中,<max_size>指定最大文件大小,以字节为单位。可以使用K,M或G等后缀来指定千字节,兆字节或千兆字节。例如,–log-opt max-size=10M将设置最大文件大小为10兆字节。
    <max_file_count>指定最大文件数量。当达到最大文件数量时,最旧的文件将被删除以腾出空间。例如,–log-opt max-file=5将设置最多存储5个日志文件。
    <image_name>指定要启动的Docker镜像的名称。
  4. 启动容器并检查新的JSON日志文件是否已创建:
    docker container start <container_name_or_id>
    ls /var/lib/docker/containers/<container_id>/<container_id>-json.log*
    
    注意:新的日志文件将以数字作为后缀进行命名,例如container_id-json.log.1。

现在,您已经成功地使用json-file驱动程序来限制Docker容器的日志大小。根据您设置的最大文件大小和最大文件数量,Docker将定期删除最旧的日志文件,以便腾出磁盘空间。

全局限制

要在Docker中全局限制日志大小,可以通过编辑Docker daemon配置文件来设置默认的日志驱动程序和日志限制。以下是如何使用json-file驱动程序来全局限制Docker日志大小的步骤:

  1. 打开Docker daemon配置文件。该文件通常位于/etc/docker/daemon.json。如果该文件不存在,请创建它。
    sudo nano /etc/docker/daemon.json
    
  2. 将以下内容添加到文件中:
    {
    	"log-driver": "json-file",
    	"log-opts": {
    	 "max-size": "<max_size>",
    	 "max-file": "<max_file_count>"
    	}
    }
    
    其中,<max_size>指定最大文件大小,以字节为单位。可以使用K,M或G等后缀来指定千字节,兆字节或千兆字节。例如,“max-size”: "10M"将设置最大文件大小为10兆字节。
    <max_file_count>指定最大文件数量。当达到最大文件数量时,最旧的文件将被删除以腾出空间。例如,“max-file”: "5"将设置最多存储5个日志文件。
  3. 保存并关闭文件。
  4. 重新启动Docker daemon以使更改生效。
    sudo systemctl restart docker
    

现在,您已经成功地使用json-file驱动程序来全局限制Docker日志大小。默认情况下,每个新的Docker容器都将使用json-file驱动程序,并且将遵循在daemon.json文件中设置的最大文件大小和最大文件数量限制。如果您需要更改特定容器的日志限制,可以在启动容器时覆盖默认设置。

PS:已经创建的容器并不会生效,需要销毁容器后重新创建,可通过docker inspect <container_id>来进行查询容器详情

logrotate驱动程序

1.安装logrotate

logrotate是一个常用的Linux工具,它可以轮换日志文件并限制它们的大小。在安装logrotate之前,我们需要确保我们的操作系统上已经安装了它。如果你使用的是Debian或Ubuntu,你可以使用以下命令安装logrotate:

sudo apt-get update
sudo apt-get install logrotate

如果你使用的是CentOS或Fedora,你可以使用以下命令安装logrotate:

sudo yum install logrotate

2.创建logrotate配置文件

我们需要创建一个logrotate配置文件,该文件将告诉logrotate如何轮换我们的Docker日志文件。我们可以在/etc/logrotate.d目录中创建一个新的配置文件,例如:

sudo nano /etc/logrotate.d/docker-container

然后,在文件中添加以下内容:

/var/lib/docker/containers/*/*.log {
    rotate 7
    daily
    size 10M
    compress
    missingok
    delaycompress
    copytruncate
}

这将告诉logrotate:

  • 在/var/lib/docker/containers//.log中查找日志文件
  • 轮换最近7天的日志文件
  • 每天轮换一次日志文件
  • 日志文件达到10MB时,轮换日志文件
  • 使用gzip进行压缩
  • 如果日志文件不存在,则不会产生错误
  • 延迟压缩轮换的日志文件
  • 使用copytruncate选项,轮换文件时将日志截断而不是重命名

3.重新启动Dokcer服务

最后,我们需要重新启动Docker服务以使配置生效:

sudo systemctl restart docker

现在,Docker将使用logrotate驱动程序来记录日志,并限制每个日志文件的大小。如果你的日志文件变得太大,logrotate会自动轮换它们,这将节省磁盘空间并提高性能。