[转帖]Docker容器日志查看与清理(亲测有效)

docker,容器,日志,查看,清理,有效 · 浏览次数 : 0

小编点评

**问题 1:Docker 容器日志导致主机磁盘空间满了。** * docker logs -f container_name 输出大量日志,导致主机磁盘空间被占用。 * 使用 `docker_log_size.sh` 等脚本统计日志文件大小,发现日志文件非常大。 * 清理 Docker 容器日志后,磁盘空间依然没有释放,原因是日志文件被打开的进程无法立即释放。 **解决方案 2:清理 Docker 容器日志** * 使用 `rm -rf` 等方法删除日志文件。 * 使用 `df -h` 查看磁盘空间占用情况。 * 如果容器正在运行,请使用 `cat /dev/null > *-json.log` 等方法清理日志。 **解决方案 3:设置 Docker 容器日志大小** * 使用 `docker-compose.yml` 配置容器服务最大日志大小。 * 设置 `log-driver` 为 `json-file` 并设置 `max-size` 和 `max-file`选项。 **注意:** * 设置日志大小的单位为 M,表示 1g 等于 1024M。 * `max-size` 只适用于新建的容器。 * 清理日志后,请确保容器重新启动以应用更改。

正文

1. 问题

docker容器日志导致主机磁盘空间满了。docker logs -f container_name噼里啪啦一大堆,很占用空间,不用的日志可以清理掉了。

2. 解决方法

2.1 找出Docker容器日志

在linux上,容器日志一般存放在/var/lib/docker/containers/container_id/下面, 以json.log结尾的文件(业务日志)很大,查看各个日志文件大小的脚本docker_log_size.sh,内容如下:

#!/bin/sh

echo "======== docker containers logs file size ========"

logs=$(find /var/lib/docker/containers/ -name *-json.log)

for log in $logs
do
ls -lh $log
done

    # chmod +x docker_log_size.sh
    

    ./docker_log_size.sh

      2.2 清理Docker容器日志(治标)

      如果docker容器正在运行,那么使用rm -rf方式删除日志后,通过df -h会发现磁盘空间并没有释放。原因是在Linux或者Unix系统中,通过rm -rf或者文件管理器删除文件,将会从文件系统的目录结构上解除链接(unlink)。如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。正确姿势是cat /dev/null > *-json.log,当然你也可以通过rm -rf删除后重启docker。接下来,提供一个日志清理脚本clean_docker_log.sh,内容如下:

      #!/bin/sh 
      

      echo "======== start clean docker containers logs ========"

      logs=$(find /var/lib/docker/containers/ -name *-json.log)

      for log in $logs
      do
      echo "clean logs : $log"
      cat /dev/null > $log
      done

      echo "======== end clean docker containers logs ========"

        # chmod +x clean_docker_log.sh
        

        ./clean_docker_log.sh

          <

        但是,这样清理之后,随着时间的推移,容器日志会像杂草一样,卷土重来。

        2.3 设置Docker容器日志大小(治本)

        • 设置一个容器服务的日志大小上限

        上述方法,日志文件迟早又会涨回来。要从根本上解决问题,需要限制容器服务的日志大小上限。这个通过配置容器docker-compose的max-size选项来实现

        nginx: 
          image: nginx:1.12.1 
          restart: always 
          logging: 
            driver: “json-file” 
            options: 
              max-size: “5g” 
        

          重启nginx容器之后,其日志文件的大小就被限制在5GB,再也不用担心了。

          • 全局设置

          新建/etc/docker/daemon.json,若有就不用新建了。添加log-dirver和log-opts参数,样例如下:

          # vim /etc/docker/daemon.json
          

          {
          "registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
          "log-driver":"json-file",
          "log-opts": {"max-size":"500m", "max-file":"3"}
          }

            max-size=500m,意味着一个容器日志大小上限是500M,
            max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。

            // 重启docker守护进程
            

            systemctl daemon-reload

            systemctl restart docker

              注意:设置的日志大小,只对新建的容器有效。

              3. 参考文章

              https://blog.csdn.net/xunzhaoyao/article/details/72959917
              https://www.cnblogs.com/testzcy/p/7904829.html

              文章知识点与官方知识档案匹配,可进一步学习相关知识

              与[转帖]Docker容器日志查看与清理(亲测有效)相似的内容:

              [转帖]Docker容器日志查看与清理(亲测有效)

              1. 问题 docker容器日志导致主机磁盘空间满了。docker logs -f container_name噼里啪啦一大堆,很占用空间,不用的日志可以清理掉了。 2. 解决方法 2.1 找出Docker容器日志 在linux上,容器日志一般存放在/var/lib/docker/container

              [转帖]docker容器跨主机网络overlay

              https://www.cnblogs.com/machangwei-8/p/15757120.html 目录 拉取镜像,运行容器 浏览器上访问Consul 修改host1,host2的docker daemon配置文件 创建网络 验证 在overlay中运行容器 运行 查看一下这两个网卡 查看生成

              [转帖]Docker容器跨主机通信overlay网络的解决方案

              https://www.jb51.net/article/237838.htm 一、Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvlan: Docker主机网卡接口逻辑上分为多个子接口,每个子接口标识一

              [转帖]docker 容器基础技术:linux cgroup 简介

              https://cizixs.com/2017/08/25/linux-cgroup/ Linux cgroups 的全称是 Linux Control Groups,它是 Linux 内核的特性,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(cpu、memory、

              [转帖]Docker容器动态添加端口

              方法1 修改iptables端口映射 docker的端口映射并不是在docker技术中实现的,而是通过宿主机的iptables来实现。通过控制网桥来做端口映射,类似路由器中设置路由端口映射。 比如我们有一个容器的80端口映射到主机的8080端口,先查看iptables到底设置了什么规则:登录后复制

              [转帖]Docker容器管理技术-高级网络管理

              Docker容器管理技术-高级网络管理 https://www.jianshu.com/p/5859a2fe4377 1. Docker本地网络类型 1.1查看支持网络类型 docker network ls 1.2 测试使用各类网络类型 docker run network=xxx none :

              [转帖]Docker 容器运行 ivorysql 之体验

              当下容器运行应用已经越来越火,只要主机上能运行 Docker,就可以通过镜像来运行应用,不需要考虑环境是否满足应用的运行条件。今天就给大家分享一下使用镜像运行 ivorysql 数据库。如果你容器运行过 postgresql,那就比较容易上手了,几乎是一样的体验,稍微有点差别,后面会说明。 友情提示

              【转帖】Docker容器四种网络模式

              https://blog.whsir.com/post-5268.html docker自身默认提供了四种网络模式:none、bridge、container、host。除了这四种网络模式外,还可以通过插件自定义一些网络模式,比如macvlan、overlay等。 默认的这四种网络模式其实很好理解,

              [转帖]docker容器自动重启,看完这篇彻底明白了

              一. JVM内存区域的划分 1.1 java虚拟机运行时数据区 java虚拟机运行时数据区分布图: JVM栈(Java Virtual Machine Stacks): Java中一个线程就会相应有一个线程栈与之对应,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈,因此栈存储的信息都是跟当

              [转帖]Docker容器无法访问网络问题(网段冲突)

              近日在使用docker在腾讯云服务器上部署项目 运行容器时死活访问不了网络,不论是外网还是内网。 最后找到原因是docker容器ip网段与服务器内网ip网段冲突导致的 使用此命令查看到 ifconfig 1 可以看到ip段冲突了 咱们重建docker的ip段 首先删除docker的网卡docker0