在使用Docker时,我们从一个基本映像开始。我们启动它,创建更改,这些更改被保存在图层中形成另一个图像。

因此,最终我为我的PostgreSQL实例和我的web应用程序提供了一个图像,对这些图像的更改将持续保存。

什么是容器?


当前回答

Dockerfile→(Build)→Image→(Run)→Container。

Dockerfile:包含一组Docker指令,以您喜欢的方式配置您的操作系统,并安装/配置所有软件。 图片:编译好的Dockerfile。节省了每次需要运行容器时重新构建Dockerfile的时间。这是一种隐藏供应代码的方法。 容器:虚拟操作系统本身。您可以ssh进入其中并运行任何命令,就像它是一个真实的环境一样。您可以从同一个映像运行1000多个容器。

其他回答

对于一个虚拟的编程类比,你可以认为Docker有一个抽象的ImageFactory,它保存着它们来自存储的ImageFactory。

然后,一旦你想从ImageFactory中创建一个应用程序,你就有了一个新的容器,你可以随心所欲地修改它。DotNetImageFactory将是不可变的,因为它作为一个抽象工厂类,在那里它只交付您想要的实例。

IContainer newDotNetApp = ImageFactory.DotNetImageFactory.CreateNew(appOptions);
newDotNetApp.ChangeDescription("I am making changes on this instance");
newDotNetApp.Run();

图像之于类就像容器之于对象。

容器是图像的实例,就像对象是类的实例一样。

映像的实例称为容器。你有一个图像,它是你描述的一组图层。如果启动这个映像,就有了这个映像的运行容器。同一个映像可以有多个正在运行的容器。

你可以用docker images看到你所有的图像,而你可以用docker ps看到你正在运行的容器(你可以用docker ps -a看到所有的容器)。

因此,映像的运行实例就是一个容器。

简而言之:

容器是内核中的一个分区(虚拟),它共享一个公共操作系统并运行一个镜像(Docker镜像)。

容器是一个自我维持的应用程序,它将包含包和运行代码所需的所有依赖项。

我认为最好一开始就解释清楚。

假设你运行命令docker run hello-world。会发生什么呢?

它调用Docker CLI,负责接收Docker命令并转换为调用Docker服务器命令。一旦Docker服务器得到一个运行映像的命令,它就会检查映像缓存中是否有这样一个名称的映像。

假设hello-world不存在。Docker服务器访问Docker Hub (Docker Hub只是一个免费的图像存储库)并询问,嘿,Hub,你有一个名为hello-world的图像吗? 枢纽响应-是的,我有。那就请给我吧。下载过程开始了。一旦Docker镜像下载完成,Docker服务器就会将其放入镜像缓存中。

所以在我们解释Docker镜像和Docker容器是什么之前,让我们先来介绍一下你电脑上的操作系统以及它是如何运行软件的。

例如,当你在电脑上运行Chrome时,它会调用操作系统,操作系统自己会调用内核并请求,嘿,我想运行这个程序。内核设法从您的硬盘运行文件。

现在假设你有两个程序,Chrome和Node.js。Chrome需要Python版本2才能运行,Node.js需要Python版本3才能运行。如果您的计算机上只安装了Python v2,则只能运行Chrome。

为了使这两种情况都能工作,您需要以某种方式使用称为名称空间的操作系统特性。命名空间是一种特性,它使您有机会隔离进程、硬盘驱动器、网络、用户、主机名等。

当我们讨论映像时,我们实际上是在讨论文件系统快照。映像是一个物理文件,其中包含构建特定容器的方向和元数据。容器本身是一个映像的实例;它使用名称空间隔离硬盘驱动器,该名称空间仅对该容器可用。因此容器是一个进程或一组进程,它将分配给它的不同资源分组。