这个问题与我是否应该关注过量的、未运行的Docker容器有关。

我想知道如何移除旧容器。docker rm 3e552code34a允许你删除一个,但我已经有很多了。Docker rm——help没有提供选择选项(像all一样,或者通过映像名称)。

也许有一个存放这些容器的目录,我可以很容易地手动删除它们?


当前回答

尝试使用此命令清除容器和悬空图像。

docker system prune -a

其他回答

查看所有现有图像:

docker images -a

查看所有现有的容器:

docker ps -a

删除单张图片:

docker images -a
docker rmi <IMAGE_ID>

停止单个容器:

docker ps -a
docker stop <CONTAINER_ID>

停止多个容器:

docker ps -a
docker stop <CONTAINER_ID1> <CONTAINER_ID2>

删除单个容器:

docker ps -a
docker rm <CONTAINER_ID>

删除多张图片:

docker images -a
docker rmi <IMAGE_ID1> <IMAGE_ID2>

删除多个停止的容器:

docker ps -a
docker rm <CONTAINER_ID1> <CONTAINER_ID2>

只能在一个命令中删除图像:

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

在一个命令中删除容器和图像:

docker rm $(docker ps -a -q) && docker rmi -f $(docker images -a -q)

修剪所有容器:

docker container prune

对于Windows,你可以运行这个命令来停止并删除所有的容器:

@echo off
FOR /f "tokens=*" %%i IN ('docker ps -q') DO docker stop %%i
FOR /f "tokens=*" %%i IN ('docker ps -aq') DO docker rm %%i
FOR /f "tokens=*" %%i IN ('docker images --format "{{.ID}}"') DO docker rmi %%i

你可以将它保存为.bat文件,并运行它:

因此,我个人建议将此作为映像和容器的部署脚本的一部分,只保留最近的n个容器和映像。我用与git标签相同的版本控制模式标记Docker映像,并且总是用“latest”标记最新的Docker映像。这意味着在没有清理任何东西的情况下,我的Docker映像最终看起来像这样:

REPOSITORY              TAG       IMAGE ID        CREATED         VIRTUAL SIZE
some_repo/some_image    0.0.5     8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    latest    8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    0.0.4     0beabfa514ea    45 hours ago    925.4 MB
some_repo/some_image    0.0.3     54302cd10bf2    6 days ago      978.5 MB
some_repo/some_image    0.0.2     0078b30f3d9a    7 days ago      978.5 MB
some_repo/some_image    0.0.1     sdfgdf0f3d9a    8 days ago      938.5 MB

现在,当然我不想让我所有的图像(或容器)在我所有的生产盒上永久保存。我只需要最后的3或4个回滚来去掉其他的东西。尤尼克斯的尾巴是你最好的朋友。由于docker images和docker ps都是按日期排序的,我们可以使用tail选择除前三个之外的所有图像并删除它们:

docker rmi $(docker images -q | tail -n +4)

将其与部署脚本一起运行(或在本地运行),以始终保留足够的映像,以便能够轻松地回滚,而不会占用太多空间或将旧映像弄得乱七八糟。

就我个人而言,我只在我的生产盒上保留一个容器,但如果你想要更多的容器,你可以对容器做同样的事情:

docker rm $(docker ps -aq | tail -n +4)

最后,在我的简化示例中,我们一次只处理一个存储库,但是如果您有更多的存储库,您可以使用相同的思想来变得更复杂一些。假设我只想保留some_repo/some_image中的最后三张图像。我只需要混合grep和awk就可以了:

docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)

同样,同样的想法也适用于容器,但到这里你已经明白了,所以我就不举例子了。

您可以使用多种方式删除容器,我将在后面的回答中解释它们。

码头集装箱修剪。该命令删除所有现在不工作的容器。您可以通过比较docker ps和docker ps -a的输出来找出哪些容器没有工作。docker ps -a中列出的但docker ps中不存在的容器现在没有工作,但它们的容器没有被删除。 Docker kill $(Docker ps -aq)。这个命令的作用是,通过执行$(docker ps -aq),它返回所有容器的id列表并杀死它们。有时此命令不起作用,因为正在运行的容器正在使用它。要做到这一点,你可以使用——force选项。 Docker rm $(Docker ps -aq)。它与第二个命令的定义相同。它们之间唯一的区别是它会删除容器(和docker prune一样),而docker kill不会。 有时需要删除映像,因为您更改了Dockerfile的配置,需要删除它来重新构建。为此,你可以通过运行docker images来查看所有的图像,然后复制你想要删除的图像的ID。只需执行docker image rm <image-id>即可删除。

PS:你可以用docker PS -a -q代替docker PS -aq,两者没有区别。因为在基于unix的操作系统中,您可以像上面的例子一样加入选项。

下面是我的docker-cleanup脚本,它删除未标记的容器和图像。请检查来源的任何更新。

#!/bin/sh
# Cleanup docker files: untagged containers and images.
#
# Use `docker-cleanup -n` for a dry run to see what would be deleted.

untagged_containers() {
  # Print containers using untagged images: $1 is used with awk's print: 0=line, 1=column 1.
  docker ps -a | awk '$2 ~ "[0-9a-f]{12}" {print $'$1'}'
}

untagged_images() {
  # Print untagged images: $1 is used with awk's print: 0=line, 3=column 3.
  # NOTE: intermediate images (via -a) seem to only cause
  # "Error: Conflict, foobarid wasn't deleted" messages.
  # Might be useful sometimes when Docker messed things up?!
  # docker images -a | awk '$1 == "<none>" {print $'$1'}'
  docker images | tail -n +2 | awk '$1 == "<none>" {print $'$1'}'
}

# Dry-run.
if [ "$1" = "-n" ]; then
  echo "=== Containers with uncommitted images: ==="
  untagged_containers 0
  echo

  echo "=== Uncommitted images: ==="
  untagged_images 0

  exit
fi

# Remove containers with untagged images.
echo "Removing containers:" >&2
untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true

# Remove untagged images
echo "Removing images:" >&2
untagged_images 3 | xargs --no-run-if-empty docker rmi

来源:https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup