如何停止和终止Docker容器
本文涵盖了关于停止和终止Docker容器的七个关键点。
我们将介绍pause和stop命令,如何完全停止和关闭、
如何强制停止和关闭,如何大规模删除停止的容器,signal和 timeout选项,以及如何解决 "拒绝许可 "的问题。
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,以及排除权限问题、
和排除权限问题的故障。
希望这能对你的实际开发过程有所帮助。
