# Docker教程 - 7 处理占用空间问题

在使用 Docker 一段时间后,可能会遇到磁盘空间不足的问题,很可能的原因就是 Docker 占用了大部分的存储。

如果你也遇到了磁盘空间占用的问题,可以参考一下。


首先可以使用如下命令查询一下 Linux 的存储占用情况:

df -h
1

显示效果如下,可以列出磁盘的占用情况:

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% 
1
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"
1
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
1
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
1
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
1
2
3
4
5
6
7

这个时候可以进入到占用空间大的容器目录中,查看 /var/lib/docker/containers/容器ID-json.log 格式的日志文件是否占用很大的空间。如果占用很大空间,可以将该文件置空:

# 写入空字符串覆盖内容
echo '' > 容器id-json.log
1
2

不要删除 容器id-json.log 日志文件,可能会导致空间不被释放或影响新日志产生,那么就需要重启 Docker 服务了。

# 7.3 限制日志文件大小

以上删除日志的方法只能暂时解决日志占用空间过大问题,如果想一劳永逸可修改docker配置文件,增加日志文件大小限制。

编辑 /etc/docker/daemon.json ,添加日志配置:

{
    "log-driver":"json-file",
    "log-opts":{
        "max-size" :"50m",
        "max-file":"1" 
    }
}
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
1
2
3
4
5