使用Docker停止容器,不要搞砸事情!

遇到 Docker 停止容器的问题了吗?由于能够创建许多不同的容器,找到正确的停止容器的方法可能会有些困难。在本文中,您将学习到停止容器或所有容器的 Docker 命令。

继续阅读以了解更多信息!

先决条件

要跟着本教程进行学习,请确保您具备以下条件:

  • Windows 10 – 本教程使用 Windows 运行 Docker,但您也可以将相同的一般步骤应用于 Linux 或 macOS。
  • Docker Desktop – 本教程使用版本 3.5.2。如果您使用 Linux,则可以使用 Docker 引擎,因为没有 GUI。
  • A running Docker container or containers.

使用 docker stop Containers 命令结束容器

让我们从第一个命令开始:docker stop 容器命令以及它如何停止容器。

例如,也许您需要停止一个名为 mystifying_hofstadter 且 ID 为 fb66ed502096 的正在运行的容器。如下例所示,使用 docker stop 容器命令停止容器。

# 通过名称停止容器
docker stop mystifying_hofstadter
# 通过ID停止容器(相同容器)
docker stop fb66ed50209
Stopping a single Docker container via the container name or container ID.

如果有多个正在运行的容器,您想要停止它们怎么办?docker stop命令支持逐个停止多个容器ID。

首先,通过docker ps命令列出所有容器,并将容器ID传递给docker stop容器命令,如下所示。

# 列出所有运行中的容器
docker ps
# 通过容器ID停止以下Docker容器
docker stop a427a21c5558 e9dbd816f24c 31269ef5999e
Listing all running containers and then stopping them

如果您希望停止所有运行中的容器而无需手动检索并传递这些容器ID给docker stopdocker ps -q命令将实现这一目标。docker ps命令的-q参数仅输出容器的ID。

# 创建三个容器。使用分号分隔每个命令
docker run -d -t ubuntu; docker run -d -t ubuntu; docker run -d -t ubuntu
# 列出所有运行中的容器
docker ps -q
# 检索所有运行中的容器ID并传递给docker stop
docker stop $(docker ps -q)
Stopping multiple Docker containers at once.

上面的$(docker ps -q)结构在Linux上的Bash和Windows上的PowerShell中都是一个子表达式。子表达式指示shell首先处理一组命令docker ps -q,然后将结果集返回给原始命令docker stop

命令docker stop容器使用SIGTERM信号。Linux信号通知进程发生了事件,但由进程决定如何对给定信号做出响应。

使用SIGTERM信号时,Docker会在发送SIGKILL信号之前优雅地停止一个进程,等待默认的10秒,SIGKILL信号会立即终止该进程。

使用进程信号停止容器

您了解了Docker的默认行为(停止信号),当停止容器时,使用docker stop容器命令。但您可能不希望使用默认行为。相反,您可以指示Docker使用替代停止信号。

通过docker run命令的--stop-signal标志,您可以在启动容器时指定停止信号。此标志设置将发送给正在运行的容器的信号,以便您希望停止时发送。

在下面的示例中,--stop-signal标志采用值SIGQUIT,这告诉Docker在停止容器时发送SIGQUIT信号。示例还使用以下参数:

  • d – Runs the container in detached (background) mode. The detached mode will not allow the container to be immediately interacted with by the user since the process is running in the background.
  • t – allocates a Pseudo-TTY (PTY) console, which emulates a real terminal console in the container and stops the Ubuntu container from immediately exiting. The Ubuntu container in the example requires a PTY console to stay active in the background.
  • “image name” – 指定从哪个Docker镜像创建容器,在本例中是ubuntu镜像。
docker run -d -t --stop-signal SIGQUIT ubuntu
Specifying SIGQUIT as the signal when starting and then stopping a Docker container.

您还可以使用Dockerfile指定停止信号,该文件告诉Docker如何构建容器。您可以在Dockerfile中添加一个条目,使用STOPSIGNAL SIGQUIT指定停止信号,例如。您可以将SIGQUIT替换为任何您喜欢的停止信号。

使用docker kill立即退出容器

有时您希望在不允许它们有宽限期的情况下退出容器。docker kill命令立即停止容器。

下面的示例将具有ID 2aa318273db5的容器传递给docker kill。容器将立即通过SIGKILL信号退出,不允许容器正常退出。由于该命令,容器将退出,并显示容器的ID。

docker kill 2aa318273db5

使用命令docker kill $(docker ps -q)立即终止所有容器。注意,(docker ps -q)是一个子表达式。

使用docker rm停止和移除容器

默认情况下,当您创建一个容器时,该容器与以前的相同:它是幂等的。移除一个容器将会产生最小的影响,考虑到这一点,docker rm 可以强制停止并移除一个容器。Docker 向主进程发送一个 SIGKILL 信号,并将该容器从您的 Docker 安装中可用容器的列表中移除。

如果容器必须保留已更改的内部文件或其状态必须被保留,则移除容器将销毁这些更改。小心潜在的失误!

在以下示例中,也许您已经启动了一个被分配了名称 kind_galileo 的容器。在移除容器之前,容器必须被停止,如下所示。docker ps -a 命令显示示例容器的状态为 Exited

Listing all containers, including stopped containers.

现在容器已经停止,执行 docker rm 命令将完全移除容器。

docker rm kind_galileo

不必先停止容器再移除容器,使用 --forcedocker rm 的组合将在单个操作中停止并移除容器。容器 laughing_elion 将不再可用于运行。

docker rm --force laughing_elion

如果您不指定 --force 命令,您将遇到错误消息 Error response from daemon: You cannot remove a running container...

Stopping and removing a container.

使用 Docker Compose 停止 Docker 容器

Docker命令通常用于单个容器,但您可以创建一个包含多个容器相互协作的服务。Docker Compose工具允许您配置由多个容器组成的服务以共同工作。

由于服务中的容器设计为共同工作,最好优雅地停止整个服务,而不是停止任何单个容器。

如果您运行了一个包含多个容器的服务,[docker-compose stop]将停止服务而不移除容器或服务。请按照下面的步骤创建Docker Compose服务,启动服务,并最终优雅地停止服务。

1. 创建一个目录以存储配置文件。在本例中,目录C:\Articles\Ubuntu将存储该文件。

mkdir C:\Articles\Ubuntu

2. 接下来,创建文件docker-compose.yml,其中包含以下配置。下面的Docker Compose文件创建一个具有两个Ubuntu容器的服务,当启动时,这些容器不会立即退出。

# docker-compose的规范版本
version: "3.9"
# 组成此服务的应用程序集合
services:
  # 第一个Ubuntu容器
  container1:
    image: ubuntu
    # 与 -t 选项相同,并分配伪TTY,因此容器不会立即退出。
    tty: true
  # 第二个Ubuntu容器
  container2:
    image: ubuntu
    tty: true

3. 在终端会话中,导航到自定义的Docker配置文件目录,例如在这个例子中是 C:\Articles\Ubuntu。运行 docker-compose up -d 命令以在后台生成并启动在前一步中创建的服务,正如 -d 选项所示。

Starting a Docker Compose service.

4. 在同一终端会话和目录中,输入命令 docker-compose stop 以正常结束服务和容器。

Stopping a Docker Compose service.

docker-compose 命令与 docker 命令类似,也有 rm --forcekill 参数。这些 docker-compose 参数作用于服务而不是单个容器。docker-compose kill 命令还可以使用 -s 选项指定停止信号。

结论

Docker容器是创建用于开发和生产的独特和分隔环境的强大工具。在本文中,您学到了Docker停止一个或多个甚至全部容器的几种方法。您还了解了Docker使用的默认停止信号以及如何更改它。

有了这些知识,您现在了解了停止Docker容器的方方面面,以及在停止运行的容器时如何避免出错。有了这些新发现的知识,您打算如何从现在开始停止您的容器呢?

Source:
https://adamtheautomator.com/docker-stop-containers/