深入解析:Docker 镜像与容器之间的核心区别

Docker 构建镜像并利用宿主机上的 Docker 引擎来运行容器。虽然我们在日常工作中常将这两个术语放在一起使用,但理解 镜像(即蓝图)与 容器(即运行实例)之间清晰的界限,是掌握 Docker 的基石。

一个 Docker 镜像 是一个只读的模板,其中包含了一套用于创建 Docker 容器的指令。这就好比面向对象编程(OOP)中的“类”——这是一个蓝图,我们可以基于它创建多个“对象”(即容器)。

与作为单个文件存在的虚拟机快照不同,Docker 镜像是由一系列只读层构建而成的。Dockerfile 中的每一条指令都会向镜像中添加一个新的层。

镜像的关键特性:

  • 不可变性: 镜像一旦构建完成,就无法再被更改。如果你需要修改应用程序代码或更新依赖项,就必须构建一个新的镜像。这种不可变性保证了环境的一致性。
  • 可移植性: 因为镜像本身就包含了应用程序代码、运行时、库以及环境变量,所以它在任何安装了 Docker 的机器上都能以完全相同的方式运行。这就完美解决了令人头疼的“在我机器上能跑”的问题。
  • 可共享性: 我们可以将镜像推送到像 Docker Hub 这样的中央注册中心,让全球各地的团队都能使用完全相同的开发、测试和生产环境。

Docker 容器

一个 Docker 容器 是 Docker 镜像的一个可运行实例。如果说镜像是房屋的设计蓝图,那么容器就是依据那张蓝图建造出来的实体房屋。

当我们启动一个容器时,Docker 会获取只读镜像,并在其顶部添加一个临时的、薄的 读-写层。在运行容器期间所做的任何更改——比如创建新文件、修改日志或安装临时包——都发生在这个顶部的读-写层中。

我们可以使用 Docker API 或 CLI 来创建、启动、停止、移动或删除容器。我们还可以将容器连接到一个或多个网络,并为其附加持久化存储(数据卷)。

运行 Docker 容器

docker run --publish 8000:8080 
--detach --name alias_name application_name:1.0

在这个例子中,容器内运行在端口 8080 上的应用被连接到了宿主机的 8000 端口。现在,宿主机可以通过 URL localhost:8000 来访问该应用。

Docker 镜像与容器之间的区别

特性

Docker 镜像

Docker 容器 —

— 类比

蓝图(类)

建筑物(对象/实例) 性质

逻辑实体;只读模板。

现实世界的、可运行的实体;进程。 可变性

不可变。构建后无法更改。

可变(暂时性地)。它拥有一个用于运行时更改的读-写层。 资源消耗

存储时仅占用磁盘空间(不消耗 CPU/RAM)。

仅在运行时消耗 CPU 和 RAM。 创建方式

通过构建 Dockerfile 创建。

通过使用 docker run 命令运行镜像来创建。 共享

可以推送到 Docker Hub 并从中拉取。

无法直接共享。你需要将容器“提交”为一个新的镜像来共享其状态。 层结构

由多个只读层组成。

由镜像层加上一个顶部读-写层组成。 连接性

无法连接或进入镜像。

我们可以将 Shell 会话附加到运行中的容器。 存在形式

可以独立于容器存在。

不能脱离基础镜像而存在。

Docker 容器与虚拟机镜像的区别

Docker 容器

虚拟机镜像

Docker 容器可以在几秒内启动。

虚拟机镜像启动需要几分钟。

Docker 容器的资源占用非常少。

虚拟机镜像的资源占用非常密集。

隔离是在进程级别进行的。

隔离是在操作系统级别进行的。

Docker 容器在应用级别管理依赖项。

虚拟机镜像在系统级别管理依赖项。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/54439.html
点赞
0.00 平均评分 (0% 分数) - 0