本教程最初发布于SigNoz Blog由Muskan Paliwal撰写

在本教程中,我们将了解 Docker 容器生命周期。但首先,让我分享一个个人轶事。 2021 年一个炎热的夏日午后,我的经理突然打电话给我说:“Muskan,你分享给我的项目文件在我的机器上不工作。你能过来修一下设置吗?真的很紧急。”我冲到他的小屋并尽力而为,但无法解决依赖问题。

我非常害怕,真的觉得我要被解雇了(没关系,这只是一种感觉:p)。但我的经理刚刚说,“既然你知道我们在部署应用程序时面临什么样的问题,那就去探索解决方案,也就是 Docker”。

你可能遇到过类似的情况,然后开始探索 Docker。它现在是许多组织使用的无处不在的容器技术。

我们将深入了解 Docker 容器生命周期。但在深入了解 Docker 容器生命周期之前,让我们简要概述一下 Docker 世界的一些概念。

为什么Docker会出现?

基本上有两个主要用例,Docker 使我们免于陷入依赖和扩展问题。

  • 管理跨开发环境的应用程序依赖项

我们已经看到了我所面临的应用程序在我的机器上运行良好但在我经理的机器上运行不正常的场景。

我的应用程序无法正常工作的可能原因可能是:

  • 依赖问题

  • 第三方库版本不兼容不同机器

但是,如果我们可以将我们的应用程序与正在使用的底层基础设施/硬件分开——实现快速开发、测试和部署,会怎样?这就是 Docker 发挥作用的地方。

  • 随着用户需求的增加扩展应用程序

随着对应用程序的吸引力增加,向服务器添加更多资源成为一项要求,并且您需要有效地管理资源。容器为有效扩展应用程序提供了解决方案。您也可以使用虚拟机,但容器是比虚拟机更好的选择。

我所说的虚拟机是指虚拟机。由于容器共享主机操作系统内核的资源,与虚拟机相比,运行多个容器所需的资源要少得多。因此,硬件资源利用效率更高。

什么是 Docker?

Docker 是一个平台,它允许我们将应用程序打包成可部署的可执行文件——称为容器,以及所有必要的操作系统库和依赖项。

大规模使用虚拟机的挑战

通俗地说,虚拟机基本上**将整台机器虚拟化到硬件层。**使用虚拟机,与容器相比,我们无法有效地使用机器的硬件资源。

尽管虚拟机确实有一些优点,例如完全隔离的安全性交互式开发,但以下是虚拟机面临的挑战:

  • 迭代速度

虚拟机的构建和重新生成非常耗时,因为它们包含一个全栈系统。

  • 存储大小成本

虚拟机会占用大量存储空间。它们可以迅速增长到几 GB 的大小。这可能会导致虚拟机主机上的磁盘空间不足问题。

容器与虚拟机

容器是轻量级软件包,包含执行所包含的软件应用程序所需的所有依赖项。这些依赖项包括系统库、外部第三方代码包和其他操作系统级应用程序。

下面附上的图片将阐明容器和虚拟机之间的区别。

[虚拟机和容器的区别](https://res.cloudinary.com/practicaldev/image/fetch/s--RR17rpap--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// signoz.io/img/blog/2022/07/container_vs_vms_3x.webp)

虚拟机虚拟化硬件层,而容器提供操作系统级别的虚拟化。

虚拟机虚拟化硬件层,而容器提供操作系统级别的虚拟化。

如上图所示,容器中包含的依赖项存在于高于操作系统的堆栈级别中。这意味着容器提供操作系统级别的虚拟化,而虚拟机提供硬件级别的虚拟化。

请注意,Docker 并不是唯一为您提供容器化的平台。还有其他容器提供商,例如 RKT、Linux Containers 和 CRI-O。

什么是Docker容器生命周期?

容器是操作系统中的一个进程。进程是正在执行的计算机程序的一个实例。但是容器进程是不同的。容器进程是全功能环境,与操作系统中的进程相比,它们与操作系统的隔离度更高。

就像流程一样,容器在其整个生命周期中具有不同的状态。容器在其生命周期中主要可以处于五种状态 -

  1. 创建状态

2.运行状态

3.暂停状态/未暂停状态

4.停止状态

5.杀死/删除状态

[Docker 容器生命周期](https://res.cloudinary.com/practicaldev/image/fetch/s--OdCI7VW1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://signoz.io /img/blog/2022/07/docker_container_lifecycle_3x.webp)

Docker 容器生命周期

创建状态

完成 docker 映像创建后,生命周期中的第一个状态是Created state。在这个**阶段,**一个 docker 容器是从 docker 映像创建的。

以下是使用nginx:alpine映像创建容器并将其命名为app1的示例:

docker create --name app1 nginx:alpine

进入全屏模式 退出全屏模式

如果成功创建,则打印新容器的 id。

请注意,在此状态下,仅创建容器,未启动容器。

运行状态

在**运行阶段,**一个 docker 容器正在积极运行。这意味着镜像中列出的命令正在被容器一一执行。

通过docker create命令创建或停止的容器可以使用下面编写的命令启动:

docker start <container-name>

进入全屏模式 退出全屏模式

或者如果没有创建容器,我们想创建一个容器同时运行它,我们可以直接使用docker run命令:

docker run <container-name>

进入全屏模式 退出全屏模式

或者

docker run <container-id>

进入全屏模式 退出全屏模式

暂停/未暂停状态

因此,当容器运行时,必须有一种方法可以暂停它。我们可以通过运行 pause 命令来做到这一点。此命令有效地冻结或暂停容器中运行的所有进程。当处于暂停状态时,容器不知道其状态。

docker pause container <container-id or container-name>

进入全屏模式 退出全屏模式

它基本上发送SIGSTOP信号来暂停容器中的进程。

同样,要让暂停的容器重新运行,我们将使用docker unpause命令:

docker unpause container <container-id or container-name>

进入全屏模式 退出全屏模式

停止状态

当一个容器停止时,它的主进程立即停止运行。停止时,状态的磁盘部分被持久化,即保存。

暂停和停止状态之间的主要区别在于,当容器停止时,状态的内存部分被清除,而在暂停状态下,其内存部分保持不变。

docker stop <container-id or container-name>

进入全屏模式 退出全屏模式

执行上述命令时,主容器进程会收到一个SIGTERM信号(默认情况下),并且在 宽限期(截至本文撰写时默认 10 秒)之后,它会收到一个SIGKILL信号。

什么是SIGTERMSIGKILL信号?

SIGTERMSIGKILL信号是 POSIX 信号,它们是操作系统告诉子进程如何表现的标准方式。SIGTERM被发送到进程以请求其终止。这允许进程执行正常终止、释放资源并在适当的情况下保存状态。发送SIGKILL以立即终止进程。与SIGTERM不同,此信号不能被捕获或忽略,接收进程在收到此信号后无法执行任何清理(少数例外情况除外)。如果您觉得有趣,您可以在此处阅读有关信号的更多信息(。

如果主进程已经退出或完成,容器也会停止。或者如果它遇到“内存不足异常”。

杀死/删除状态

为了让容器处于终止状态,我们运行docker kill命令,该命令发送SIGKILL信号以立即终止主进程。这意味着docker stopdocker kill之间的区别在于 - stop 可以允许安全终止(在宽限期内),而 kill 立即终止。

docker kill命令:

docker kill <container-id or container-name>

进入全屏模式 退出全屏模式

可以使用docker rm删除处于创建状态或停止状态的容器。这将导致删除与容器相关的所有数据,例如进程、文件系统、卷和网络映射等。

要删除容器,只需运行:

docker rm <container-id or container-name>

进入全屏模式 退出全屏模式

注意一个容器只有在它没有运行时才能被删除,否则它会给你一个错误,要求你先停止正在运行的容器,然后再删除它。

结论

我们简要介绍了与 Docker 相关的所有主题,并深入探讨了容器的生命周期。容器很棒,您可以使用更高级的工具(如 Docker Compose、Docker Swarm、Kubernetes、OpenShift 等)来做真正强大的事情。

Docker 容器启动并运行后,您需要注意容器及其主机的资源使用和性能。 Docker 提供了不同的方式来访问这些监控指标,例如,docker stats。

Docker 容器监控对于运行容器化应用程序至关重要。对于强大的监控和可观察性设置,您需要使用一种工具来可视化对容器监控重要的指标,并允许您设置关键指标的警报。对于 Docker 容器监控,您可以使用SigNoz- 一个开源 APM。

SigNoz 使用OpenTelemetry从您的容器收集指标以进行监控。 OpenTelemetry 正在成为检测云原生应用程序的世界标准,它得到了CNCF基金会的支持,Kubernetes 也是在该基金会下毕业的。

您可以在此处查看 SigNoz GitHub 存储库:

SigNoz GitHub 仓库


要了解有关 Signoz 的更多信息,请阅读以下博客:

SigNoz - DataDog的开源替代品

如果您使用 Kubernetes 运行应用程序,请阅读以下博客:

使用 SigNoz 监控 Kubernetes

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐