在使用Docker时,我们从一个基本映像开始。我们启动它,创建更改,这些更改被保存在图层中形成另一个图像。
因此,最终我为我的PostgreSQL实例和我的web应用程序提供了一个图像,对这些图像的更改将持续保存。
什么是容器?
在使用Docker时,我们从一个基本映像开始。我们启动它,创建更改,这些更改被保存在图层中形成另一个图像。
因此,最终我为我的PostgreSQL实例和我的web应用程序提供了一个图像,对这些图像的更改将持续保存。
什么是容器?
当前回答
简单地说,如果一个图像是一个类,那么容器就是一个类的实例,一个运行时对象。
其他回答
*在docker中,镜像是一个不可变的文件,它包含docker应用程序运行所需的源代码和信息。它可以独立于容器而存在。
Docker容器是在运行时创建的虚拟化环境,需要镜像才能运行。docker网站上有一张图片显示了这种关系:
将映像看作容器的“快照”可能会有所帮助。
你可以从容器中创建映像(新的“快照”),也可以从映像中启动新的容器(实例化“快照”)。例如,您可以从一个基本映像实例化一个新容器,在容器中运行一些命令,然后将其“快照”为一个新映像。然后,您可以从这个新映像实例化100个容器。
其他需要考虑的事情:
图像是由层组成的,层是快照“差别”;当你推送一个图像时,只有“diff”被发送到注册表。 Dockerfile在基本映像之上定义了一些命令,这些命令可以创建新的层(“diffs”),从而生成新的映像(“snapshot”)。 容器总是从映像实例化。 图像标签不仅仅是标签。它们是图像的“全名”(“repository:tag”)。如果同一个映像有多个名称,则在处理docker映像时显示多次。
虽然将容器看作一个运行的映像是最简单的,但这并不十分准确。
An image is really a template that can be turned into a container. To turn an image into a container, the Docker engine takes the image, adds a read-write filesystem on top and initialises various settings including network ports, container name, ID and resource limits. A running container has a currently executing process, but a container can also be stopped (or exited in Docker's terminology). An exited container is not the same as an image, as it can be restarted and will retain its settings and any filesystem changes.
映像的实例称为容器。你有一个图像,它是你描述的一组图层。如果启动这个映像,就有了这个映像的运行容器。同一个映像可以有多个正在运行的容器。
你可以用docker images看到你所有的图像,而你可以用docker ps看到你正在运行的容器(你可以用docker ps -a看到所有的容器)。
因此,映像的运行实例就是一个容器。
尽管阅读了这里所有的问题,我还是无法理解图像和图层的概念,然后最终偶然发现了Docker的这个优秀文档(废话!)
这里的例子是理解整个概念的关键。这是一篇很长的文章,所以我总结了需要真正抓住的要点,以使文章变得清晰。
镜像:Docker镜像由一系列只读层构建而成 层:每一层代表图像Dockerfile中的一条指令。
示例:下面的Dockerfile包含四个命令,每个命令创建一个层。
从ubuntu: 15.04 副本。/应用程序 运行make /app CMD python /app/app.py
重要的是,每一层都只是与前一层的一组差异。
容器。 当你创建一个新的容器时,你在底层的层上添加了一个新的可写层。这一层通常被称为“容器层”。对正在运行的容器所做的所有更改,例如写入新文件、修改现有文件和删除文件,都将写入这个薄的可写容器层。
因此,容器和映像之间的主要区别是 最上面的可写层。所有写入添加new或 修改现有数据都存储在这个可写层中。当 容器被删除,可写层也被删除。的 底层图像保持不变。
从磁盘大小的角度理解映像cnd容器
要查看正在运行的容器的大致大小,可以使用docker ps -s命令。你得到size和virtual size作为两个输出:
大小:用于每个容器的可写层的数据量(在磁盘上) 虚拟大小:容器使用的只读映像数据所使用的数据量。多个容器可以共享部分或全部只读映像数据。因此它们不是相加的。也就是说,你不能把所有的虚拟大小相加来计算镜像占用了多少磁盘空间
另一个重要的概念是写时复制策略
如果一个文件或目录存在于映像的较低层中,而另一层(包括可写层)需要对其进行读访问,则它只使用现有文件。当另一层第一次需要修改该文件时(当构建映像或运行容器时),该文件被复制到该层并进行修改。
我希望这能帮助到像我一样的人。