1. 概述

在之前的教程中,我们学习了如何删除 Docker 镜像。然而,只有当没有 Docker 容器使用该镜像时,才能删除 Docker 镜像。因此,为了删除 Docker 镜像,需要先删除所有使用该镜像的 Docker 容器。

本教程将教会你使用不同方法来移除 Docker 容器。

2. 为什么移除 Docker 容器?

当 Docker 容器完成执行后,它会达到 退出 状态。这种状态的容器不再消耗任何 CPU 或内存,但仍然占用机器的磁盘空间。此外,停止的容器除非在运行容器时使用了 –rm 标志,否则不会自动移除。

随着越来越多的容器进入 退出 状态,它们整体占用的磁盘空间会增加。结果可能是无法启动新容器,或者 Docker 服务停止响应。

为了避免这种情况,推荐在运行 Docker 容器时使用 –rm 标志,或者定期手动移除 Docker 容器。

现在让我们学习如何移除 Docker 容器。

3. 移除单个 Docker 容器

首先,我们将使用非交互模式在 CentOS 中启动一个 Docker 容器。这样做会使容器在运行后立即停止:

$ docker run --name mycontainer centos:7
$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                     PORTS              NAMES
418c28b4b04e   centos:7      "/bin/bash"              6 seconds ago   Exited (0) 5 seconds ago                       mycontainer

接下来,我们将使用 docker rm 命令移除名为 mycontainer 的 Docker 容器:

$ docker rm mycontainer
mycontainer
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

我们也可以使用 Docker 容器的 ID 而不是名称来使用 docker rm 命令移除 Docker 容器:

$ docker rm 418c28b4b04e

4. 移除多个 Docker 容器

可以使用 docker rm 命令批量移除多个 Docker 容器。docker rm 命令接受一个包含 Docker 容器名称或 ID 的空格分隔列表,并移除所有这些容器:

$ docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS                      PORTS     NAMES
23c70ec6e724   centos:7   "/bin/bash"   6 seconds ago    Exited (0) 5 seconds ago              mycontainer3
fd0886458666   centos:7   "/bin/bash"   10 seconds ago   Exited (0) 9 seconds ago              mycontainer2
c223ec695e2d   centos:7   "/bin/bash"   14 seconds ago   Exited (0) 12 seconds ago             mycontainer1
$ docker rm c223ec695e2d mycontainer2 23c70ec6e724
c223ec695e2d
mycontainer2
23c70ec6e724

在上述示例中,我们使用 docker rm 命令移除了三个处于 退出 状态的 Docker 容器。

我们可以在任何 Docker 命令中互换使用 Docker 容器的名称和 ID。 注意,我们使用了 mycontainer1mycontainer3 的 Docker 容器 ID,而使用了容器名称 mycontainer2

5. 批量移除所有 Docker 容器

考虑一个场景,即机器上有太多已停止的 Docker 容器,我们希望一次性移除它们。当然,我们可以采用上述方法并传递所有容器的 ID 到 docker rm 命令,但我们来看看更优化且简单的命令来批量移除所有 Docker 容器:

$ docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS                      PORTS     NAMES
b5c45fa5764f   centos:7   "/bin/bash"   4 seconds ago    Exited (0) 3 seconds ago              mycontainer1
ed806b1743cd   centos:7   "/bin/bash"   9 seconds ago    Exited (0) 7 seconds ago              mycontainer2
2e00a052eb12   centos:7   "/bin/bash"   13 seconds ago   Exited (0) 12 seconds ago             mycontainer3
$ docker rm $(docker ps -qa)
b5c45fa5764f
ed806b1743cd
2e00a052eb12

命令 docker ps -qa 返回机器上所有容器的数字 ID。然后将这些 ID 传递给 docker rm 命令,该命令会逐个移除 Docker 容器。

我们也可以使用 docker container prune 命令来移除所有停止的容器:

$ docker container prune -f

这里我们使用了 -f 标志以避免确认提示。

6. 强制移除正在运行的 Docker 容器

我们之前讨论的所有命令仅在 Docker 容器停止时有效。如果尝试在不先停止的情况下移除正在运行的容器,将收到类似错误信息:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f84692b27b0a        centos:7            "/bin/bash"         59 seconds ago      Up 58 seconds                           mycontainer
$ docker rm mycontainer
Error response from daemon:
  You cannot remove a running container f84692b27b0a18266f34b35c90dad655faa10bb0d9c85d73b22079dde506b8b5.
  Stop the container before attempting removal or force remove

移除正在运行的 Docker 容器的一种方式是首先使用 docker stop 命令停止该容器,然后使用 docker rm 命令移除它。

另一种方式是使用 -f 选项强制移除此类容器:

$ docker rm -f mycontainer
mycontainer

我们可以通过 -f 选项来移除单个 Docker 容器、多个 Docker 容器,或者所有 Docker 容器。

7. 总结

在这篇文章中,我们探讨了为何需要移除 Docker 容器的原因。首先,我们学习了如何从 Linux 机器中移除容器。接着,我们使用 docker rmdocker prune 命令批量移除了 Docker 容器。

最后,我们研究了如何强制移除处于 运行 状态的 Docker 容器。