Skip to main content

Docker 原理

· 5 min read

Docker 的内部架构、容器实现原理与底层存储原理笔记。

内部架构组件

组件描述
Docker DaemonDocker 的主要组件,是一个守护进程,负责管理容器的创建、启动、停止、删除等操作。
Docker Client与 Docker Daemon 交互的命令行工具,用户可以使用该工具发送命令来操作 Docker 容器。
Docker Registry存储 Docker 镜像的中央仓库,可以通过 Docker Client 从该仓库中拉取所需的镜像。
Docker Image容器的基础,是一个只读的文件系统,包含了应用程序、依赖库和配置文件等。可以通过 Dockerfile 文件创建。
Docker ContainerDocker 镜像的一个实例,包含了一个完整的文件系统、运行时环境和系统工具。

Docker Daemon 和 Docker Client 之间采用 RESTful API 进行通信,Docker Client 发送命令到 Docker Daemon,Docker Daemon 接收并处理命令,最终返回结果给 Docker Client。

当 Docker Daemon 接收到创建容器的命令时,它会先检查本地是否已经存在所需的 Docker 镜像。如果本地不存在该镜像,则 Docker Daemon 会从 Docker Registry 中拉取所需的镜像。如果本地已经存在该镜像,则 Docker Daemon 会根据该镜像创建容器,并将其放到一个独立的命名空间中运行。

容器运行时,Docker Daemon 会将容器的输出和错误信息输出到 stdout 和 stderr,用户可以通过 Docker Client 查看容器输出。当用户不再需要容器时,可以使用 Docker Client 发送命令停止该容器。Docker Daemon 会发送 SIGTERM 信号给容器中的进程,让它们优雅地退出。如果进程在一定时间内没有退出,则 Docker Daemon 会发送 SIGKILL 信号,强制杀死进程。

容器实现原理

Docker 容器的实现原理可以分为以下几个方面:

  1. 命名空间(Namespace):Docker 使用命名空间来隔离不同容器的进程、网络、文件系统和用户等资源。每个容器都有自己的命名空间,使得容器之间互相独立,互不影响。
  2. 控制组(Control Groups,简称 Cgroups):Docker 使用 Cgroups 来限制容器使用的 CPU、内存、网络带宽等资源。每个容器都被分配了一定的资源配额,使得容器之间可以公平地共享主机资源。
  3. 联合文件系统(Union File System):Docker 使用联合文件系统来实现容器的文件系统隔离。每个容器都有自己的文件系统,但是可以共享主机文件系统中的一部分内容。这种方式使得容器的文件系统非常轻量化,可以快速创建和销毁。
  4. 容器镜像(Container Image):Docker 容器是基于容器镜像创建的,容器镜像是一个只读的文件系统,包含了应用程序、依赖库和配置文件等。Docker 使用联合文件系统来实现容器镜像的分层存储,使得容器镜像可以共享和复用,大大减少了存储空间和下载时间。
  5. 容器运行时(Container Runtime):Docker 使用容器运行时来启动和管理容器。容器运行时负责创建容器的命名空间、Cgroups 和联合文件系统,然后启动容器中的进程。容器运行时还负责监控容器的状态和资源使用情况,并根据需要调整容器的资源配额。

Docker 的运行原理就是通过 Docker Daemon 和 Docker Client 之间的交互,来创建、启动、停止和删除 Docker 容器。Docker 镜像是 Docker 容器的基础,可以通过 Dockerfile 文件创建。Docker 容器运行在独立的命名空间中,可以提供隔离和安全性。

底层存储原理

Docker 的底层存储原理主要涉及到容器镜像和容器数据卷两个方面。

容器镜像存储

Docker 使用联合文件系统(Union File System)来实现容器镜像的分层存储。容器镜像是由多个只读层组成的,每个层都可以被共享和复用。当容器启动时,Docker 将这些只读层联合在一起,形成一个可写的容器文件系统。这种方式使得容器镜像非常轻量化,可以快速创建和销毁。

Docker 默认使用 AUFS(Advanced Multi-Layered Unification File System)作为联合文件系统,它支持多层联合、快速创建和销毁、只读层共享等特性。Docker 还支持其他的联合文件系统,比如 OverlayFS、DeviceMapper 和 Btrfs 等。

容器数据卷存储

Docker 容器的数据卷是一个可供容器读写的目录或文件,可以用于在容器之间共享数据、持久化存储等。Docker 支持多种类型的容器数据卷,包括主机挂载卷、命名卷和匿名卷等。

主机挂载卷是将主机上的目录或文件挂载到容器中,容器可以读写该目录或文件。命名卷是由 Docker 管理的数据卷,可以给数据卷指定一个名字,方便管理和共享。匿名卷是由 Docker 自动生成的数据卷,用于存储容器中的临时数据。

Docker 容器的数据卷存储原理主要是基于 Linux 的文件系统挂载机制实现的。当容器启动时,Docker 会将数据卷挂载到容器中的指定目录,并将容器中的数据写入到该目录中。容器停止时,Docker 会卸载数据卷,保证数据的持久化存储。

Docker 的底层存储原理是基于 Linux 文件系统的一些特性和技术实现的。容器镜像使用联合文件系统实现分层存储,容器数据卷使用文件系统挂载机制实现持久化存储。这些技术使得 Docker 容器具有轻量化、可移植和可复用的特性。

COMMENTS