在使用Docker时,我们从一个基本映像开始。我们启动它,创建更改,这些更改被保存在图层中形成另一个图像。
因此,最终我为我的PostgreSQL实例和我的web应用程序提供了一个图像,对这些图像的更改将持续保存。
什么是容器?
在使用Docker时,我们从一个基本映像开始。我们启动它,创建更改,这些更改被保存在图层中形成另一个图像。
因此,最终我为我的PostgreSQL实例和我的web应用程序提供了一个图像,对这些图像的更改将持续保存。
什么是容器?
当前回答
Image相当于OOP中的类定义,层是该类的不同方法和属性。
容器是图像的实际实例化,就像对象是实例化或类的实例一样。
其他回答
Docker Client, Server, Machine, Images, Hub, composites都是项目工具和软件,聚在一起形成了一个平台,在这个平台上,围绕着创建和运行一些叫做容器的东西,现在如果你运行Docker run redis命令,一个叫做Docker CLI的东西到达了一个叫做Docker Hub的东西,它下载了一个叫做image的文件。
码头工人形象:
一个镜像是一个单独的文件,包含运行一个非常特定的程序所需的所有依赖项和所有配置,例如redis是你刚刚下载的(通过运行docker run redis命令)应该运行的镜像。
这是存储在硬盘上的单个文件,在某些时候,您可以使用此映像来创建称为容器的东西。
容器是一个映像的实例你可以把它想象成一个运行的程序它有自己孤立的一组硬件资源它有自己的一小块内存有自己的一小块网络技术空间也有自己的一小块硬盘空间。
现在让我们看看当你发出下面的命令时: Sudo docker run hello-world
Above command will starts up the docker client or docker CLI, Docker CLI is in charge of taking commands from you kind of doing a little bit of processing on them and then communicating the commands over to something called the docker server, and docker server is in charge of the heavy lifting when we ran the command Docker run hello-world, That meant that we wanted to start up a new container using the image with the name of hello world, the hello world image has a tiny tittle program inside of it whose sole purpose or sole job is to print out the message that you see in the terminal.
现在,当我们运行该命令并将其发送到docker服务器时,后台很快就会发生一系列操作。Docker服务器看到我们试图使用名为hello world的映像启动一个新容器。
docker服务器做的第一件事是检查它是否已经有一个本地副本,比如你个人机器上的hello world映像或那个hello world文件的副本。因此,docker服务器研究了一种叫做图像缓存的东西。
现在,因为你和我刚刚在我们的个人电脑上安装了Docker,图像缓存目前是空的,我们没有之前已经下载过的图像。
因此,由于映像缓存是空的,docker服务器决定求助于一个名为docker hub的免费服务。Docker Hub是一个免费的公共映像库,您可以免费下载并在个人计算机上运行。所以Docker服务器联系了Docker Hub,下载了hello world文件,并将其存储在你的计算机上的image-cache中,现在它可以在未来的某个时候重新运行,而不必从Docker Hub重新下载它。
之后,docker服务器将使用它创建一个容器的实例,我们知道容器是一个映像的实例,它的唯一目的是运行一个非常特定的程序。因此,docker服务器从图像缓存中取出图像文件,并将其加载到内存中,从中创建一个容器,然后在其中运行一个程序。这个程序的目的就是打印出你看到的信息。
什么是容器: 首先,图像是如何创建容器的蓝图。
容器是一个进程或一组进程的资源专门分配给它的分组,在波形图,当我们考虑一个集装箱我们有一些正在运行的进程发送一个系统调用内核,内核会看那个传入系统调用,直接一个非常具体的部分硬盘,内存,CPU或其他什么它可能需要这些资源的一部分用于奇异的过程。
映像或容器映像是一个包含应用程序代码、应用程序运行时、配置和依赖库的文件。映像基本上是将所有这些包装成一个单一的、安全的不可变单元。使用适当的docker命令构建映像。图像有图像id和图像标签。标签的格式通常为<docker-user-name>/image-name:tag。
当您开始使用映像运行应用程序时,实际上是启动了一个容器。你的容器是一个运行图像的沙盒。Docker软件用于管理映像和容器。
Image是一个安全的包,其中包含应用程序工件、库、配置和应用程序运行时。容器是映像的运行时表示形式。
也许解释一下整个工作流程会有帮助。
一切都从Dockerfile开始。Dockerfile是映像的源代码。
创建Dockerfile之后,构建它来创建容器的映像。图像只是Dockerfile“源代码”的“编译版本”。
一旦有了容器的映像,就应该使用注册表重新分发它。注册表类似于Git存储库——您可以推送和拉出图像。
接下来,您可以使用映像来运行容器。在许多方面,运行中的容器与虚拟机非常相似(但没有管理程序)。
尽管阅读了这里所有的问题,我还是无法理解图像和图层的概念,然后最终偶然发现了Docker的这个优秀文档(废话!)
这里的例子是理解整个概念的关键。这是一篇很长的文章,所以我总结了需要真正抓住的要点,以使文章变得清晰。
镜像:Docker镜像由一系列只读层构建而成 层:每一层代表图像Dockerfile中的一条指令。
示例:下面的Dockerfile包含四个命令,每个命令创建一个层。
从ubuntu: 15.04 副本。/应用程序 运行make /app CMD python /app/app.py
重要的是,每一层都只是与前一层的一组差异。
容器。 当你创建一个新的容器时,你在底层的层上添加了一个新的可写层。这一层通常被称为“容器层”。对正在运行的容器所做的所有更改,例如写入新文件、修改现有文件和删除文件,都将写入这个薄的可写容器层。
因此,容器和映像之间的主要区别是 最上面的可写层。所有写入添加new或 修改现有数据都存储在这个可写层中。当 容器被删除,可写层也被删除。的 底层图像保持不变。
从磁盘大小的角度理解映像cnd容器
要查看正在运行的容器的大致大小,可以使用docker ps -s命令。你得到size和virtual size作为两个输出:
大小:用于每个容器的可写层的数据量(在磁盘上) 虚拟大小:容器使用的只读映像数据所使用的数据量。多个容器可以共享部分或全部只读映像数据。因此它们不是相加的。也就是说,你不能把所有的虚拟大小相加来计算镜像占用了多少磁盘空间
另一个重要的概念是写时复制策略
如果一个文件或目录存在于映像的较低层中,而另一层(包括可写层)需要对其进行读访问,则它只使用现有文件。当另一层第一次需要修改该文件时(当构建映像或运行容器时),该文件被复制到该层并进行修改。
我希望这能帮助到像我一样的人。
Docker的核心概念是使创建“机器”变得容易,在这种情况下,机器可以被认为是容器。容器有助于重用性,允许您轻松地创建和删除容器。
图像描述了容器在每个时间点上的状态。所以基本的工作流程是:
创建映像 启动容器 对容器进行更改 将容器重新保存为图像