繁体   English   中英

为什么 docker 必须从 dockerfile 创建映像,然后从映像创建容器,而不是从 Dockerfile 创建容器?

[英]Why does docker have to create an image from a dockerfile then create a container from the image instead of creating a container from a Dockerfile?

为什么 docker 必须从 dockerfile 创建映像,然后从映像创建容器,而不是直接从 Dockerfile 创建容器?

首先从 Dockerfile 创建图像然后从创建容器的目的/好处是什么?

- - -编辑 - - -

这个问题Docker 镜像和容器有什么区别? 不回答我的问题。

我的问题是:为什么我们需要从图像而不是 dockerfile 创建容器? 首先从 Dockerfile 创建图像然后从创建容器的目的/好处是什么?

  • Dockerfile 是创建图像的配方
  • 图像是一个虚拟文件系统
  • 容器是主机上正在运行的进程

您不希望每个主机都根据配方构建自己的映像。 对于某些主机来说,只需下载图像并使用它会更容易。

创建图像可能非常昂贵。 我有复杂的 Dockerfile,可能需要几个小时才能构建,可能会下载 50 GB 的数据,但仍然只能创建一个 200 MB 的图像,我可以将其发送到不同的主机。

从现有图像启动容器非常便宜。

如果您只有 Dockerfile 来启动图像容器,那么整个工作流程将变得非常繁琐。

图像和容器是两个不同的概念。

基本上,图像就像文件系统的快照,还有一些元数据。

容器是实际运行的几个进程之一(并且基于图像)。 一旦进程结束,您的容器就不再存在(准确地说,它已停止)

您可以将映像视为运行容器的基础。

因此,您 Dockerfile 将创建一个图像(静态的),您可以将其存储在本地或推送到存储库,以便以后使用。

容器不能“储存”,因为它是“活”的东西。

您可以将图像与容器视为类似于类与对象或定义与实例。 该映像包含用于创建容器的文件系统和默认设置。 容器包含特定实例的设置,以及运行时的命名空间和运行进程。

至于为什么要将它们分开,效率和可移植性。 由于我们有单独的图像,因此我们还有 inheritance,其中一个图像扩展了另一个图像。 inheritance 的关键细节是不会为每个图像复制图像中的文件系统层。 这些层是 static,您可以通过使用新层创建新图像来实现它们。 使用覆盖文件系统(或其他联合文件系统驱动程序之一),我们可以使用我们的新映像 append 对该文件系统进行额外更改。 容器在运行映像时执行相同的操作。 这意味着您可以拥有一个 1 Gig 的基础映像,使用具有 100 Megs 更改的子映像对其进行扩展,并运行 5 个容器,每个容器写入 1 Meg 的文件,docker 主机上使用的总磁盘空间仅为 1.105 Gigs超过 7.6 演出。

当您使用注册表时,可移植性部分会发挥作用,例如 Docker Hub。 图像是容器的通用、可重用和可转移的部分。 它不与任何主机上的实例相关联。 因此,您可以推送和拉取映像,但容器与它们正在运行的主机、该主机上的命名卷、该主机上定义的网络等紧密绑定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM