===
-
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
:
arduino
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退出状态码。打开另一个终端运行如下命令:
bash
➜ ~ docker kill redisredis
➜ ~ docker wait redis137
运行docker wait redis
命令窗口,输出状态码137。状态码137通常表示进程接收到 SIGKILL
信号而被强制终止。这意味着名为 Redis
的容器是因为接收到 SIGKILL
信号而被强制终止的。
docker kill
同时可以强制停止多个容器:
bash
docker kill container1 container2 container3 ...
2. docker stop优雅地停止容器
docker stop
命令用于优雅地停止一个或多个正在运行的 Docker 容器。当您执行 docker stop
时,Docker 会向容器发送一个 SIGTERM 信号,这是进程的标准终止信号。容器内的主进程接收到 SIGTERM 后,通常会触发清理操作,如保存当前状态、关闭网络连接、释放资源等,并在完成这些操作后自行退出。默认情况下,Docker 会给容器预留10秒的时间来优雅地关闭。如果容器在这段时间内没有自行退出,Docker 会发送一个 SIGKILL 信号强制终止容器。希望容器在停止前有机会进行必要的清理和状态保存工作,尤其是当容器内运行的服务支持优雅关闭时。应使用docker stop
使用示例:
arduino
➜ ~ docker stop redis137
docker stop
同时可以停止多个容器:
arduino
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
的例子:
vbnet
➜ ~ 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
第一步,首先,启动Redis容器。接着连接redis-cli
,输入命令set hello abc
,设置一个key
为hello,value
为abc。使用exit
退出redis-cli
。
第二步,使用命令docker stop redis
停止容器,接着使用命令docker start redis
启动容器。
第三步,再次连接redis-cli
,输入命令get hello
,输出abc。最后使用exit
断开redis-cli
连接。
Redis使用docker stop
的例子:
vbnet
➜ ~ 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
。
第二步,使用命令docker stop redis
停止容器,接着使用命令docker start redis
启动容器。
第三步,再次连接redis-cli
,输入命令get hello
,输出abc。最后使用exit
断开redis-cli
连接。
结果,在 Redis
中,我们有一个key为hello,值为abc。
Redis容器运行docker kill
的例子:
sql
➜ ~ 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
相同。
忍不住要加个关注!不是我吹,但你会后悔没关注的!