目 录CONTENT

文章目录

解决docker占满磁盘问题

Seven
2021-09-15 / 0 评论 / 0 点赞 / 453 阅读 / 5862 字 / 正在检测是否收录...

在使用docker一段时间后突然出现某个容器进程挂掉,然后再去重新启动都会失败,这是可能需要看看是不是docker把磁盘占满了。下面详细介绍一下我遇到docker占满磁盘的一次经历。

某天上午测试突然反馈内网测试环境业务出现问题,功能不能正常使用,于是赶紧查看日志定位,发现是zookeeper连接异常了,zookeeper是使用docker部署,一般不会出现问题。

执行docker ps 命令发现 zookeeper已经挂掉了,然后执行 docker ps -a 查看zookeeper的容器id,接着执行docker start <zookeerper 容器id> ,发现zookeeper已经起不来了
2. 查看zookeeper的日志

在/var/lib/docker/containers目录下 感觉容器id找对应的log,根据error异常百度发现是磁盘满了

  1. 查看服务器的磁盘使用情况

    执行df命令

    [root@apollo containers]# df
    Filesystem 1K-blocks Used Available Use% Mounted on
    /dev/mapper/vg-root 15971232 12841532 2295348 100% /
    /dev/sda1 487634 195848 262090 43% /boot
    tmpfs 800900 0 800900 0% /run/user/0
    /dev/sdb 103080888 61464 97760160 1% /data2
    overlay 15971232 12841532 2295348 100%

/var/lib/docker/overlay2/7f45979e4ea63e8a4a8c8228c3177d33b26215462301fdccb4eb456e4d753c54/merged

所有的overlay 的Use% 都提示100% ,根目录/ 的Use%也提示100%,确实磁盘占满了

4.一层一层查看那个文件夹或文件占用磁盘最多
在根目录下执行命令
du -h --max-depth=1一层一层查看,发现/var/lib/docker占用的磁盘空间最多

  1. 清理docker 占用的磁盘

经查看最大的文件夹有/var/lib/docker/volumes,/var/lib/docker/overlay2,/var/lib/docker/containers

containers中存放了所有的容器的日志,可以用容器的id找到对应的目录,如果容器已经停止或删除,可以直接删除对应的文件夹。

volumes,overlay2 占用的磁盘空间最多,很明显就是要删除这个两个目录下面的东西,但是这里对应的文件夹无法和容器id对应上来,所以不能随便删除。只能先使用docker的命令来删除。
先执行 docker system prune命令 ,发现清理出来一些空间了。
$ docker system prune
WARNING! This will remov

  • all stopped containers

  • all networks not used by at least one container

  • all dangling images

  • all build cache

    然后执行docker volume prune,删除没有使用的数据卷,但是还有很多的空间占用
    $ docker volume prune

    WARNING! This will remove all local volumes not used by at least one container.

    详细查看volume文件夹
    执行
    du -h --max-depth=1
    查看里面占用磁盘最多的一个文件夹

    打开进入一看,原来是数据库,原来根源是数据库占用将近一半的磁盘空间,于是清理了一下数据库,磁盘空间释放了一半出来了。

    详细查看overlay2 文件夹
    overlay2也占用了不少的空间,经过排除 一个容器可能会关联多个 overlay2 下面的目录,无从下手,放弃了。

最后记录几个有用的命令:

docker system df ----查看Docker占用分布

docker builder prune 清理构建缓存

docker system prune 清理关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)

docker system prune -a 命令,这会删除所有未使用的镜像

注意

  • 在使用清理命令之前,请确保不会意外删除仍在使用的资源。
  • 清理操作是不可逆的,一旦执行,删除的资源将无法恢复。
  1. docker stats ---可以查看docker容器的内存占用

docker stats ---- Display a live stream of container(s) resource usage statistics

CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS

5f10308a7d93 zookeeper 0.12% 68.73MiB / 7.79GiB 0.86% 1.5kB / 0B 5.97MB / 32.8kB 38

70062327fc72 apollo-portal 0.17% 402.8MiB / 7.79GiB 5.05% 5.5GB / 3.94GB 86.5MB / 24.6kB 53

808793d179ee apollo-admin 0.16% 442.1MiB / 7.79GiB 5.54% 18.1GB / 16.1GB 118MB / 24.6kB 59

7feade55a442 apollo-configser 1.16% 452.7MiB / 7.79GiB 5.68% 84.5GB / 53.6GB 158MB / 24.6kB 96

89f85b83a29b mysql 1.10% 659.9MiB / 7.79GiB 8.27% 77.4GB / 124GB 16.1GB / 2.31TB 178

CONTAINER ID and Name :the ID and name of the container

CPU % and MEM % :the percentage of the host’s CPU and memory the container is using

MEM USAGE / LIMIT:the total memory the container is using, and the total amount of memory it is allowed to use

NET I/O:The amount of data the container has sent and received over its network interface

BLOCK I/O:The amount of data the container has read to and written from block devices on the host

PIDs:the number of processes or threads the container has created

关于控制DOCKER自动生成日志json-file的大小

容器长时间运行后,会生成大量的logs日志,这样能有效控制容器自动生成日志。

vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://0v0l236l.mirror.aliyuncs.com"],
"insecure-registries":["192.168.0.42:5000","192.168.0.129:8050"],
"log-driver":"json-file", #日志存储格式
"log-opts":{
        "max-size" :"10m","max-file":"3" #日志大小及副本数
        }
}

扩展资料:
https://docs.docker.com/engine/reference/commandline/stats/?spm=a2c6h.13066369.0.0.7c314e3c1ttce3

0

评论区