遇到 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
命令支持逐个停止多个容器ID。
首先,通过docker ps
命令列出所有容器,并将容器ID传递给docker stop
容器命令,如下所示。

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

上面的
$(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
镜像。

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 $(docker ps -q)
立即终止所有容器。注意,(docker ps -q
)是一个子表达式。
使用docker rm
停止和移除容器
默认情况下,当您创建一个容器时,该容器与以前的相同:它是幂等的。移除一个容器将会产生最小的影响,考虑到这一点,docker rm
可以强制停止并移除一个容器。Docker 向主进程发送一个 SIGKILL
信号,并将该容器从您的 Docker 安装中可用容器的列表中移除。
如果容器必须保留已更改的内部文件或其状态必须被保留,则移除容器将销毁这些更改。小心潜在的失误!
在以下示例中,也许您已经启动了一个被分配了名称 kind_galileo
的容器。在移除容器之前,容器必须被停止,如下所示。docker ps -a
命令显示示例容器的状态为 Exited
。

现在容器已经停止,执行 docker rm
命令将完全移除容器。
不必先停止容器再移除容器,使用 --force
和 docker rm
的组合将在单个操作中停止并移除容器。容器 laughing_elion
将不再可用于运行。
如果您不指定
--force
命令,您将遇到错误消息Error response from daemon: You cannot remove a running container...

使用 Docker Compose 停止 Docker 容器
Docker命令通常用于单个容器,但您可以创建一个包含多个容器相互协作的服务。Docker Compose工具允许您配置由多个容器组成的服务以共同工作。
由于服务中的容器设计为共同工作,最好优雅地停止整个服务,而不是停止任何单个容器。
如果您运行了一个包含多个容器的服务,[docker-compose stop]
将停止服务而不移除容器或服务。请按照下面的步骤创建Docker Compose服务,启动服务,并最终优雅地停止服务。
1. 创建一个目录以存储配置文件。在本例中,目录C:\Articles\Ubuntu将存储该文件。
2. 接下来,创建文件docker-compose.yml,其中包含以下配置。下面的Docker Compose文件创建一个具有两个Ubuntu容器的服务,当启动时,这些容器不会立即退出。
3. 在终端会话中,导航到自定义的Docker配置文件目录,例如在这个例子中是 C:\Articles\Ubuntu。运行 docker-compose up -d
命令以在后台生成并启动在前一步中创建的服务,正如 -d
选项所示。

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

docker-compose
命令与docker
命令类似,也有rm --force
和kill
参数。这些docker-compose
参数作用于服务而不是单个容器。docker-compose kill
命令还可以使用-s
选项指定停止信号。
结论
Docker容器是创建用于开发和生产的独特和分隔环境的强大工具。在本文中,您学到了Docker停止一个或多个甚至全部容器的几种方法。您还了解了Docker使用的默认停止信号以及如何更改它。
有了这些知识,您现在了解了停止Docker容器的方方面面,以及在停止运行的容器时如何避免出错。有了这些新发现的知识,您打算如何从现在开始停止您的容器呢?
Source:
https://adamtheautomator.com/docker-stop-containers/