Docker核心概念 | Image、Container、Layer

2023-11-01 14:23:09 浏览数 (1)

一、基础概念

1. 镜像(Image) 是什么

镜像image是 Docker 中的静态元素,它是一个可执行软件包,包含了运行 Docker 容器所需的所有代码、库和配置文件。

2. 容器(Container) 是什么

容器container是 Docker 中的运行时环境,它是在 Docker 镜像的基础上创建的一个可运行的实体。每个容器都是一个独立的运行环境,可以运行任意命令和应用程序。

3. 层(Layer) 是什么

Docker 中的层是指镜像的构成元素,也称为分层文件系统。

镜像以分层文件系统的形式组织,每一层都是基于前面一层进行的更改或添加,而不是一个完整的文件系统。Docker 的层架构允许开发和部署人员仅对更改的部分进行调整和更新,从而节省了存储和带宽,提高了应用程序的可移植性。镜像和容器运行时都使用层来维护和引用文件系统。层也允许 Docker 一些功能,如镜像缓存和镜像分享。

二、Docker 镜像

1. 镜像的作用和种类

Docker 镜像是一个可执行软件包,其中包含了运行 Docker 容器所需的所有代码、库和配置文件。镜像可以看作是一个 Docker 容器的模板,是由一系列的文件系统层和相关元数据组成。它有多种作用,例如可以作为容器的构建模板、分发、备份和恢复等。

常用的 Docker 镜像种类包括官方镜像、第三方镜像、私有镜像等。

2. 镜像的构成:基础镜像、标签、元数据和配置

Docker 镜像的构成由以下几部分组成:

  • 基础镜像: 构成镜像的基础层,它是由 Docker 官方或其他厂商提供的,并且是只读的
  • 标签: 对该镜像的一种别名,它可以用来标识版本、分支等信息
  • 元数据: 包含了镜像的一些描述信息,例如创建者、创建时间、运行指令等
  • 配置文件: 描述了镜像如何运行 ****

3. 镜像构建与维护

Docker 镜像的构建一般使用 Dockerfile 文件来定义,Dockerfile 是一个文本文件,包含了一条条指令来描述如何构建镜像。Dockerfile 中的每一层将被称为镜像的一个层(layer),它们会被压缩,并最终形成镜像。Docker 镜像的维护可以通过容器动态修改,也可以使用 Docker 命令行工具进行操作,例如镜像构建、推拉等等。

4. 镜像的网络传输和存储

Docker 镜像可以通过 Docker Registry 分发和存储,Docker Hub 是 Docker 官方的镜像仓库,包含了众多的开源镜像,用户可以通过搜索、拉取、推送等操作来获取、创建和分享自己的 Docker 镜像。此外,用户也可以使用自己的私有 Registry 存储和管理 Docker 镜像。

在网络传输方面,Docker 使用分层结构来传输镜像,使传输速度更快,同时也节省了带宽和存储空间。

三、Docker 容器

1. 容器的作用和类型

Docker 容器是由 Docker 镜像创建的运行实例。每个容器是一个独立的运行环境,可以运行任意命令和应用程序。与传统的虚拟机不同,Docker 容器比虚拟机更加轻量级,可以快速地创建、销毁和启动。

Docker 容器通常被分为应用容器、系统容器以及数据容器三种类型。

2. 容器的特性和运行机制

Docker 容器有以下特点:

  • 可移植性:Docker 容器具有良好的可移植性,容器可以在任何支持 Docker 的主机上运行。
  • 隔离性:Docker 容器是彼此隔离的,一个容器不能访问另一个容器内的内容,也不能访问宿主机上的内容。
  • 轻量化:Docker 容器启动速度快,占用资源少,可以实现快速的部署和更新。

Docker 容器的运行机制也比较简单,当一个容器被启动时,Docker 首先会检查是否有相应的镜像存在,如果没有,则会从 Docker Hub 或本地仓库下载镜像,并根据镜像生成一个容器实例。Docker 容器在内核层面上实现了隔离,每个容器都有自己的 PID、网络、IPC 以及文件系统等隔离的命名空间。

3. 容器的网络和文件系统

Docker 容器的网络通常采用 Bridge 模式,Docker 会为容器分配一个单独的 IP 地址,并且每个容器相互独立。如果需要在多个容器之间实现网络互通,可以使用 Docker 中的网络模型和网络命名空间。

Docker 容器的文件系统和其它操作系统上的文件系统不同,其采用了类似于层的概念,由多个只读层和一个可写层构成,通过叠加多个只读层来实现镜像的复用和共享。

四、 Docker 层

1. 层的定义和作用

Docker 中的层是指在构建 Docker 镜像时产生的一系列分层的文件系统。

每一层都是基于前面一层进行的更改或添加,而不是一个完整的文件系统。层充分利用了 Copy-on-Write 技术,使得 Docker 镜像的构建速度和存储效率更高。

另外,由于 Docker 镜像的每一层都是只读的,因此 Docker 镜像的更改只会影响到最上面的可读写层,整个镜像堆栈的其余部分均不受影响。

2. 分层文件系统的实现

Docker 中的层的实现是通过分层文件系统实现的。

分层文件系统是一种特殊的文件系统,它可以组合不同的文件系统层,并通过联合挂载的方式合并成一个逻辑文件系统。

Docker 镜像的每个层都是一个只读的文件系统层,然后根据应用程序的需求添加一个可读写的层。当容器运行时,容器的可读写层与其它层共同组合而成一个单独的文件系统,成为容器运行时环境。

3. 层与镜像,层与容器的关系

Docker 镜像是由多个只读层和一个可读写层组成,而且每个层都会被存储为一个文件。这意味着 Docker 镜像可以使用先前层的快照来构建,因此传输和存储效率非常高。

容器、镜像、层(图片来自Docker官网)容器、镜像、层(图片来自Docker官网)

对于容器而言,它的可读写层与其它镜像层组合成了一个单独的文件系统,成为容器运行时环境。因此,Docker 容器的更改不会影响底层的镜像。而且,Docker 镜像越底层,其通用性就越广,因为更多的应用可以在更少的依赖下启动和运行。

Docker 中的层是整个 Docker 架构中的基础,通过分层文件系统的实现,Docker 实现了高效的存储和传输,实现了仅需更改一层便可更新镜像的效果。对于应用开发者和部署者来说,深入理解和利用 Docker 层将会极大地提升其应用开发和部署的效率。

五、总结

Image、Container、Layer是Docker中的核心概念。

Image 与 Layer 之间的关系是镜像是层的堆叠,每个层代表镜像的一部分。

Container 与 Image 的关系是容器是从镜像启动而来的,一个镜像可以创建多个不同的容器。

Layer 和 Container 的关系则体现在每个容器实例都基于一个启动镜像,其更改只会影响最上层可读写层,而不会影响其它层,保证了容器的隔离性和可移植性。

六、附录

1. 我的公众号

0 人点赞