当前位置: 首页 > news >正文

小白快速上手 Docker 02 | Docker 容器生命周期

容器生命周期

下图显示了容器生命周期的简化状态。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • Created
  • Running
  • Paused
  • Stopped
  • Deleted

现在让我们逐一讨论容器生命周期的每个状态:

创建状态(Created)

这是容器生命周期的第一个状态,在这个阶段,容器被创建但尚未启动。

通过运行docker create命令,我们可以在指定的镜像上创建一个薄的可写层,并准备运行主进程(由 CMD 和/或 ENTRYPOINT 定义)。需要注意的是,在创建状态下,容器已经存在,但并没有开始执行。

例如,以下命令使用nginx:alpine镜像创建一个名为app1的容器:

docker create --name app1 nginx:alpine

如果创建成功,终端会打印出新容器的ID。

运行状态(Running)

顾名思义,运行状态表示容器正在主动运行。在这个阶段,主进程已经开始执行。对于已经创建或停止的容器,我们可以使用docker start命令来启动它。

例如,要启动之前创建的app1容器,我们可以运行:

docker start app1

如果你不想先创建再启动容器,可以直接使用docker run命令,这样可以同时完成这两个步骤。以下命令将在后台创建并启动一个名为app2的容器:

docker run -d --name app2 nginx:alpine

暂停状态(Paused)

在某些情况下,我们可能需要暂停正在运行的容器。可以使用docker pause命令来暂停指定容器中所有的进程。

暂停时,容器的状态保持完整,包括磁盘和内存的内容。

需要注意的是,暂停的容器并不知道自己已经被暂停。

要暂停app1,可以运行:

docker pause app1

要恢复暂停的容器,我们可以使用docker unpause命令:

docker unpause app1

停止状态(Stopped)

停止状态表示容器不再主动运行其主进程。在该状态下,容器的磁盘部分会保留下来,但内存部分会被清除。这是暂停状态和停止状态之间的主要区别。

容器可以通过四种主要方式停止:

  • 使用docker stop命令。
  • 使用docker kill命令。
  • 当主容器进程退出或完成时。
  • 遇到“内存不足异常”(OOME)时。

让我们分别讨论一下 这几种方式。

1. 使用docker stop命令

此命令非常简单:

docker stop app1

当执行此命令时,主容器进程会接收到一个 SIGTERM 信号,允许其安全地关闭。如果在默认的宽限期(通常为 10 秒)内进程没有结束,系统会强制发送一个 SIGKILL 信号,立即终止进程。

2. 使用docker kill命令

与docker stop不同,docker kill直接将SIGKILL信号发送到主容器进程:

docker kill app2

这意味着docker stop允许容器安全终止(在宽限期内),而则docker kill立即终止进程。docker kill还可以使用–signal或-s发送任何信号,而不仅仅是 SIGKILL。例如,发送 SIGINT 信号:

docker kill -s SIGINT app1
3. 当主进程退出/完成时

如果容器的主进程已退出或完成,则容器可以自动停止。

这可能是因为主进程遇到异常、中断,或者在某个时刻执行的任务完成(而不是像服务器那样无限循环)。例如:

docker run alpine echo "hi"

在此命令中,echo "hi"在 alpine 容器内执行,打印“hi”后立即退出,导致容器自动停止。

4. 当遇到“内存不足异常”(OOME)时

如果容器尝试使用超过系统可用内存的数量,可能会遇到内存不足异常(OOME)。在这种情况下,某些容器甚至 Docker 守护进程可能会被加载终止。为了避免这种情况,确保应用在拥有足够内存的主机上运行是非常重要的。可以通过以下命令限制容器的最大内存使用:

docker run -m 50m redis:alpine

通过这个命令,Redis容器的内存使用不会超过50MB,超出部分可能会导致OOME。

已删除状态(Deleted)

对于状态或停止状态的容器可以使用docker rm命令删除。这将导致与容器相关的所有数据被删除,包括进程、文件系统、卷和网络映射创建。例如,要删除已经停止的app1容器,可以运行:

docker rm app1

如果容器正在运行或暂停时尝试删除,会收到错误提示说明,容器需要先停止。如果您确定要强制删除正在运行的容器,可以使用:

docker rm -f app1

容器生命周期高级部分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.lryc.cn/news/452844.html

相关文章:

  • 深刻理解Redis集群(下):Redis 哨兵(Sentinel)模式
  • STM32重启源深度解析
  • windows配置C++编译环境和VScode C++配置(保姆级教程)
  • 【微信小程序前端开发】入门Day03 —— 页面导航、事件、生命周期、WXS 脚本及自定义组件
  • 【51单片机】点亮LED之经典流水灯
  • 深度学习数据增强的常用方法
  • 影院管理新篇章:小徐的Spring Boot应用
  • 【H2O2|全栈】关于CSS(9)CSS3扩充了哪些新鲜的东西?(二)
  • java中Files和File对象详情和区别比较
  • Unity3D PostLateUpdate为何突然占用大量时间详解
  • 如何快速熟悉项目
  • Spring Boot实现新闻个性化推荐
  • 优化后的版本
  • 【Linux系统编程】第二十七弹---文件描述符与重定向:fd奥秘、dup2应用与Shell重定向实战
  • 开放式耳机哪个品牌好?好用且高性价比的开放式蓝牙耳机推荐
  • 区间合并——模板题
  • Microsoft Edge 五个好用的插件
  • 解决 遇到JWT中claims中获取不到数据的问题
  • 会议平台后端优化方案
  • unixODBC编程(十)分片插入长数据
  • 【Java】—— 集合框架:Collection子接口:Set不同实现类的对比及使用(HashSet、LinkedHashSet、TreeSet)
  • android Activity生命周期
  • C#的面向对象
  • 【区别】三种命令取消已暂存的文件,处理暂存区和文件的跟踪状态
  • 如何在Spring Boot中有条件地运行CommandLineRunner Bean
  • 边缘自适应粒子滤波(Edge-Adaptive Particle Filter)的MATLAB函数示例,以及相应的讲解
  • 一块1T硬盘怎么有sdb1和sdb2
  • Python知识点:如何使用Flink与Python进行实时数据处理
  • Swagger配置且添加小锁(asp.net)(笔记)
  • lambda表达式底层实现:反编译LambdaMetafactory + 转储dump + 运行过程 + 反汇编 + 动态指令invokedynamic