Docker-日志以及磁盘占满解决

磁盘占满

du -x -h --max-depth=1 /var/lib/docker/containers/
docker ps -a   

step by step

01. docker info 
    Docker Root Dir: /var/lib/docker
02.du -x -h --max-depth=1 /var/lib/docker
    docker默认存放镜像地址为 /var/lib/docker 
   容器的日志文件在/var/lib/docker/containers/	

03.docker system df 	

容器日志

查看容器日志命令: 
# 查看所有容器下日志的大小
    find /var/lib/docker/containers/ -name *-json.log |xargs du -
   docker logs -f container_name(容器名称)
  进程一直在持续输出,而这些输出会记录到docker日志中,
删除日志
    01.通过rm 日志删除后重启docker
      Linux或者Unix系统中,通过rm -rf或者文件管理器删除文件,
      将会从文件系统的目录结构上解除链接(unlink)。
      如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用
	  <1>.查看当前目录正在被哪些进程在使用  
	      fuser -uv .
		  lsof
	      pidof 
    02.覆盖操作 *cat /dev/null > -json.log
限制容器日志--不禁止日志输出,可以限制文件的大小	
    全局:docker需要重新加载配置文件和重启
        /etc/docker/daemon.json  中log-opts参数
    	参数 说明
          log-opts max-size 容器日志文件上限大小
          log-opts max-file 窗口日志文件上限个数
    容器范围内 
      docker run增加如下参数
        --log-opt max-size=100m --log-opt max-file=3

容器日志过大

1.具体容器名称的日志位置
   docker inspect --format='{{.LogPath}}' mytest
2./var/lib/docker/containers 目录中,通过下面的命令可以将日志文件夹根据升序的方式罗列出来
   sudo du -d1 -h /var/lib/docker/containers | sort -h
3.删除日志方式-删除大的 log 文件
    方式一:
      cat /dev/null>$log   
      Linux执行sudo echo xxx >> 命令提示权限不够的问题
        bash -c命令。该命令可以让bash运行整条字符串命令,前加sudo使得整条命令运行时具有root权限
          sudo bash -c 'echo aa >> a.txt'	  
    方法二:
     使用tee命令。该命令可以将管道中内容写入文件,只需要对该命令赋予root权限就可以操作a.txt文件
     echo aa |sudo tee -a a.txt >/dev/null
     注意:tee命令的-a选项是追加的意思,如果不加此选项,输出文本将覆盖文件。
    
    方式三
       使用rm -rf方式删除日志后,通过df -h会发现磁盘空间并没有释放。
       原因是在Linux或者Unix系统中,通过rm -rf或者文件管理器删除文件,将会从文件系统的目录结构上解除链接
       过rm -rf删除后重启docker服务 

单行命令

    sudo find /var/lib/docker/containers/ -name *-json.log |xargs -i sudo  bash -c " cat /dev/null > {} "

定时删除日志 #超过5G自动清理 字节B

#!/bin/sh
echo "=================== start clean docker containers logs ==========================" 
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs; 
do
   log_size=$(ls -l $log|awk '{print $5}')
   if [ ${log_size} -gt 5368709120 ]; then 
    echo "clean logs:" 
    echo $log
    cat /dev/null>$log
   fi
done
echo "==================== end clean docker containers logs =========================="
echo `date`
###脚本说明
  出现如题的“ integer expression expected”错误。这是因为这几个参数: -gt ,-lt,-eq 比较的都是数字和变量	
   dev/null被使用的最大方式是丢弃整个输出中的标准输出或标准错误。
crontab -e
###每日定时清理dockerlog
0 0 * * * /bin/bash /opt/crondocker/clear.sh > /opt/crondocker/clear-log.log

硬盘空间

 df 是 disk free 的缩写
 命令即可做到,即搜索所有的deleted的进程,然后将所有的deleted的进程杀死
  lsof | grep deleted|awk '{print $2}'|xargs kill -9
  
    lsof(list open files),
      -i <条件> 输出符合条件与网络相关的文件
	   lsof -p 1335
	    lsof /dev/vda1
	    # 323 号端口相关的文件
        lsof -i:323
		lsof -u root
	fuser是一个用于显示文件或目录被哪些进程使用的工具
	   fuser命令仅针对Linux系统,而lsof命令则可以在多种操作系统平台上使用,包括Linux、UNIX以及Mac等

tar

 压缩 c
 解压 x  x代表解压,v代表显示详细的解压过程,f表示接下来的参数是文件名

附录

02.删除roscore进程
    killall -9 roscore
    killall -9 rosmaster
03.端口占用
  fuser -v 66/udp 77/udp   
  lsof -i:66 
04.ROS主从设置取消
 export ROS_HOSTNAME=localhost
 export ROS_MASTER_URI=http://localhost:11311 
 
05.ping 192.128.1.2 判断硬件是否可以连接通
  sudo chown -R tt:tt  ./data
   --recursive
 lsblk -d -o name,rota  
      查看,0表示固态硬盘,1表示机械硬盘, 
 lsblk -f 
      也可以查看挂载和未挂载的文件系统类型
 file -s /dev/sda3 
       查看指定挂载盘的文件系统类型
 df -Th  命令 查看文件系统类型在Type列输出
    
 du -h -x --max-depth=1     
      磁盘空间根目录占满,命令逐级查找大文件
 scp -r 

镜像的架构

 Linux container runtime / Wasm containerd shim 	 
 ###Docker容器引擎安装后包含有这些组件:dockerd、Containerd、runc。
    dockershim  “shim”,意思是“垫片”。	 
###k8s -CRI
 Kubelet
   CRI(Container Runtime Interface)
   CRI shim是实现CRI接口的gRPC server服务,负责连接Kubelet和Container runtime
	   Container runtime是容器运行时工具,它为用户进程隔离出一个独立的运行环境
K8s的调用方式	   
 CRI 接口调用 dockershim,然后 dockershim 调用 docker,docker 再去 containerd 操作容器。
 CRI 接口直接调用 containerd 操作容器

ctr    是 containerd 的一个客户端工具。
crictl 是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序。

 docker 由 docker-client,dockerd,docker-shim,containerd,runc组成,所以containerd是docker的基础组件之一

容器运行时标准(runtime spec) 容器镜像标准(image spec) ###

OCI (Open Container Initiative 开放容器标准),该规范包含两部分内容:
     容器运行时标准(runtime spec)、容器镜像标准(image spec)
容器运行时标准	-init  creating created running stopped	 
	高级容器运行时--开源containerd
	   containerd
	   cri-o 
	低级容器运行时有:
	    runc : 我们最熟悉也是被广泛使用的容器运行时,代表实现Docker。runv:
		runV : 是一个基于虚拟机管理程序(OCI)的运行时。它通过虚拟化 guest kernel,将容器和主机隔离开来,使得其边界更加清晰,。代表实现是kata和Firecracker
		runsc: runsc = runc + safety ,典型实现就是谷歌的gvisor,通过拦截应用程序的所有系统调用,提供安全隔离的轻量级容器运行时沙箱。用案例。
		wasm :  Wasm的沙箱机制带来的隔离性和安全性,都比Docker做的更好。 
           --runtime=io.containerd.wasmedge.v1

容器镜像标准(image spec)
    --platform=wasi/wasm32 指定我们想要使用的镜像的体系结构。通过利用Wasm体系结构,我们不需要为不同的体系结构构建单独的镜像
  镜像主要是由镜像层和容器配置两大部分组成的。
      文件系统:以 layer 保存的文件系统
	  b). config 文件
	  c). manifest 文件
	  d). index 文件:可选的文件,指向不同平台的 manifest 文件,这个文件能保证一个镜像可以跨平台使用

Reference

 File formats
 Command-line interfaces
posted @ 2023-02-23 09:49  辰令  阅读(769)  评论(0编辑  收藏  举报