# Docker教程 - 7 处理占用空间问题
在使用 Docker 一段时间后,可能会遇到磁盘空间不足的问题,很可能的原因就是 Docker 占用了大部分的存储。
如果你也遇到了磁盘空间占用的问题,可以参考一下。
首先可以使用如下命令查询一下 Linux 的存储占用情况:
df -h
显示效果如下,可以列出磁盘的占用情况:
root@foooor:~# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.5G 2.3M 1.5G 1% /run
/dev/vda3 197G 114G 76G 61% /
tmpfs 7.5G 0 7.5G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/vda2 197M 6.1M 191M 4% /boot/efi
tmpfs 50M 0 50M 0% /usr/local/aegis/cgroup
overlay 197G 114G 76G 61%
2
3
4
5
6
7
8
9
# 7.1 删除容器和镜像
我们可以将不再使用的容器和镜像删除,释放存储空间。
# 删除容器
docker rm 容器id或容器名称
# 删除镜像
docker rmi 镜像id
# 删除虚悬镜像和没有使用的镜像
docker image prune
# 删除虚悬镜像
docker image prune --filter "dangling=true"
2
3
4
5
6
7
8
9
10
11
# 7.2 删除日志
但是大部分情况下,都是 Docker 日志占用大部分存储空间。使用 df -h
查看硬盘空间占用,经常会发现 /var/lib/docker/overlay2/**
占用了很大的空间。
root@iZwz9gnu6b2zw8uv4oledqZ:~# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.5G 2.3M 1.5G 1% /run
/dev/vda3 197G 114G 76G 61% /
tmpfs 7.5G 0 7.5G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/vda2 197M 6.1M 191M 4% /boot/efi
tmpfs 50M 0 50M 0% /usr/local/aegis/cgroup
overlay 197G 114G 76G 61% /var/lib/docker/overlay2/8af9d965cadfd80e5ef1bf1d73af576f28d6ef6537b879eb58c0dc9/merged
overlay 197G 114G 76G 61% /var/lib/docker/overlay2/9b907b3e87e0bedc0fa1d83bb526b63b93e861a25f754124e7b9428/merged
overlay 197G 114G 76G 61% /var/lib/docker/overlay2/8bbc192fb6b49c93002f588e212d541a8e7c2c6fa877a2072e174d1/merged
overlay 197G 114G 76G 61% /var/lib/docker/overlay2/4bac71ae21409a061b586873510e176a039c120ec739cb566f5f75b/merged
overlay 197G 114G 76G 61% /var/lib/docker/overlay2/0395046dcf21c33cd27464ebc6872671944a4ac3f0bce92731b968b/merged
overlay 197G 114G 76G 61% /var/lib/docker/overlay2/78e7af8ec5f1f3561eca778cb1ee63b1c9133ba43fbc0977c495464/merged
overlay 197G 114G 76G 61% /var/lib/docker/overlay2/0ffc6ce6a1d375c22efb722f8385f4879014f193f4a2c546d5da5ba/merged
2
3
4
5
6
7
8
9
10
11
12
13
14
15
如何处理呢?
我们可以使用 du -sh
查看文件和文件夹的占用空间,找到占用大量空间的文件夹和文件。
举个栗子:
# 查看根路径下各个目录的占用情况
root@foooor:/# du -sh *
# 使用du -sh /var/lib/docker/*查看 /var/lib/docker 目录下的占用情况,
# 当然也可以进入到目录下,然后使用du -sh * 查看
root@foooor:/var/lib/docker# du -sh *
6.7M buildkit
16G containers
4.0K engine-id
8.3M image
120K network
15G overlay2
16K plugins
4.0K runtimes
2
3
4
5
6
7
8
9
10
11
12
13
14
通过上面的命令查看到哪个目录占用的空间,一般情况下会找到 /var/lib/docker/containers/
目录占用的空间比较大。可以查看该目录下的各个容器占用的空间:
root@fooor:/var/lib/docker/containers# du -sh *
9.0G 8af9d965cadfd80e5ef1bf1d73af576f28d6ef6537b879eb58c0dc9
45M 9b907b3e87e0bedc0fa1d83bb526b63b93e861a25f754124e7b9428
44K 8bbc192fb6b49c93002f588e212d541a8e7c2c6fa877a2072e174d1
4.2G 4bac71ae21409a061b586873510e176a039c120ec739cb566f5f75b
5.6M 78e7af8ec5f1f3561eca778cb1ee63b1c9133ba43fbc0977c495464
44K 0ffc6ce6a1d375c22efb722f8385f4879014f193f4a2c546d5da5ba
2
3
4
5
6
7
这个时候可以进入到占用空间大的容器目录中,查看 /var/lib/docker/containers/容器ID-json.log
格式的日志文件是否占用很大的空间。如果占用很大空间,可以将该文件置空:
# 写入空字符串覆盖内容
echo '' > 容器id-json.log
2
不要删除 容器id-json.log
日志文件,可能会导致空间不被释放或影响新日志产生,那么就需要重启 Docker 服务了。
# 7.3 限制日志文件大小
以上删除日志的方法只能暂时解决日志占用空间过大问题,如果想一劳永逸可修改docker配置文件,增加日志文件大小限制。
编辑 /etc/docker/daemon.json
,添加日志配置:
{
"log-driver":"json-file",
"log-opts":{
"max-size" :"50m",
"max-file":"1"
}
}
2
3
4
5
6
7
log-driver
:设置为json-file
,Docker 将使用 JSON 文件格式来记录容器的日志。这种日志驱动将日志以结构化的 JSON 格式写入文件中,方便后续的日志分析和处理。max-size
:设置为50m
,表示单个日志文件的最大大小为 50 MB。当一个日志文件达到这个大小后,Docker 会自动进行日志文件的轮转,创建一个新的日志文件来继续记录日志。max-file
:设置为1
,表示最多保留一个旧的日志文件。例如,当新的日志文件被创建后,只有一个旧的日志文件会被保留,其余更旧的日志文件将被删除。
然后需要重启 Docker 服务:
# 重新加载服务
sudo systemctl daemon-reload
# 重启docker服务
sudo systemctl restart docker
2
3
4
5