Docker占用的磁盘空间清理

本文介绍如何使用Docker System命令清理磁盘空间,包括dockersystemdf和dockersystemprune命令的使用方法。同时提供了针对旧版Docker的手动清理技巧,并探讨了通过配置日志大小限制和重启Docker服务进一步优化磁盘使用率。

Docker占用的磁盘空间清理

1. docker system命令

在谁用光了磁盘?Docker System命令详解中,我们详细介绍了docker system命令,它可以用于管理磁盘空间。

docker system df命令,类似于Linux上的df命令,用于查看Docker的磁盘使用情况:

docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              147                 36                  7.204GB             3.887GB (53%)
Containers          37                  10                  104.8MB             102.6MB (97%)
Local Volumes       3                   3                   1.421GB             0B (0%)
Build Cache                                                 0B                  0B

可知,Docker镜像占用了7.2GB磁盘,Docker容器占用了104.8MB磁盘,Docker数据卷占用了1.4GB磁盘。

docker system prune命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。docker system prune -a命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了…所以使用之前一定要想清楚吶。

执行docker system prune -a命令之后,Docker占用的磁盘空间减少了很多:

docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              10                  10                  2.271GB             630.7MB (27%)
Containers          10                  10                  2.211MB             0B (0%)
Local Volumes       3                   3                   1.421GB             0B (0%)
Build Cache                                                 0B                  0B
2. 手动清理Docker镜像/容器/数据卷

对于旧版的Docker(版本1.13之前),是没有docker system命令的,因此需要进行手动清理。这里给出几个常用的命
删除所有关闭的容器

docker ps -a | grep Exit | cut -d ’ ’ -f 1 | xargs docker rm
删除所有dangling镜像(即无tag的镜像):

docker rmi (docker images | grep "^<none>" | awk "{print3}”)
删除所有dangling数据卷(即无用的volume):

docker volume rm $(docker volume ls -qf dangling=true)

3. 限制容器的日志大小

有一次,当我使用1与2提到的方法清理磁盘之后,发现并没有什么作用,于是,我进行了一系列分析。

在Ubuntu上,Docker的所有相关文件,包括镜像、容器等都保存在/var/lib/docker/目录中:

du -hs /var/lib/docker/
97G /var/lib/docker/
Docker竟然使用了将近100GB磁盘,这也是够了。使用du命令继续查看,可以定位到真正占用这么多磁盘的目录:

92G /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53
由docker ps可知,nginx容器的ID恰好为a376aa694b22,与上面的目录/var/lib/docker/containers/a376aa694b22的前缀一致:

docker ps
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS               NAMES
a376aa694b22        192.168.59.224:5000/nginx:1.12.1            "nginx -g 'daemon off"   9 weeks ago         Up 10 minutes                           nginx

因此,nginx容器竟然占用了92GB的磁盘。进一步分析可知,真正占用磁盘空间的是nginx的日志文件。那么这就不难理解了。我们Fundebug每天的数据请求为百万级别,那么日志数据自然非常大。

使用truncate命令,可以将nginx容器的日志文件“清零”:

truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53/*-json.log
当然,这个命令只是临时有作用,日志文件迟早又会涨回来。要从根本上解决问题,需要限制nginx容器的日志文件大小。这个可以通过配置日志的max-size来实现,下面是nginx容器的docker-compose配置文件:

nginx:
image: nginx:1.12.1
restart: always
logging:
driver: “json-file”
options:
max-size: “5g”
重启nginx容器之后,其日志文件的大小就被限制在5GB,再也不用担心了~

4. 重启Docker

还有一次,当我清理了镜像、容器以及数据卷之后,发现磁盘空间并没有减少。根据Docker disk usage提到过的建议,我重启了Docker,发现磁盘使用率从83%降到了19%。根据高手指点,这应该是与内核3.13相关的BUG,导致Docker无法清理一些无用目录:

it’s quite likely that for some reason when those container shutdown, docker couldn’t remove the directory because the shm device was busy. This tends to happen often on 3.13 kernel. You may want to update it to the 4.4 version supported on trusty 14.04.5 LTS.

The reason it disappeared after a restart, is that daemon probably tried and succeeded to clean up left over data from stopped containers.

<think> 我们参考了多个关于清理Docker磁盘空间的引用,综合给出以下方法。用户的主要需求是清理Docker占用磁盘空间,我们将提供多种清理方式,并说明注意事项。 根据引用[1][2][3][4][5],清理方法主要包括: 1. 使用docker system prune命令清理 2. 清理未使用的镜像、容器、卷和网络 3. 清理日志文件 4. 其他辅助方法(如迁移存储位置、限制日志大小等) 我们将逐步说明清理步骤: </think> ### 清理Docker磁盘空间的完整指南 以下是基于站内引用整理的Docker磁盘空间清理方法,按操作风险从低到高排序:[^1][^2][^3][^4][^5] --- #### **1. 查看磁盘占用情况(首选)** ```bash # 查看Docker整体磁盘使用 docker system df # 查看详细占用(镜像/容器/卷) docker system df -v # 检查Docker存储目录大小 du -hs /var/lib/docker/ ``` --- #### **2. 安全清理(推荐)** ```bash # 删除所有悬空资源(无tag镜像、停止的容器、无用网络) docker system prune ``` ▸ 可释放空间:悬空镜像($IMAGE$)、停止的容器($CONTAINER$)、孤立网络 ▸ **注意**:不会删除正在运行的容器和有容器引用的镜像[^2][^4] --- #### **3. 深度清理(谨慎使用)** ```bash # 删除所有未使用的资源(包含未被任何容器引用的镜像) docker system prune -a ``` ▸ 效果:释放空间 $\propto$ (未使用镜像数 $\times$ 平均镜像大小) ▸ **风险**:会删除所有未被容器使用的镜像[^4][^5] --- #### **4. 专项清理** **► 清理悬空卷** ```bash docker volume rm $(docker volume ls -qf dangling=true) ``` ▸ 适用场景:当`docker system df`显示$VOLUME$占用过高时[^5] **► 清理日志文件** ```bash # 查找大日志文件(示例查找>1G文件) find /var/lib/docker -size +1G -name "*.log" # 清空日志文件(需确认文件名) truncate -s 0 /path/to/large.log ``` ▸ **预防措施**:在docker-compose.yml限制日志大小[^5]: ```yaml logging: driver: "json-file" options: max-size: "500m" ``` --- #### **5. 终极解决方案** ```bash # 停止Docker服务 sudo systemctl stop docker # 迁移数据目录(需大容量磁盘) rsync -av /var/lib/docker /new/storage/ # 修改启动配置(/etc/docker/daemon.json) { "data-root": "/new/storage/docker" } ``` --- ### 最佳实践建议 1. **定期维护**:每月执行 `docker system prune`[^1] 2. **镜像管理**:及时删除无用镜像 ($\sum_{i=1}^{n} \text{镜像大小}_i$) 3. **监控预警**:设置磁盘使用阈值(如 $\geqslant 85\%$ 时告警) 4. **规范部署**:使用.dockerignore避免构建冗余文件[^1] > 📌 **关键注意**:执行 `prune -a` 前需确保无重要镜像被误删,建议先备份关键镜像[^2][^4]。对于生产环境,推荐使用容器编排工具(如K8s)自动回收资源[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值