为什么 docker 必须从 docker 文件创建一个镜像,然后从该镜像创建一个容器,而不是从 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 必须从 docker 文件创建一个图像,然后从图像创建一个容器,而不是直接从 Docker 文件创建一个容器?

首先从 Docker 文件创建图像然后从该文件创建容器的 purpose/benefit 是什么?

-----编辑-----

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

我的问题是:为什么我们需要从图像而不是 docker 文件创建容器? purpose/benefit 首先从 Docker 文件创建图像,然后从该文件创建容器的过程是什么?

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

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

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

您可以查看图像作为制作容器 运行 的基础。

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

容器不能是"stored",因为它是"living"东西。

  • Dockerfile 是创建镜像的秘诀
  • 图像是一个虚拟文件系统
  • 容器是主机上的一个运行进程

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

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

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

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

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

至于为什么要将它们分开,效率和便携性。因为我们有单独的图像,所以我们也有继承,其中一个图像扩展另一个图像。该继承的关键细节是镜像中的文件系统层不会为每个镜像复制。这些图层是静态的,您可以通过使用新图层创建新图像来实现它们。使用覆盖文件系统(或其他联合文件系统驱动程序之一),我们可以使用新图像向该文件系统附加其他更改。当 运行 图像时容器做同样的事情。这意味着你可以有一个 1 Gig 的基础镜像,用一个有 100 Meg 变化的子镜像扩展它,运行 5 个容器,每个容器写入 1 Meg 的文件,整个磁盘 space 用于docker 主机只有 1.105 Gigs 而不是 7.6 Gigs。

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