Docker停止容器使用stop、restart 还是 kill?
wptr33 2024-11-22 21:59 19 浏览
- 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
137
运行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
137
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。
第二步,使用命令docker stop redis停止容器,接着使用命令docker start redis启动容器。
第三步,再次连接redis-cli,输入命令get hello,输出abc。最后使用exit断开redis-cli连接。
结果,在 Redis 中,我们有一个key为hello,值为abc。最后使用exit断开redis-cli连接。
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
"123"
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 相同。
忍不住要加个关注!不是我吹,但你会后悔没关注的!
相关推荐
- Python 中 必须掌握的 20 个核心:str()
-
str()是Python中用于将对象转换为字符串表示的核心函数,它在字符串处理、输出格式化和对象序列化中扮演着关键角色。本文将全面解析str()函数的用法和特性。1.str()函数的基本用法...
- python中的函数报错后继续运行而不是停止整个程序
-
要让main...
- 如何在身份证号码中提取出生年月日的函数公式
-
在不同软件中,从身份证号码提取出生年月日的函数公式不同,以下是常见软件的方法:Excelo假设身份证号码在A列,在B列提取出生年月日,在B2单元格输入公式=TEXT(MID(A2,7,8),"...
- sql中的一些CTE和开窗函数相关用法
-
CTE的优势提高可读性:将复杂查询分解为更简单的部分避免重复子查询:同一CTE可以在查询中多次引用递归查询:处理层次结构数据模块化SQL:将复杂查询拆分成逻辑模块...
- 【SQL】SQL 语法差异大全(PgSQL/MySQL/Oracle/TiDB/OceanBase)
-
以下是针对不同数据库系统的SQL语法差异总结,按功能分类展示:一、基础查询1.分页查询...
- MySQL索引:从原理到实战的终极指南
-
MySQL索引原理揭秘MySQL索引是数据库高效查询的核心机制,其原理基于特定的数据结构(主要是B+Tree)和数据库引擎(如InnoDB)的实现策略。索引本质上是一种空间换时间的策略,虽然会占...
- 如何在本地安装开源人工智能Agent——AutoGen Studio的安装
-
AutoGen是微软出品的一个用于创建可自主行动,或与人类协同工作的多智能体AI应用程序的框架。下面来介绍如何在本地安装AutoGenStudio,AutoGenStudio是一个低代码界...
- 小巧WinForm库存系统,竟能实现这些功能?
-
第一次体验真正“握在手里的”库存控制,是在一个微型工厂的仓库运输带旁。顶着仓库里金属味和三十几平米的闷热,老王蹲在地上,一边用笔在账本上划格,一边嘴里嘟囔:“每次都说要数字化管理,数字在哪儿呢?”透过...
- 有关SQLite数据库的介绍
-
SQLite,是一种轻型的数据库,它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/U...
- SQLite 数据库Web管理工具
-
概述SQLite数据库以其轻量级和易于配置的特点,成为了许多项目中的首选数据库。尽管它的便捷性受到了广泛的认可,但对于数据库的管理和维护,尤其是在没有图形界面工具的情况下,开发者往往需要通过复杂的命...
- SqlLite数据库注意要点分析
-
1.验证sqlite是否安装配置好了。执行sqlite3命令。当执行该命令的时候没有传递任何参数表示默认连接到了一个内存数据库,当退出该程序的时候,数据库自动销毁。退出命令:.quit.ex...
- python 连接sqlite
-
在Python中,你可以使用标准库sqlite3来连接SQLite数据库。在Python中,sqlite3模块是内置的,无需使用pip进行安装。sqlite3模块提供了与SQ...
- 提升数据库搜索效率:探索SQLite的向量搜索扩展
-
大家好!今天我们要聊一个特别酷炫的东西——sqlite-vec,一个能让SQLite飞起来的向量搜索扩展。如果你对数据库的搜索速度不满意,那你可得好好看看这篇文章了。...
- Qt编程进阶(21):Qt操作SQLite数据库及实例
-
QtSql模块Qt提供的QtSql模块实现了对数据库的访问,同时提供了一套与平台和具体所用数据库均无关的调用接口。此模块为不同层次的用户提供了不同的丰富的数据库操作类。例如,对于习惯使用SQL语法的用...
- 5分钟快速掌握在Python使用SQLite数据库,
-
小巧、稳定、快速!我为什么喜欢用SQLite...
- 一周热门
-
-
因果推断Matching方式实现代码 因果推断模型
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
git pull命令使用实例 git pull--rebase
-
git 执行pull错误如何撤销 git pull fail
-
面试官:git pull是哪两个指令的组合?
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)