V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
stephen2009
V2EX  ›  Linux

docker overlay 占用磁盘大

  •  
  •   stephen2009 · 2023-08-12 22:06:53 +08:00 · 2971 次点击
    这是一个创建于 473 天前的主题,其中的信息可能已经有所发展或是发生改变。

    系统是 Ubuntu 20.04 ,

    root 账户登录, 输入 df -h 命令,显示 docker overlay 占用大,有 12GB ,

    cd 进入该目录,输入 du -h -x –max-depth=1 #将目录按从小到大排列,但是这里加起来也没有 12GB 啊,求帮助,谢谢大家啊。

    这是截图

    https://i.imgur.com/WTAEfzw.png

    14 条回复    2023-08-14 05:24:57 +08:00
    xinzi
        1
    xinzi  
       2023-08-12 22:19:38 +08:00
    docker overlay2 占用大量磁盘空间,解决办法
    突然发现 overlay2 目录下占用 3.7g 的文件, 检查发现都是无用的镜像.
    docker 占用的空间可以通过下面的命令查看:
    docker system df
    docker overlay2 占用大量磁盘空间, 解决办法

    列出了 docker 使用磁盘的 4 种类型:

    Images:所有镜像占用的空间,包括拉取下来的镜像,和本地构建的。
    Containers:运行的容器占用的空间,表示每个容器的读写层的空间。
    Local Volumes:容器挂载本地数据卷的空间。
    Build Cache:镜像构建过程中产生的缓存空间 (只有在使用 BuildKit 时才有,Docker 18.09 以后可用)。
    最后的 RECLAIMABLE 是可回收大小

    删除所有镜像
    xinzi
        2
    xinzi  
       2023-08-12 22:20:26 +08:00
    修改 Docker 配置(可选)
    以下配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小,防止 Docker 日志塞满硬盘(泪的教训):

    /etc/docker/daemon.json
    {
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "20m",
    "max-file": "3"
    },
    "ipv6": true,
    "fixed-cidr-v6": "fd00:dead:beef:c0::/80",
    "experimental":true,
    "ip6tables":true
    }
    bohai
        3
    bohai  
       2023-08-12 22:27:48 +08:00
    之前清理了大量的数据?之前貌似遇到过一次。需要重启系统或者清除一下缓存就可以了。不妨先试试清楚系统缓存看看

    sync && sleep 30
    echo 2 > /proc/sys/vm/drop_caches

    df -hT 再看看
    leloext
        4
    leloext  
       2023-08-12 22:31:42 +08:00
    看看是不是 docker 的日志太多了
    thinkershare
        5
    thinkershare  
       2023-08-12 22:34:23 +08:00
    docker 使用的镜像并不能使用 docker overlay 统计,请使用 docker system df, df -h 报告的大小没啥用处.
    Yunsheng
        6
    Yunsheng  
       2023-08-12 23:52:53 +08:00
    哈哈。真巧。刚好这两周也遇到类似的 vda 分区被占满了。最后发现是 docker 的问题。然后就对数据进行了迁移刀 vdb 区。然后重新对 docker 的数据映射做了一下重启就好了。可以空出来好多空间的。试试。谷歌查查对应方法。
    hefish
        7
    hefish  
       2023-08-12 23:59:05 +08:00
    搞不好是往容器里写了很多文件。
    skvi
        8
    skvi  
       2023-08-13 00:09:36 +08:00 via Android
    这两天遇到一个情况,容器里面/run ,64M 塞满,看了下全是/run/systemd/system/...scope.d, ....scope 文件,很久以前的都还在。
    EvineDeng
        9
    EvineDeng  
       2023-08-13 09:54:11 +08:00
    清理一下没有用到的数据 docker system prune -a
    julyclyde
        10
    julyclyde  
       2023-08-13 13:24:35 +08:00
    @bohai 你为什么会联想到 drop_caches 呢?
    bohai
        11
    bohai  
       2023-08-13 14:52:39 +08:00
    @julyclyde 在清理 docker 镜像和容器的时候,Docker 不会马上释放它们占的空间。因为 docker 会把它们保存在缓存中,以便在需要时快速访问。所以一旦清理了大量的数据,缓存也需要时间来释放,手动 drop 一下效果会立马生效
    julyclyde
        12
    julyclyde  
       2023-08-13 18:13:28 +08:00
    @bohai 建议你还是多学学基础知识
    bohai
        13
    bohai  
       2023-08-13 19:59:59 +08:00
    @julyclyde [抱拳]~
    yanqiyu
        14
    yanqiyu  
       2023-08-14 05:24:57 +08:00
    @bohai drop_caches 丢掉的是页面缓存,在内存里面
    真正可能成为陷阱的是一些被进程打开的文件,拿着引用计数导致磁盘上文件不能真正的删除,但这显然不是 po 遇到的问题,这类情况是删除了文件但 df 没变的时候
    ---
    po 遇到的问题的一个可能性是 docker 的数据是层叠的 overlayfs ,这东西要是容器写入了 base 里面的文件可能触发什么奇怪的全文件的 COW 导致占用翻倍(最极端的情况修改一个文件的几个 kb 的段,或者改一下文件的权限就可能导致整个文件被复制)
    docker container diff container_name 可以看看是不是有这类情况
    另外建议就是经常被修改的路径(状态,配置)放到 volume 里面,不要 commit 进容器,不要让容器在运行时修改容器本身
    (所以我爱用 btrfs 做存储后端)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5402 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 08:16 · PVG 16:16 · LAX 00:16 · JFK 03:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.