如何移除Docker镜像?

885

我正在 macOS 10.8.4(Mountain Lion)上的 Vagrant 中运行 Docker,每当我尝试删除保存的映像时,就会收到一个错误:

$ docker rmi some-image-id
2013/07/15 hh:mm:ss unexpected JSON input
根据 rmi 命令的帮助文档,正确的语法为 docker rmi IMAGE [IMAGE...],但我不确定具体该怎么做。
我该如何删除一个镜像?
$ docker version
Client version: 0.4.8
Server version: 0.4.8
Go version: go1.1

$docker info
Containers: 1
Images: 3

有趣的是,当我运行docker ps命令时,居然没有任何容器显示。但是运行docker images命令会显示 4 个base镜像和 1 个node镜像。


1
你使用的是哪个版本的Docker?你能粘贴'docker version'和'docker info'的输出吗?我刚刚尝试了一下主分支,它运行得很好。 - creack
1
docker info 显示实际镜像数量,您可以尝试 ./docker images -a -q | sort | uniq | wc -l,它应该是相同的结果(-a 表示所有镜像,-q 表示仅显示 ID)。docker ps 仅显示活动容器,您可以执行 docker ps -a 列出所有容器。 - creack
你能否尝试使用-D选项启动docker守护进程和客户端? docker -d -D& ; docker -D rmi <id>。你也可以尝试CID=$(docker run -d ubuntu bash); ID=$(docker commit $CID); docker rmi $ID吗? - creack
好的,我有一个退出状态为137的容器(不确定是什么意思),而且docker images -a -q | sort | uniq | wc -l返回3(在该命令中使用./docker会返回“没有这样的文件”)。 - Jules
4
请查看这个拉取请求:https://github.com/dotcloud/docker/pull/1225 - creack
显示剩余5条评论
20个回答

1039

尝试执行docker rmi node。那应该可以工作。

查看所有已创建的容器非常简单,只需执行docker ps -a

要删除所有现有容器(而不是镜像!),请运行docker rm $(docker ps -aq)


15
如果您的某些容器仍在运行,您可以运行命令:docker stop $(docker ps -qa) 来停止所有容器。我认为删除正在运行的容器可能不起作用,至少我记得我曾经遇到过这样的问题。我可能是错的...我已经查阅了手册,它支持我的假设:“-f,--force=true|false 强制删除正在运行的容器。默认为false。” - Konrad Kleine
2
啊,我不知道有“删除所有现有容器”的命令。我自己写了一个: docker ps -a | sed -r 's/^(\w+).*/\1/g' | sed -r 's/^CONTAINER//' | sed -r 's/^(\w+)/docker rm \1/g' | awk 'system($0)'谢谢! - Anurag
5
当你需要使用特定于Shell的功能来实现基本功能时,就可以知道命令行选项设计得很差。 - user3467349
要删除所有现有的镜像,您可以使用 - "docker rmi $(docker images -q)" - human
使用Windows PowerShell删除所有现有容器: docker ps -aq | Foreach-Object { docker stop $_; docker rm $_; } - fartwhif
如果您想要删除所有已停止的容器,现在可以使用 docker container prune 命令。同样地,您也可以使用 docker image prune 命令来删除所有未使用的镜像。此外,还有 docker system prune 命令可以一次性清理所有内容。默认情况下,它只会清理悬空镜像,但是它有一个选项可以清理所有未使用的镜像,也可以清理卷,并且如果您需要更加选择性地清理,它还有一个过滤选项。 - nigh_anxiety

578

以下是一些删除Docker镜像/容器的方法:

删除单个镜像

docker rmi image_name:version/image-id

删除所有图片

docker rmi $(docker images -qf "dangling=true")

杀死容器并删除它们:

docker rm $(docker kill $(docker ps -aq))

注意:优雅关机请用stop代替kill

删除所有图片,除了"my-image"

使用grep删除除my-imageubuntu之外的所有内容。

docker rmi $(docker images | grep -v 'ubuntu\|my-image' | awk {'print $3'})

或者 (不使用awk)

docker rmi $(docker images --quiet | grep -v $(docker images --quiet ubuntu:my-image))


26
附加内容:删除“悬挂”图像(没有标签的图像):docker rmi $(docker images -qf "dangling=true") - kolypto
the_image 应该是图像 ID。 - Aftab Naveed
5
应该是 docker rm $(docker kill $(docker ps -a -q)) - BMW
1
删除除awk之外的所有内容:docker rmi $(docker images --quiet | grep -v $(docker images --quiet ubuntu:my-image)) - phobie
1
@kolypto,“dangling=true”似乎最终无法删除非悬空容器。再次运行,去掉“-f”和“dangling”标志以删除其余部分。 - DougW
1
是我自己的问题还是最后一个建议(或者(不使用awk))真的无法正常工作? - Mike Wise

203

删除所有的Docker容器

docker rm $(docker ps -a -q)

删除所有 Docker 镜像

docker rmi $(docker images -q)

7
移除未打标签的镜像:docker rmi $(docker images | grep "^<none>" | awk "{print $3}") - Barrett Clark
1
http://www.eq8.eu/blogs/23-spring-cleaning-for-webdevelopers清理 Docker 镜像的无用标签和版本,可以使用以下命令:删除所有无用标签:sudo docker rmi -f $(sudo docker images | grep "<none>" | awk "{print $3}")删除 2015 年发布的所有 live 版本:sudo docker rmi -f $(sudo docker images | grep live-2015 | awk "{print $3}") - equivalent8
要强制执行,您必须编写:docker -f rm $(docker ps -a -q) - Adrian Lopez

75

使用镜像ID从Docker中删除图像的步骤:

  1. 获取所有镜像的列表

    docker images
    
  2. 确定您想要删除的图像的图像ID,例如:

  3. REPOSITORY     TAG     IMAGE ID        CREATED        VIRTUAL SIZE
    kweku360/java  latest  08d3a9b8e166    2 weeks ago         5.733 GB`
    
  4. 最后,使用图片ID删除图像(只需要前三个数字)

  5. docker rmi 08d
    

1
首先需要停止容器并删除它,请参考 https://dev59.com/b2Ei5IYBdhLWcg3wUa46 - vikramvi

38

镜像:

  1. 列出所有镜像

    docker images

  2. 删除一个镜像

    docker rmi 镜像名称

  3. 强制删除一个镜像

    docker rmi -f 镜像名称

容器:

  1. 列出所有容器

    docker ps -a

  2. 删除一个容器

    docker rm 容器ID

  3. 强制删除一个容器

    docker rm -f 容器ID


29

根据VonC在 如何删除旧的Docker容器 中的评论更新。

使用Docker 1.13(2016年第四季度),您现在可以:

docker system prune 将删除所有未使用的数据(即:停止的容器,没有容器的卷和没有容器的映像)。

请参见PR 26108commit 86de7c0,它们引入了一些新命令,以帮助可视化查看Docker守护程序数据占用磁盘的空间量,并允许轻松清理“不需要的”过多数据。

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

感谢您的详细回答,但这并没有直接回答原始问题(该问题已经得到回答,其顶部答案仍然相关)。 - Jules
2
我同意。然而,由于这个问题的标题非常通用,它已经成为一个参考问题,所以我认为更新机制是必要的。 - qkrijger

25

删除容器

  1. 要删除特定的容器

    docker rm CONTAINER_ID CONTAINER_ID
    
    • 对于单张图片

      docker rm  70c0e19168cf
      
    • 适用于多张图片

      docker rm  70c0e19168cf c2ce80b62174
      
  2. 删除已退出的容器

    docker ps -a -f status=exited
    
  3. 移除所有容器

    docker ps -q -a | xargs docker rm
    


删除图片

docker rmi IMAGE_ID
  1. 删除特定图片

    • 对于单个图片

docker rmi ubuntu
  • 适用于多张图片

    docker rmi ubuntu alpine
    
  • 移除悬挂的镜像
    悬挂的镜像是指那些与任何标记的镜像没有任何关系的层,因为Docker镜像由多个层组成。

    docker rmi -f $(docker images -f dangling=true -q)
    
  • 删除所有的 Docker 镜像

    docker rmi -f $(docker images -a -q)
    

  • 删除卷

    要列出卷,请运行docker volume ls

    1. 删除特定的卷

    docker volume rm VOLUME_NAME
    
  • 删除悬空的卷

    docker volume rm $(docker volume ls -f dangling=true -q)
    
  • 删除一个容器及其数据卷

    docker rm -v CONTAINER_NAME
    

  • 为什么要使用双重 CONTAINER_ID - Peter Mortensen

    19

    docker rm container_name

    docker rmi image_name

    docker help

    rm 删除一个或多个容器

    rmi 删除一个或多个镜像


    13
    docker rmi  91c95931e552
    

    守护程序的错误响应:冲突,无法删除 91c95931e552,因为容器 76068d66b290 正在使用它,请使用 -f 强制操作。 FATA[0000] 错误:未能删除一个或多个镜像

    查找容器 ID,

    # docker ps -a
    
    # docker rm  daf644660736 
    

    那是对问题的答案吗? - Peter Mortensen
    为什么是 daf644660736?它与之前的任何内容有什么关系? - Peter Mortensen

    5

    首先,我们必须停止并删除附加到要删除的Docker镜像的Docker容器。

    因此,首先执行以下操作:

    • docker stop 容器ID - 停止正在运行的容器
    • docker rm 容器ID - 删除/移除容器

    然后执行以下操作:

    • docker rmi 镜像ID - 删除/移除镜像

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接