Docker删除了镜像后占用空间没变

在使用Docker时,有时候会遇到这样的情况:删除了一个镜像,但是占用的磁盘空间并没有释放出来。这可能是因为Docker的工作机制导致的,并不代表删除镜像操作失败了。在本文中,我们将介绍为什么会出现这种情况,以及如何正确地删除镜像并释放磁盘空间。

Docker镜像和容器

在深入讨论之前,首先让我们快速了解一下Docker的基本概念。

  • Docker镜像:镜像是一个只读的模板,可以用来创建Docker容器。镜像包含了用于运行容器的所有文件系统,包括代码、依赖项、环境变量和配置等。
  • Docker容器:容器是基于镜像创建的一个可运行的实例。容器可以独立运行,不会与其他容器共享资源,因此可以在不同的环境中部署和运行。

Docker镜像的删除机制

当我们使用Docker删除一个镜像时,实际上只是删除了对应的标签。这是因为Docker镜像是按照分层的方式构建的,每一层都是一个只读文件系统。当我们删除一个镜像时,Docker会检查该镜像的每一层是否被其他镜像或容器所使用,如果没有,那么这些层就会被删除。

然而,即使删除了一个镜像的所有标签,这些层并不会立即从磁盘上删除。相反,它们会被标记为“无标签”状态,直到没有任何镜像或容器再次引用它们。这样设计的目的是为了避免在删除镜像后,误删其他正在使用相同层的镜像或容器。

镜像删除的正确方法

虽然删除镜像后磁盘空间不会立即释放,但我们可以通过一些命令来清理无用的层,从而释放磁盘空间。下面是一些常用的命令:

  1. docker image prune:该命令可以删除无标签的镜像。使用该命令前,请确保您不再需要这些镜像,因为一旦删除,它们将不可恢复。可以使用以下命令来执行清理:
docker image prune
  1. docker system prune:该命令可以清理不再使用的镜像、容器和网络等资源。使用该命令前,请确保您不再需要这些资源,因为一旦删除,它们将不可恢复。可以使用以下命令来执行清理:
docker system prune

示例

下面是一个示例,展示了删除镜像后占用空间没有变化的情况:

# 查看当前的镜像和磁盘空间占用
$ docker images
REPOSITORY     TAG        IMAGE ID       CREATED       SIZE
ubuntu         latest     4dd97cefde62   2 weeks ago   73.9MB

$ docker system df
TYPE            TOTAL           ACTIVE          SIZE            RECLAIMABLE
Images          1               0               73.9MB          73.9MB (100%)
...

# 删除镜像
$ docker rmi ubuntu
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:xxxxxx
Deleted: sha256:4dd97cefde62xxxxxx

# 再次查看镜像和磁盘空间占用
$ docker images
REPOSITORY     TAG        IMAGE ID       CREATED       SIZE

$ docker system df
TYPE            TOTAL           ACTIVE          SIZE            RECLAIMABLE
Images          0               0               73.9MB          73.9MB (100%)
...

可以看到,删除镜像后,镜像列表为空,但是磁盘空间占用仍然显示为73.9MB。这是因为磁盘空间并没有立即释放,需要执行清理命令才能真正释放。