docker容器优雅退出

字节码在跳舞 2024-04-16 15:58:57

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 redisredis

➜  ~ docker wait redis137

运行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 redis137

docker stop同时可以停止多个容器:

docker stop container1 container2 container3 ...

3.docker restart先优雅停止容器,再启动一个新的容器实例

docker restart命令用于重启一个或多个已停止的 Docker 容器。执行此命令时,Docker 首先会发送 SIGTERM 信号,等待容器优雅地停止。一旦容器停止,Docker 立即启动一个新的容器实例,使用相同的配置和镜像。这意味着容器内的状态在重启过程中不会保留。需要重启容器以恢复服务或应用新的配置。

使用示例:

➜  ~ docker restart redisredis

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 redisredis➜ ~ redis-cli127.0.0.1:6379> set hello abcOK127.0.0.1:6379> exit➜ ~ docker stop redisredis➜ ~ docker start redisredis➜ ~ redis-cli127.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 redisredis➜ ~ redis-cli127.0.0.1:6379> set hello 123OK127.0.0.1:6379> get hello"123"127.0.0.1:6379> exit➜ ~ docker kill redisredis➜ ~ docker start redisredis➜ ~ redis-cli127.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相同。

忍不住要加个关注!不是我吹,但你会后悔没关注的!

0 阅读:815

字节码在跳舞

简介:分享学习笔记、知识。