Docker镜像和容器有什么区别?

1230

使用Docker时,我们从一个基础镜像开始。我们启动它,进行更改,这些更改会被保存在不同的层中,形成另一个镜像。

因此,我最终拥有一个用于PostgreSQL实例的镜像和一个用于Web应用程序的镜像,对其进行的更改将继续存在。

什么是容器?


截至2022年,Docker已经几乎“死亡”。因此,问题和答案应该转化为更通用的形式,以符合OCI规范/镜像和容器定义。 - user3192295
9
比起OCI,更多的人知道什么是Docker。那么是否每个macOS相关问题都应该标记为“Darwin”呢? - btraas
32个回答

2

长话短说。

Docker镜像:

用于创建容器的文件系统和配置(只读)应用程序。

Docker容器:

容器与镜像的主要区别在于最上层可写层。容器是具有顶部可写层的Docker镜像的运行实例。容器运行实际的应用程序。容器包含一个应用程序及其所有依赖项。当容器被删除时,可写层也会被删除。底层镜像保持不变。


其他重要术语:

Docker守护进程:

在主机上运行的后台服务,用于管理构建、运行和分发Docker容器。

Docker客户端:

命令行工具,允许用户与Docker守护进程交互。

Docker Store:

Store是Docker镜像的注册表之一。可以将注册表视为所有可用Docker镜像的目录

来自博客文章中的图片胜过千言万语。 enter image description here

总结:

  • 从Docker Hub中拉取镜像或从Dockerfile构建 => 得到Docker镜像(不可编辑)。
  • 运行镜像(docker run image_name:tag_name)=> 得到正在运行的镜像即容器(可编辑)

2
一张图片对应一个类,就像一个容器对应一个对象。
一个容器是图片的实例,就像一个对象是类的实例。

2

就像在面向对象编程语言中,一个对象是类的实例一样,Docker容器是Docker镜像的实例。


与 https://dev59.com/kmAg5IYBdhLWcg3wU5gS#63048251 和 https://dev59.com/kmAg5IYBdhLWcg3wU5gS#46073260 相同的答案。 - mzjn

1
作为一个编程的比喻,你可以把Docker看作是一个抽象的ImageFactory,它持有从存储中获取的ImageFactories。
然后,一旦你想要从那个ImageFactory创建一个应用程序,你将拥有一个新的容器,并且可以根据需要进行修改。DotNetImageFactory将是不可变的,因为它充当了一个抽象工厂类,只提供你需要的实例。
IContainer newDotNetApp = ImageFactory.DotNetImageFactory.CreateNew(appOptions);
newDotNetApp.ChangeDescription("I am making changes on this instance");
newDotNetApp.Run();

1
Dockerfile就像你的Bash脚本,可以生成一个tarball(Docker镜像)。
Docker容器就像是解压后的tarball版本。你可以在不同的文件夹中拥有任意多个副本(即容器)。

1
一个 Docker 容器运行着镜像的一个实例。你可以将镜像类比为程序,容器则类比为进程 :)

1
一张图片是用来构建容器(运行实例)的蓝图。

1
简而言之:
容器是内核中的一个分区(虚拟),它共享一个通用的操作系统并运行一个镜像(Docker镜像)。
容器是一个自我可持续的应用程序,将包和所有必要的依赖项放在一起以运行代码。

0
一个非常简短且易懂的类比使用面向对象编程概念是: Docker镜像就像是一个类,容器则是该类的一个对象(实例)。

0

图像或容器镜像是一个文件,其中包含您的应用程序代码、应用程序运行时、配置和依赖库。该镜像基本上将所有这些内容封装成一个单一的、安全的不可变单元。适当的Docker命令用于构建镜像。该镜像具有镜像ID和镜像标签。标签通常采用<docker-user-name>/image-name:tag格式。

当您使用镜像启动应用程序时,实际上启动了一个容器。因此,您的容器是一个沙盒,在其中运行您的镜像。Docker软件用于管理镜像和容器。

镜像是一个安全的包,其中包含您的应用程序工件、库、配置和应用程序运行时。容器是您的镜像的运行时表示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接