删除Docker镜像

时间:2020-03-05 15:25:23  来源:igfitidea点击:

如果我们继续创建Docker镜像,我们将很快开始运行空间。
删除旧和未使用的Docker镜像将为我们释放大量磁盘空间。

在本文中,我将讨论从系统中删除Docker镜像的各种情况。

删除Docker镜像的方法

首先,使用此命令检查系统上的Docker镜像:

docker images

输出将显示所有Docker镜像及其镜像ID。
我们需要此镜像名称(在存储库列下)或者镜像ID以从系统中删除Docker镜像。

Hyman@theitroad:~$docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian              latest              67e34c1c9477        2 weeks ago         114MB
ubuntu              latest              775349758637        6 weeks ago         64.2MB

使用镜像ID,我们可以按以下方式删除Docker Image:

docker rmi image_name_or_id

我们也可以使用此命令,因为两者都相同:

docker image rm image_id

这是输出看起来的样子:

Hyman@theitroad:~$docker rmi 67e34c1c9477
Untagged: debian:latest
Untagged: Hyman@theitroad:79f0b1682af1a6a29ff63182c8103027f4de98b22d8fb50040e9c4bb13e3de78
Deleted: sha256:67e34c1c9477023c0ce84c20ae5af961a6509f9952c2ebbf834c5ea0a286f2b8
Deleted: sha256:f2b4f0674ba3e6119088fe8a98c7921ed850c48d4d76e8caecd7f3d57721b4cb

如果使用镜像ID,它将删除与该ID关联的所有镜像。

删除与容器关联的Docker镜像

如果你可以删除这样的Docker镜像,生活会更简单。
但这不会经常发生。

如果我们有与Docker镜像关联的容器,则在尝试删除镜像时会遇到一些错误。

Hyman@theitroad:~$docker rmi 775349758637
Error response from daemon: conflict: unable to delete 775349758637 (cannot be forced) - image is being used by running container 13dc0f4226dc

我们必须先停止容器:

Hyman@theitroad:~$docker stop 13dc0f4226dc
13dc0f4226dc

问题是,即使我们停止容器,如果我们尝试删除镜像,它仍然会抱怨:

Hyman@theitroad:~$docker rmi 67e34c1c9477
Error response from daemon: conflict: unable to delete 67e34c1c9477 (must be forced) - image is being used by stopped container 5ced86b1fcee

我们可以在这里有两个选项:

  • Force删除Docker Image(关联的容器将保留在系统中)
  • 删除关联的容器,然后删除Docker镜像

要强制删除Docker镜像,可以使用-f选项:

docker rmi -f image_id

要删除容器然后删除镜像,可以使用这样的内容:

docker rm container_id
docker rmi image_id

删除与多个容器相关联的Docker镜像

如果Docker镜像与仅一个容器相关联,生活仍然是一个更简单的。
但是镜像可以具有与之相关的多个容器并去除那种Docker镜像变得疼痛。

你会看到这样的错误:

Hyman@theitroad:~$docker rmi 775349758637
Error response from daemon: conflict: unable to delete 775349758637 (must be forced) - image is referenced in multiple repositories

首先,我们需要查找与镜像名称关联的所有容器(不是ID)。

docker ps -a -q --filter ancestor=docker_image_name
  • -a选项显示所有运行和停止的容器。
  • -q选项只显示容器ID。

然后你需要停止所有这些。
我们可以逐个使用容器ID,但这将过于耗时。
我们可以使用管道和XARG的魔法来停止与镜像关联的所有容器:

docker ps -a -q --filter ancestor=ubuntu | xargs docker stop

然后,我们可以删除停止的容器或者强制删除镜像(如我们在上一节中所见)。

如果要删除与镜像关联的所有容器,请运行此命令:

docker ps -a -q --filter ancestor=ubuntu | xargs docker rm

现在,我们可以使用本教程前面显示的命令删除Docker镜像。

一次删除多个Docker镜像

我们还可以在一个单个命令中删除多个Docker镜像。
它与上一个命令相同。
我们只需要指定镜像ID或者镜像名称。

docker rmi image_id_1 image_id_2 image_id_3

当然,我们必须停止与镜像关联的任何运行容器。

一次删除所有未使用和悬空的Docker镜像

在你看到之前,让我解释一下未使用和悬空的镜像是什么:

任何与其相关联的容器(停止或者运行)的任何Docker镜像都是二手镜像。
如果Docker镜像没有关联的容器,则它变为和未使用的Docker镜像。

一个悬垂的Docker镜像"意味着我们已创建了镜像的新构建,但未给出新名称。

所以你已经成为悬空的形象。
当运行"Docker Images"命令时,那些旧镜像是未标记的,并在其名称上显示<none>。
"

如果要删除悬挂镜像,则可以使用PRUNE选项:

docker image prune

如果要立即删除未使用和悬挂镜像,可以使用选项-a:a:

docker image prune -a

我们应该在输出结束时看到它释放的空间:

Hyman@theitroad:~$docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: ubuntu:latest
untagged: Hyman@theitroad:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d
untagged: debian:latest
untagged: Hyman@theitroad:79f0b1682af1a6a29ff63182c8103027f4de98b22d8fb50040e9c4bb13e3de78
deleted: sha256:67e34c1c9477023c0ce84c20ae5af961a6509f9952c2ebbf834c5ea0a286f2b8
deleted: sha256:f2b4f0674ba3e6119088fe8a98c7921ed850c48d4d76e8caecd7f3d57721b4cb
untagged: fedora:latest
untagged: Hyman@theitroad:d4f7df6b691d61af6cee7328f82f1d8afdef63bc38f58516858ae3045083924a
deleted: sha256:f0858ad3febdf45bb2e5501cb459affffacef081f79eaa436085c3b6d9bd46ca
deleted: sha256:2ae3cee18c8ef9e0d448649747dab81c4f1ca2714a8c4550eff49574cab262c9
Total reclaimed space: 308.3MB

我们可以使用Preune命令一点智能,只能删除旧的未使用和悬空镜像。
因此,如果要删除超过24小时的人,请使用这样:

docker image prune -a --filter "until=24h"

从系统中删除所有Docker镜像

也许我们在测试环境中,我们希望通过删除所有Docker镜像来重新开始。

要删除所有Docker镜像,我们需要首先停止所有运行的容器。

docker ps -a -q | xargs docker rm

现在,我们可以以这种方式删除所有镜像:

docker images -a -q | xargs docker rmi -f