您好,欢迎访问本站博客!登录后台查看权限
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧
  • 网站所有资源均来自网络,如有侵权请联系站长删除!
  • 了解seo技术,运营知识,营销策略,,MU MU ZHONG CHENG——沐目忠诚
  • 忠告:无论她(他)怎么对你,你都不能伤害她、她有她得难!

配置Docker日志轮转,保留3个日志文件,超过的自动删除,每个日志文件最大为1G。

其他 沐目忠诚 2026-01-27 24 次浏览 0个评论
网站分享代码

根据需求,我们需要配置Docker日志轮转,使得每个容器的日志文件最大为1G,最多保留3个日志文件,超过的自动删除。
配置方法是通过编辑Docker的配置文件/etc/docker/daemon.json,然后重启Docker服务。

但是注意:配置是全局的,对所有容器生效。如果要对单个容器设置,可以在运行容器时通过--log-opt参数指定。

因为这里已经有一个容器,我们希望对这个容器应用新的日志策略,有两种方法:

  1. 修改全局配置,然后重启Docker,但是已有的容器不会立即生效,需要重新创建。

  2. 针对这个容器,重新创建(停止、删除、重新运行)并指定日志参数。

由于要求是容器保留3个日志文件,每个最大1G,我们可以在daemon.json中设置全局配置,然后重新创建容器。

但是,如果希望只针对这个容器,而不影响其他容器,可以在重新创建这个容器时单独指定日志参数。

根据你的需求,我们分两步:
第一步:设置全局配置(可选,如果你希望所有容器都使用此策略)。
第二步:重新创建容器,使其应用新的日志策略。

由于容器已经在运行,并且我们不想影响其他容器,我们可以只针对这个容器进行操作。

具体步骤:

  1. 停止并删除当前容器(注意:如果容器有数据需要保留,请确保数据已经备份,例如使用数据卷)。

  2. 重新运行容器,并指定日志参数:--log-opt max-size=1g --log-opt max-file=3

但是,如果容器是通过docker run命令运行的,那么重新运行即可。如果容器是通过docker-compose运行的,那么需要修改docker-compose.yml文件。

假设你是通过docker run运行的,可以这样做:

先找到原始运行命令,或者使用新的命令重新运行。如果你不记得原始命令,可以查看容器配置,然后重新构建命令。

但是,我们也可以先配置全局,然后重启容器。但是注意:修改全局配置并重启Docker后,已经运行的容器不会应用新的日志配置,除非重新创建。

因此,我们选择重新创建容器。

步骤:

  1. 停止容器:
    docker stop 070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef

  2. 删除容器:
    docker rm 070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef

  3. 重新运行容器,并加上日志参数。例如:
    docker run -d --name your_container_name
    --log-opt max-size=1g
    --log-opt max-file=3
    other_options
    your_image

注意:你需要将your_container_name、other_options和your_image替换为实际的值。

如果你希望修改全局配置,可以编辑/etc/docker/daemon.json,加入以下内容:

{
"log-driver": "json-file",
"log-opts": {
"max-size": "1g",
"max-file": "3"
}
}

然后重启Docker:systemctl restart docker

但是,即使修改了全局配置,已经存在的容器仍然使用旧的配置,所以需要重新创建容器。

因此,无论是否修改全局配置,要使得正在运行的容器应用新的日志配置,都需要重新创建容器。

所以,我建议先修改全局配置,然后重新创建容器,这样以后新创建的容器也会使用这个配置。

但是,请注意,如果容器有数据卷,删除容器时不要删除数据卷,或者确保已经备份。

另外,如果容器有链接其他容器,或者有网络设置等,重新创建时需要保持这些设置。

因此,请根据你的实际情况操作。

如果你不知道原始运行命令,可以尝试使用docker inspect命令查看容器的配置,然后根据配置重新构建命令。

下面是一个示例,如何通过inspect获取容器的配置并重新运行:

但是,这通常比较复杂。更简单的方法是,如果你有原始运行命令,直接修改命令。

如果没有,可以尝试使用docker commit将容器保存为镜像,然后重新运行。但是这样可能会丢失一些环境变量等。

考虑到这些,我建议你:

  1. 如果你有原始运行命令,直接修改命令,添加日志参数,然后重新运行。

  2. 如果没有,可以使用docker inspect查看容器的配置,然后根据配置重新构建命令。

由于我不知道你的容器具体信息,这里提供一个根据现有容器重新构建命令的方法:

步骤:

  1. 停止并删除现有容器(确保数据已经备份)。

  2. 使用docker inspect命令查看容器的详细配置,包括镜像、端口映射、卷挂载、环境变量等。

  3. 根据这些信息重新构建docker run命令。

但是,这个过程比较繁琐。你也可以考虑使用docker-compose来管理容器,这样可以更方便地修改配置。

如果你希望继续使用docker run,下面是一个参考:

假设原始容器是通过以下命令运行的:
docker run -d -p 80:80 -v /data:/data --name myapp myimage

那么修改后的命令就是:
docker run -d -p 80:80 -v /data:/data --name myapp --log-opt max-size=1g --log-opt max-file=3 myimage

然后运行这个命令。

总结:

如果你可以接受重启容器,并且知道如何重新运行容器,那么按照上述步骤即可。

如果你不能删除容器,那么可以尝试动态修改容器的日志配置,但是Docker不支持动态修改,所以必须重新创建容器。

因此,请根据你的情况选择。

另外,修改全局配置(/etc/docker/daemon.json)并重启Docker后,只对新创建的容器生效,所以如果你希望全局生效,并且以后新创建的容器都使用这个配置,那么可以修改全局配置。

最后,如果你重新创建了容器,并且修改了全局配置,那么以后这个容器和其他新容器都会使用新的日志配置。

具体操作:

  1. 编辑/etc/docker/daemon.json,添加日志配置。

  2. 重启Docker:systemctl restart docker

  3. 重新创建你的容器(停止、删除、用新命令运行)。

这样,这个容器就会使用新的日志配置,并且以后创建的容器也会使用这个配置。

注意:在修改daemon.json之前,请备份该文件。

如果daemon.json已经有其他配置,请将日志配置合并进去。

例如,原来的daemon.json可能是空的,或者有类似如下的内容:

{
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}

那么合并后应该是:

{
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "1g",
"max-file": "3"
}
}

然后重启Docker。

请按照这个步骤操作。

Docker日志轮转配置具体方法

1. 配置全局Docker日志策略

编辑 /etc/docker/daemon.json 配置文件:

# 创建或编辑配置文件

cat > /etc/docker/daemon.json << 'EOF'

{

  "log-driver": "json-file",

  "log-opts": {

    "max-size": "1g",

    "max-file": "3",

    "compress": "true"

  }

}

EOF


参数解释:

  • "max-size": "1g" = 每个日志文件最大1GB

  • "max-file": "3" = 保留3个日志文件(当前1个 + 轮转2个)

  • "compress": "true" = 轮转时压缩旧日志文件,节省空间

2. 重启Docker使配置生效

# 重启Docker服务
systemctl restart docker

# 验证Docker是否正常启动
systemctl status docker


3. 配置生效后的效果

对于你的容器 070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef

日志文件结构

/var/lib/docker/containers/070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef/
├── 070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef-json.log      # 当前日志(最大1GB)
├── 070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef-json.log.1     # 轮转日志1(压缩)
├── 070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef-json.log.2     # 轮转日志2(压缩)
└── config.v2.json


轮转过程

  1. 当前日志容器ID-json.log 实时写入,达到1GB时触发轮转

  2. 轮转1:当前日志重命名为 容器ID-json.log.1 并压缩,创建新的空日志文件

  3. 轮转2:当再次达到1GB时,容器ID-json.log.1 重命名为 容器ID-json.log.2,当前日志重命名为 容器ID-json.log.1

  4. 删除旧日志:当第3次达到1GB时,删除最旧的 容器ID-json.log.2,保留最新的3个文件

4. 查看当前容器日志配置

# 查看容器当前的日志配置
docker inspect 070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef \
  --format='{{json .HostConfig.LogConfig}}' | python -m json.tool

5. 对新创建的容器立即生效

新配置对新创建的容器自动生效,但对于已运行的容器,需要重新创建:

方法A:停止并重新创建容器

# 1. 备份容器配置和数据
docker inspect 070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef > /tmp/container_backup.json
# 2. 记录容器运行的命令(如果有)
docker ps --no-trunc | grep 070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef
# 3. 停止容器
docker stop 070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef
# 4. 删除容器(不会删除数据卷)
docker rm 070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef
# 5. 重新运行容器(使用相同的命令,会自动应用新的日志配置)
# 例如:docker run -d --name 原容器名 [其他参数] 镜像名


方法B:创建新容器时显式指定日志参数


# 创建新容器时,可以显式指定日志参数(会覆盖全局配置)
docker run -d \
  --name my_container \
  --log-driver json-file \
  --log-opt max-size=1g \
  --log-opt max-file=3 \
  --log-opt compress=true \
  镜像名

6. 验证日志轮转是否工作


# 监控容器日志文件变化
watch -n 5 "ls -lh /var/lib/docker/containers/070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef/*.log*"
# 或者使用这个命令持续监控
while true; do
  clear
  echo "=== 容器日志文件状态 $(date) ==="
  ls -lh /var/lib/docker/containers/070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef/*.log*
  echo ""
  echo "当前日志文件大小:"
  du -sh /var/lib/docker/containers/070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef/
  sleep 5
done



7. 手动清理现有的大日志文件

在应用新配置前,先清理现有的大日志文件:


# 1. 清空当前巨大的日志文件(立即释放空间)
truncate -s 0 /var/lib/docker/containers/070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef/070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef-json.log
# 2. 删除旧的轮转文件(如果有)
find /var/lib/docker/containers/070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef/ -name "*.log.*" -delete



8. 完整的配置脚本


#!/bin/bash
# docker_log_rotation_setup.sh

echo "=== Docker日志轮转配置脚本 ==="

# 1. 备份现有的daemon.json
if [ -f /etc/docker/daemon.json ]; then
  cp /etc/docker/daemon.json /etc/docker/daemon.json.bak.$(date +%Y%m%d_%H%M%S)
  echo "✓ 已备份原配置文件"
fi

# 2. 创建新的配置
cat > /etc/docker/daemon.json << 'EOF'
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "1g",
    "max-file": "3",
    "compress": "true"
  }
}
EOF
echo "✓ 已创建新配置文件"

# 3. 重启Docker
systemctl restart docker
if [ $? -eq 0 ]; then
  echo "✓ Docker重启成功"
else
  echo "✗ Docker重启失败"
  exit 1
fi

# 4. 清理现有的大日志文件
echo "是否清理现有的容器日志文件?(y/n)"
read -r answer
if [ "$answer" = "y" ]; then
  for container_id in $(docker ps -q); do
    log_path=$(docker inspect --format='{{.LogPath}}' $container_id)
    if [ -f "$log_path" ]; then
      size=$(ls -lh "$log_path" | awk '{print $5}')
      echo "  清理容器 $container_id 的日志 (原大小: $size)"
      truncate -s 0 "$log_path"
    fi
  done
  echo "✓ 已清理现有容器日志"
fi

# 5. 验证配置
echo ""
echo "=== 配置验证 ==="
echo "日志驱动: $(docker info --format '{{.LoggingDriver}}')"
echo ""
echo "对于已运行的容器,需要重新创建才能应用新配置。"
echo "你可以运行以下命令查看容器配置:"
echo "  docker inspect <容器ID> --format='{{json .HostConfig.LogConfig}}' | python -m json.tool"


9. 注意事项

1. 已运行容器的处理

# 已运行的容器不会立即应用新配置

# 需要停止并重新创建,或等待容器重启

2. 查看容器重启策略

# 查看容器重启策略
docker inspect 070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef \
  --format='{{.HostConfig.RestartPolicy.Name}}'

3. 如果容器有自动重启策略


# 如果容器配置了自动重启(如always, unless-stopped)
# 可以停止容器,Docker会自动用新配置重启
docker stop 070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef
docker start 070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef

10. 生产环境建议

更严格的配置

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",      # 生产环境建议更小的文件大小,如100MB
    "max-file": "10",        # 保留更多文件用于调试
    "compress": "true",
    "mode": "non-blocking",  # 非阻塞模式,避免日志写入影响应用性能
    "max-buffer-size": "4m"  # 缓冲区大小
  }
}

添加监控脚本

#!/bin/bash
# monitor_docker_logs.sh
CONTAINER_ID="070a9ea2f1b611e47069854403cf892fc3cbb92ea262b25dcb98367b2798e3ef"LOG_DIR="/var/lib/docker/containers/$CONTAINER_ID"

# 检查日志文件大小
current_log_size=$(stat -c%s "$LOG_DIR/$CONTAINER_ID-json.log" 2>/dev/null || echo 0)
current_log_size_mb=$((current_log_size / 1024 / 1024))

# 报警阈值:800MB(1GB的80%)
if [ $current_log_size_mb -gt 800 ]; then
  echo "警告:容器 $CONTAINER_ID 日志文件大小 ${current_log_size_mb}MB,接近1GB限制"
  # 可以发送邮件、钉钉、微信通知等
  fi


总结步骤

  1. 编辑配置文件/etc/docker/daemon.json

  2. 重启Dockersystemctl restart docker

  3. 清理现有日志truncate -s 0 /var/lib/docker/containers/容器ID/容器ID-json.log

  4. 重启容器(如果需要立即生效)

  5. 监控验证:定期检查日志文件大小

这样配置后,Docker会自动管理你的容器日志,每个容器最多占用3GB(3个×1GB)的日志空间,超过的会自动删除最旧的日志文件。


已有 24 位网友参与,快来吐槽:

发表评论