删除Docker镜像
如果我们继续创建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