194

在 Ubuntu 14.04 (Trusty Tahr) 上,我正在寻找一种方法来停止正在运行的容器,我拥有的唯一信息是 Docker 运行命令中使用的映像名称。

是否有命令查找与该映像名称匹配的所有匹配的运行容器并停止它们?

4

19 回答 19

272

如果您知道image:tag确切的容器版本

issue 8959之后,一个好的开始是:

docker ps -a -q --filter="name=<containerName>"

由于name指的是容器而不是图像名称,因此您需要使用koekiebox回答中提到的更新的Docker 1.9 过滤器祖先

docker ps -a -q  --filter ancestor=<image-name>

正如kiril在下面评论的那样,要删除这些容器:

stop也返回容器。

所以链接stop并将rm完成这项工作:

docker rm $(docker stop $(docker ps -a -q --filter ancestor=<image-name> --format="{{.ID}}"))

如果您只知道图像名称(不知道image:tag

正如亚历克斯詹森在评论中指出的那样:

祖先选项不支持通配符匹配。

亚历克斯提出了一个解决方案,但是当您从同一个图像运行多个容器时,我设法运行的解决方案是(~/.bashrc例如您的):

dsi() { docker stop $(docker ps -a | awk -v i="^$1.*" '{if($2~i){print$1}}'); }

然后我只需调用我的 bash 会话(在 sourcing 之后~/.bashrc):

dsi alpine

任何运行的容器alpine.*:xxx都会停止。

含义:任何名称以.开头alpine的图像。如果您想更精确,
您可能需要调整。awk -v i="^$1.*"^$1.*

当然,从那里:

drmi() { docker rm $(dsi $1  | tr '\n' ' '); }

adrmi alpine会停止并移除任何alpine:xxx容器。

于 2015-08-18T13:40:17.423 回答
87

以前的答案对我不起作用,但确实如此:

docker stop $(docker ps -q --filter ancestor=<image-name> )
于 2016-01-20T12:05:43.130 回答
57

您可以启动容器设置容器名称:

docker run -d --name <container-name> <image-name>

同一个镜像可用于启动多个容器,因此这是启动容器的好方法。然后你可以使用这个容器名称来停止,附加......容器:

docker exec -it <container-name> bash
docker stop <container-name>
docker rm <container-name>
于 2016-04-14T16:21:33.680 回答
19

此代码将停止所有带有图像centos:6的容器。我找不到更简单的解决方案。

docker ps | grep centos:6 | awk '{print $1}' | xargs docker stop

甚至更短:

docker stop $(docker ps -a | grep centos:6 | awk '{print $1}')
于 2016-06-14T04:47:00.113 回答
10

停止运行容器的两种方法:

1. $docker stop container_ID

2. $docker kill container_ID

您可以使用以下命令获取正在运行的容器:

$docker ps

以下链接可获取更多信息:

于 2016-06-28T08:43:33.753 回答
3

按图像名称停止 docker 容器:

imagename='mydockerimage'
docker stop $(docker ps | awk '{split($2,image,":"); print $1, image[1]}' | awk -v image=$imagename '$2 == image {print $1}')

通过图像名称和标签停止 docker 容器:

imagename='mydockerimage:latest'
docker stop $(docker ps | awk -v image=$imagename '$2 == image {print $1}')

如果您创建了镜像,您可以为其添加标签并按标签过滤正在运行的容器

docker ps -q --filter "label=image=$image"

不可靠的方法

docker ps -a -q  --filter ancestor=<image-name>

并不总是有效

docker ps -a -q --filter="name=<containerName>"

按容器名称过滤,而不是图像名称

docker ps | grep <image-name> | awk '{print $1}'

是有问题的,因为图像名称可能会出现在其他图像的其他列中

于 2019-05-10T17:49:02.307 回答
3

列出所有包含信息和 ID 的容器

docker ps

docker stop CONTAINER ID
于 2019-07-14T09:19:48.713 回答
2

我制作了一个/usr/local/bin/docker.stop包含图像名称的名称(假设您只有一个正在运行)。

docker stop $(docker ps -q -f "name=$1")
于 2015-09-08T15:46:38.527 回答
2

对于 Docker 版本 18.09.0,我发现不需要格式标志

docker rm $(docker stop $(docker ps -a -q -f ancestor=<image-name>))
于 2018-12-19T16:29:44.323 回答
1

这是一个简洁的命令,不需要您指定图像标签(就像大多数答案一样):

docker stop $(docker ps -a | awk -v i="^${image_name}.*" '{if($2~i){print$1}}')

于 2021-07-30T02:28:37.973 回答
1

In my case --filter ancestor=<image-name> was not working, so the following command cleaned up the Docker container for me:

docker rm $(docker stop $(docker ps -a -q --filter "name=container_name_here" --format="{{.ID}}"))
于 2017-02-24T16:20:43.773 回答
1

这是我重建 docker 容器的脚本,停止并重新启动它

docker pull [registry]/[image]:latest
docker build --no-cache -t [localregistry]/[localimagename]:latest -f compose.yaml context/
docker ps --no-trunc | grep [localimagename] | awk '{print $1}' | xargs docker stop
docker run -d -p 8111:80 [localregistry]/[localimagename]:latest

注意 --no-trunc 参数,它在输出中全长​​显示图像名称或其他信息

于 2020-12-26T13:59:10.430 回答
1

在@VonC 极好的答案之上添加,这是一个 ZSH 函数,您可以将其添加到您的 .zshrc 文件中:

dockstop() {
  docker rm $(docker stop $(docker ps -a -q --filter ancestor="$1" --format="{{.ID}}"))
}

然后在您的命令行中,只需执行此操作dockstop myImageName,它将停止并删除从名为 myImageName 的映像启动的所有容器。

于 2019-11-22T09:50:49.160 回答
1

我试图将我的 Docker 命令包装在 gulp 任务中,并意识到您可以执行以下操作:

docker stop container-name
docker rm container-name

这可能不适用于您有多个同名容器的场景(如果可能的话),但对于我的用例来说它是完美的。

于 2016-03-23T23:14:19.610 回答
1

使用:docker container stop $(docker container ls -q --filter original=mongo)

    (base) :~ user$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
    d394144acf3a        mongo               "docker-entrypoint.s…"   15 seconds ago      Up 14 seconds       0.0.0.0:27017->27017/tcp   magical_nobel
    (base) :~ user$ docker container stop $(docker container ls -q --filter ancestor=mongo)
    d394144acf3a
    (base) :~ user$ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    (base) :~ user$
于 2020-02-15T19:16:09.220 回答
0
docker stop $(docker ps -a | grep "zalenium")
docker rm $(docker ps -a | grep "zalenium")

这应该足够了。

于 2019-05-02T13:30:21.417 回答
0

如果您知道容器名称的一部分,则可以将 AWK 与 docker 一起使用,如下所示:

  CONTAINER_IDS=$(docker ps -a | awk '($2 ~ /container.*/) {print $1}')
  if [ -z "$CONTAINER_IDS" -o "$CONTAINER_IDS" == " " ]; then
    echo "No containers available for deletion"
  else
    docker rm -f $CONTAINER_IDS
  fi
于 2021-08-28T11:25:36.227 回答
0

如果您想更喜欢一种简单的AWK方法,这是我的看法:

docker rm -f $(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}')

$(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}')- 根据输入图像打印 docker 容器名称

docker ps- 列出所有容器

awk '{ if($2 == "<your-image-name>") { print $NF}}'- 解析后的第二列docker ps给出图像名称。将其与您的图像名称进行比较将执行print $NF打印容器名称。

docker rm -f移除容器

例如,删除所有正在运行的 ubuntu 镜像容器,可以简单地完成如下:

docker rm -f $(docker ps | awk '{ if($2 == "ubuntu:latest") { print $NF}}')

PS:记得在 AWK 中包含 image 标签,因为它是一个相等的比较器。

于 2020-05-05T07:28:29.380 回答
-5

您可以使用该ps命令查看正在运行的容器:

docker ps -a

从那里您应该会看到您的容器名称以及您要查找的容器 ID。这里有更多关于docker ps.

于 2015-08-18T23:50:45.170 回答