如何停止和终止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
,以及排除权限问题、
和排除权限问题的故障。
希望这能对你的实际开发过程有所帮助。
