睿诚科技协会

docker 技术架构

Docker 技术架构是一个多层次、模块化的系统设计,其核心目标是通过轻量级的容器化技术实现应用的快速部署、隔离和可移植性,整个架构围绕客户端-服务器模式展开,通过多个核心组件协同工作,将应用及其依赖打包成标准化的容器镜像,并在运行时提供隔离的执行环境,以下从核心组件、工作流程、关键技术及优势等方面详细解析 Docker 技术架构。

Docker 核心组件及功能

Docker 架构主要由客户端(Docker Client)、守护进程(Docker Daemon)、镜像(Image)、容器(Container)、仓库(Registry)等核心组件构成,各组件通过 REST API 或命令行工具(CLI)交互,共同实现容器化管理的全流程。

Docker Client(客户端)

Docker Client 是用户与 Docker 系统交互的入口,提供了命令行工具(如 docker rundocker build)和 API 接口,用户通过客户端输入指令,客户端会将指令封装为 HTTP 请求发送给 Docker Daemon,并接收返回结果,执行 docker pull nginx 时,客户端会向 Daemon 请求拉取 Nginx 镜像。

Docker Daemon(守护进程)

Docker Daemon 是 Docker 架构的核心后台服务,负责管理容器的生命周期,包括镜像构建、容器运行、网络配置、数据卷管理等,它在 Linux 系统中以守护进程形式运行,通过监听 Unix 套接字或 TCP 端口与客户端通信,Daemon 的主要功能包括:

  • 镜像管理:从仓库拉取镜像、本地镜像存储与删除;
  • 容器管理:创建、启动、停止、删除容器,以及资源监控;
  • 驱动调用:通过存储驱动(如 OverlayFS)、网络驱动(如 bridge)管理容器底层资源。

Docker Image(镜像)

镜像是一个只读的文件系统模板,包含运行应用所需的代码、运行时环境、库、配置文件等,镜像采用分层存储机制(Union File System),每一层代表对前一层的修改,例如基于 ubuntu:20.04 镜像安装 Nginx 后,会新增一层包含 Nginx 文件的层,这种设计使得镜像体积更小、复用性更高,且不同容器可共享相同的基础层。

Docker Container(容器)

容器是镜像的运行实例,通过镜像创建后,会在镜像层之上添加可读写层(Container Layer),实现动态数据修改,容器与宿主机操作系统共享内核,但通过命名空间(Namespace)和控制组(cgroups)实现资源隔离:

  • 命名空间:隔离进程(PID)、网络(NET)、文件系统(MNT)等资源,使容器拥有独立的运行环境;
  • 控制组:限制容器的 CPU、内存、磁盘 I/O 等资源使用,避免单个容器耗尽宿主机资源。

Docker Registry(仓库)

仓库是存储和分发镜像的服务,分为公共仓库(如 Docker Hub)和私有仓库(如 Harbor、Registry),仓库包含多个仓库(Repository),每个仓库包含多个标签(Tag),用于标识镜像版本。nginx:latest 表示 Nginx 镜像的最新版本,用户可通过 docker push 将镜像推送到仓库,或通过 docker pull 从仓库拉取镜像。

Docker 工作流程

以构建和运行一个 Web 应用容器为例,Docker 的工作流程可分为镜像构建、容器运行、数据持久化三个阶段:

镜像构建

开发者通过编写 Dockerfile 文件定义镜像构建步骤,

FROM python:3.9          # 基础镜像
WORKDIR /app             # 设置工作目录
COPY requirements.txt .  # 复制依赖文件
RUN pip install -r requirements.txt  # 安装依赖
COPY . .                 # 复制应用代码
EXPOSE 8000             # 暴露端口
CMD ["python", "app.py"] # 启动命令

执行 docker build -t my-web-app:1.0 . 时,Docker Client 将指令发送给 Daemon,Daemon 逐层解析 Dockerfile,创建镜像并存储到本地。

容器运行

执行 docker run -d -p 8080:8000 my-web-app:1.0,Daemon 会:

  • 检查本地是否存在 my-web-app:1.0 镜像,若不存在则从仓库拉取;
  • 创建容器实例,分配唯一的容器 ID;
  • 通过命名空间隔离进程和网络,通过 cgroups 限制资源;
  • 启动容器,执行 CMD 指定的命令,并将容器的 8000 端口映射到宿主机的 8080 端口。

数据持久化

容器默认存储在可读写层,容器删除后数据会丢失,为持久化数据,可通过数据卷(Volume)或绑定挂载(Bind Mount)将宿主机目录或专用存储挂载到容器内。docker run -v /data:/app/data my-web-app:1.0 将宿主机的 /data 目录挂载到容器的 /app/data,实现数据持久化。

关键技术支撑

Docker 的核心功能依赖于 Linux 内核的两大技术:

命名空间(Namespace)

命名空间是 Linux 内核提供的资源隔离方案,通过为不同容器分配独立的资源视图,实现容器间的隔离,主要包括:

  • PID Namespace:隔离进程 ID,使容器内的进程看不到宿主机或其他容器的进程;
  • NET Namespace:隔离网络设备、IP 地址、端口等,每个容器拥有独立的网络栈;
  • MNT Namespace:隔离文件系统挂载点,容器可拥有独立的根目录。

控制组(cgroups)

cgroups 是 Linux 内核的资源管理机制,可限制、审计和隔离进程组使用的物理资源,包括 CPU、内存、磁盘 I/O、网络带宽等,通过设置 --memory=512m 参数,可将容器的内存使用限制在 512MB 内,防止内存溢出影响宿主机。

Union File System(联合文件系统)

联合文件系统是镜像分层存储的核心技术,支持将多个只读层和一个可读写层合并为统一的文件系统视图,常见的实现包括 AUFS、OverlayFS、Btrfs 等,OverlayFS 通过 lowerdir(只读层)和 upperdir(可读写层)合并,为容器提供高效的文件读写能力。

Docker 架构的优势

  1. 轻量级与高性能:容器共享宿主机内核,无需虚拟化整个操作系统,启动速度快(秒级)、资源占用小(通常只有几十 MB 内存开销)。
  2. 环境一致性:镜像打包了应用及所有依赖,解决了“在我机器上能运行”的问题,开发、测试、生产环境完全一致。
  3. 可移植性:容器可在任何支持 Docker 的平台(Linux、Windows、macOS)运行,实现“一次构建,处处运行”。
  4. 快速扩展与编排:结合 Docker Compose(多容器编排)和 Kubernetes(容器编排平台),可轻松实现应用的横向扩展和自动化管理。

相关问答 FAQs

问题 1:容器与虚拟机的主要区别是什么?
答:容器与虚拟机都是资源隔离技术,但核心区别在于架构层次和资源开销,虚拟机通过 Hypervisor 虚拟化整个硬件层,每个虚拟机拥有独立的操作系统内核,资源开销大(通常需要几 GB 内存);而容器直接运行在宿主机内核上,通过命名空间和控制组实现隔离,无需额外操作系统,资源开销小(通常几十 MB),启动速度更快(秒级 vs 分钟级),虚拟机提供更强的隔离性,容器则更轻量、高效。

问题 2:Docker 镜像的分层存储机制有什么优势?
答:镜像分层存储的核心优势是资源复用高效构建,不同镜像可共享相同的基础层(如 ubuntu:20.04),减少磁盘占用;当重新构建镜像时,只需修改变化层,未变化的层可直接复用缓存,显著提升构建速度,多个基于 python:3.9 的镜像可共享 Python 运行时层,避免重复下载和存储,同时通过写时复制(Copy-on-Write)机制,在容器运行时高效管理读写层。

分享:
扫描分享到社交APP
上一篇
下一篇