docker kill立即强制停止容器
docker stop优雅地停止容器
docker restart先优雅停止容器,再启动一个新的容器实例
docker kill与docker stop区别
Docker停止容器,是使用stop、kill还是restart?用户通过docker stop或docker kill命令主动停止容器。前者发送 SIGTERM 信号让容器优雅退出,后者发送 SIGKILL 信号强制立即退出。docker restart,命令包含了停止现有容器(类似于docker stop)和重新启动新容器(类似于docker start)这两个动作。今天来了解一下这三个命令。
使用以下命令可以创建一个后台运行的 Redis 容器,并将其公开到主机的 6379 端口,同时为容器赋予名称redis:
docker run -d -p 6379:6379 --name redis redis
在宿主机安装redis-cli命令行客户端工具。
1.docker kill立即强制停止容器
docker kill命令用于立即强制停止一个或多个正在运行的 Docker 容器。当您执行docker kill时,Docker 会向容器发送一个 SIGKILL 信号,这是一种不可被捕获、阻塞或忽略的信号,导致容器内的主进程立即停止运行,不会给容器进程提供任何清理或保存状态的机会。因此,docker kill是一种非常直接且不优雅的停止方式,适用于需要立即终止容器且不关心容器内部状态的情况。SIGKILL是什么,如果你使用过Linux命令kill -9 [pid],SIGKILL编号即为9。
使用示例:
首先,使用命令docker wait redis监听redis退出状态码。打开另一个终端运行如下命令:
? ~ docker kill redis
redis
? ~ docker wait redis
运行docker wait redis命令窗口,输出状态码137。状态码137通常表示进程接收到SIGKILL信号而被强制终止。这意味着名为Redis的容器是因为接收到SIGKILL信号而被强制终止的。
docker kill同时可以强制停止多个容器:
docker kill container1 container2 container3 ...
2.docker stop优雅地停止容器
docker stop命令用于优雅地停止一个或多个正在运行的 Docker 容器。当您执行docker stop时,Docker 会向容器发送一个 SIGTERM 信号,这是进程的标准终止信号。容器内的主进程接收到 SIGTERM 后,通常会触发清理操作,如保存当前状态、关闭网络连接、释放资源等,并在完成这些操作后自行退出。默认情况下,Docker 会给容器预留10秒的时间来优雅地关闭。如果容器在这段时间内没有自行退出,Docker 会发送一个 SIGKILL 信号强制终止容器。希望容器在停止前有机会进行必要的清理和状态保存工作,尤其是当容器内运行的服务支持优雅关闭时。应使用docker stop
使用示例:
? ~ docker stop redis
docker stop同时可以停止多个容器:
docker stop container1 container2 container3 ...
3.docker restart先优雅停止容器,再启动一个新的容器实例
docker restart命令用于重启一个或多个已停止的 Docker 容器。执行此命令时,Docker 首先会发送 SIGTERM 信号,等待容器优雅地停止。一旦容器停止,Docker 立即启动一个新的容器实例,使用相同的配置和镜像。这意味着容器内的状态在重启过程中不会保留。需要重启容器以恢复服务或应用新的配置。
使用示例:
? ~ docker restart redis
redis
docker restart同时可以重启多个容器:
docker restart container1 container2 container3
4.docker stop与docker kill区别
docker stop会向容器发送一个SIGTERM,等待容器保存状态,优雅退出。
docker kill会向容器发送一个SIGKILL。同Linux的kill -9。
Redis容器运行命令docker stop的例子:
? ~ docker start redis
redis
? ~ redis-cli
127.0.0.1:6379> set hello abc
OK
127.0.0.1:6379> exit
? ~ docker stop redis
redis
? ~ docker start redis
redis
? ~ redis-cli
127.0.0.1:6379> get hello
"abc"
127.0.0.1:6379> exit
第一步,首先,启动刚kill掉的redis容器,接着连接redis-cli,输入命令set hello abc,设置一个key为hello,value为abc。使用exit退出redis-cli。最后使用exit断开redis-cli连接。
第二步,使用命令docker stop redis停止容器,接着使用命令docker start redis启动容器。
第三步,再次连接redis-cli,输入命令get hello,输出abc。最后使用exit断开redis-cli连接。
结果,在Redis中,我们有一个key为hello,值为abc。
Redis容器行命令docker kill的例子:
? ~ docker start redis
redis
? ~ redis-cli
127.0.0.1:6379> set hello 123
OK
127.0.0.1:6379> get hello
127.0.0.1:6379> exit
? ~ docker kill redis
redis
? ~ docker start redis
redis
? ~ redis-cli
127.0.0.1:6379> get hello
"abc"
127.0.0.1:6379> exit
第一步,首先,启动Redis容器。连接redis-cli,输入命令get hello,输出key为hello的值为abc。接着输入命令set hello abc更改key为hello值value为123。使用exit退出redis-cli。
第二步,使用命令docker kill redis停止容器,接着使用命令docker start redis启动容器。
第三步,再次连接redis-cli,输入命令get hello,输出abc。最后使用exit断开redis-cli连接。
可以看出,我们已经变更过key为hello的值为123,但提高kill结束容器,没有等待Redis把数据持久化到磁盘就推退出了。值还是abc,为刚docker stop示例中的结果。
而使用docker stop停止的容器会优雅退出。Redis会把数据持久化到磁盘。
docker restart与docker stop效果一致。
在管理Redis这类需要数据持久化的容器时,推荐使用docker stop以确保数据的完整性。若需立即终止且不关心数据丢失,可使用docker kill。docker restart适用于需要重启服务以应用新配置或恢复服务的情况,其效果与先执行docker stop再docker start相同。
忍不住要加个关注!不是我吹,但你会后悔没关注的!
转载此文是出于传递更多信息目的。若来源标注错误或侵犯了您的合法权益,请与本站联系,我们将及时更正、删除、谢谢。
https://www.414w.com/read/238948.html