Docker
容器
暂停 / 停止

如何停止和终止Docker容器

本文涵盖了关于停止和终止Docker容器的七个关键点。 我们将介绍pausestop命令,如何完全停止和关闭、 如何强制停止和关闭,如何大规模删除停止的容器,signaltimeout选项,以及如何解决 "拒绝许可 "的问题。

1. 停止Docker容器命令

停止或终止一个正在运行的Docker容器的命令的基本形式如下。

docker container stop [OPTIONS] CONTAINER [CONTAINER...]。

因为Docker容器是基于Unix进程的,这个命令通过向相应的Docker容器发送一个SIGTERM'信号,给它们停止运行的时间。 . 然后它通过发送一个SIGKILL信号来杀死该进程。

SIGTERM信号告诉进程,我们将等待它安全退出后再杀死它。 SIGKILL相当于其他操作系统中的强制关机。

让我们再看看stop命令,其中CONTAINER是你想停止的容器的名称或ID。 这个命令允许你一次停止一个或多个容器。

[OPTIONS]中,你可以添加任何你想要的选项,比如--time选项。 我们最常使用的选项将在下面的章节中介绍。

stop命令停止的容器可以用start命令重新启动。 该命令如下所示,你可以添加-a-i等选项,以及我们在运行Docker容器帖子中看到的其他选项。

$ docker container start [OPTIONS] CONTAINER [CONTAINER...]。

让我们看一个关闭和重启运行中的 "nginx "容器的简单例子。

首先,(1) 我们看一下这个容器的名字或ID,有了它,(2) 我们执行stop命令。 注意,(3) 如果没有--all选项,一个停止的容器将不会在ls查询中被查找到。 然后**(4)** 用start命令重新启动它,并 (5) 验证。

$ docker container ls # (1)
container id image command
6f3e40d12122 nginx "/docker-entrypoint...."
 
$ docker container stop 6f3e # (2)
6f3e
 
$ docker container ls # (3)
 
$ docker container start 6f3e # (4)
6f3e
 
$ docker container ls # (5)
container id image command
6f3e40d12122 nginx "/docker-entrypoint...."

2. 暂停Docker容器命令

有时你可能需要暂停一个正在运行的容器。 这通常是在系统资源有限,资源不足的情况下进行的。 当你暂停一个Docker容器时,你会暂时归还分配给它的资源。

暂停一个容器的命令是以下命令:

$ docker container pause [OPTIONS] CONTAINER [CONTAINER...] 。

这与我们在第1节中看到的stop命令类似。 当你运行上述命令时,Docker守护进程向相应的容器发送一个`SIGSTOP'信号,暂时停止其进程。

要恢复暂停的容器,请发出以下命令

$ docker container unpause CONTAINER [CONTAINER...] 。

这个命令向暂停的Docker容器发送一个SIGCONT信号,使其恢复工作。

下面是一个例子

$ docker container ls # check container ID
container id image ... status
6f3e40d12122 nginx ... Up 11 seconds
 
$ docker container pause 6f32 # Pause the container
6f3e
 
$ docker container ls # Verify container pause
container id image ... status
6f3e40d12122 nginx ... Up 26 seconds (Paused)
 
$ docker container unpause 6f3e # Restart the container
6f3e
 
$ docker container ls # Confirm container redo
6f3eCONTAINER ID IMAGE ... STATUS
6f3e40d12122 nginx ... Up 44 seconds

处于 Paused状态的容器可以通过 docker container ls 命令进行查询、 STATUS条目将显示(Paused)。 如果你在这种状态下运行unpause命令,你会看到它再次运行。

3. 停止并杀死所有Docker容器

Docker并没有提供一个单独的选项来批量停止和杀死所有容器。 然而,你可以通过使用两个docker命令来停止所有的容器,像这样

$ docker container stop $(docker container ls -aq)

我们在这里使用的docker container ls命令中的-a选项是--all选项,它询问所有状态下的容器、 -q选项是--quiet选项,它只打印容器的ID。

然后,这个ID列表被作为参数传递给stop命令,使用shell脚本语法$()

在实践中,这看起来像

$ docker container ls -aq # check target container IDs
6f3e40d12122
7d392cc25008
 
$ docker container stop $(docker container ls -aq) # Stop the entire container
6f3e40d12122
7d392cc25008
 
$ docker container ls # Confirm full container stop
container id image command

这是一个停止所有容器的简单方法,但它可能会意外地停止那些不应该运行的容器。 所以要小心使用它。

4. 停止容器后删除命令

当Docker重组其命令结构时,它取消了同时杀死和删除一个容器的能力。 因此,最好是背靠背地使用以下两个命令。

$ docker container stop [container-id]
$ docker container rm [container-id]

`docker container rm'命令是用来移除一个停止的Docker容器、 更多信息请参见容器移除帖子

然而,如果你真的想只用一个命令来做这件事,你可以使用 你可以使用docker rm命令的--force选项,这是Docker的传统命令。

$ docker rm -f [container-id]

这个命令将立即向该容器发送一个SIGKILL信号,迫使它关闭。 记住,删除一个容器也会删除该容器中的所有数据,所以一定要小心谨慎地进行。

5. 使用kill命令和-signal选项来强制关闭一个容器

当停止和终止一个容器时,docker container stop命令总是首选,因为它可以安全地杀死所有进程。 然而,当一个容器处于无响应状态,或者用不正确的镜像创建,难以操作时,强制关闭是必要的。

Docker提供了一个单独的命令来杀死一个容器。 这就是kill命令。

$ docker container kill [OPTIONS] CONTAINER [CONTAINER...]

这个命令向一个或多个容器发送一个SIGKILL信号,立即杀死它们。

如果你想发送SIGKILL以外的信号,你可以用--signal选项指定它。 然而,在kill的情况下,进程已经忽略了其他信号,所以我认为期待不同的响应是不合理的。

如果你使用kill命令,你可能会被迫立即关闭,导致意外的数据丢失,等等。 因此,你应该进行备份或做好准备。

6. 设置容器的停止超时

第1节中,我提到当你运行docker container stop命令时,它会等待容器发送SIGTERM信号来安全停止进程。 docker等待的这个时间的默认值被设置为10秒。

虽然10秒不是很多,但如果关闭一个容器的过程复杂到超过10秒,Docker会用SIGKILL信号强行杀死它。 这可能会导致意外的数据丢失等。 因此,你有时应该能给它更多时间。

stop命令的--time选项就是这样做的。

$ docker container stop -t 30 my_container

如果你运行了类似上述的命令,你的容器应该有30秒的时间来完成关闭过程,之后它将被强制关闭。

7. 如果发生权限被拒绝该怎么办

在关闭容器时,你可能会遇到 permission denied 的错误信息。 正如消息中所说,这是因为当前用户没有足够的权限来操作Docker容器。

Docker默认需要root或管理员权限。 如果你是家庭用户,你可以自由设置你的权限,但如果你在企业环境中工作或合作,有可能你的权限没有设置得那么高。

这可以通过以root身份运行docker命令来解决,或者加入docker组,允许非主机用户使用docker。

7.1. 使用sudo关键字

使用 root权限很容易。一起使用sudo关键字,如下所示。 你需要知道你的主机账户的密码。

$ sudo docker container stop [container-id]

7.2. 添加到docker用户组

这里有一个给当前用户授予docker权限的方法,无需在每个命令中使用sudo关键字。 运行下面的命令,退出并以当前用户身份登录,组的设置将被应用。

$ sudo usermod -aG docker $USER

上面的命令将当前登录的用户($USER)添加到名为docker的组中(-aG: 附加组)、 (usermod: 修改用户)来改变用户属性。 这种方法也需要sudo命令的密码。

这是两种获得Docker权限和解决 permission denied问题的方法。

8. 最后的想法

在这篇文章中,我们已经介绍了如何停止、暂停、杀死、停止和删除Docker容器,强制杀死,设置timeout,以及排除权限问题、 和排除权限问题的故障。 希望这能对你的实际开发过程有所帮助。

copyright for docker container stop

© 2023 All rights reserved.