ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Docker入门|第2章 容器架构详解

2026/9/15 6:37:35 拓冰建站 浏览量
Docker入门|第2章 容器架构详解 Docker入门|第2章 容器架构详解摘要本章围绕 Docker 容器架构展开先以 3W 框架What、Why、How讲清容器的定义、与虚拟机的区别及底层内核原理再介绍 Docker 项目、版本演进与镜像/容器/仓库三大核心概念随后详解 Docker 的 C/S 架构、七大组件与内部执行流程最后以docker run完整流程串联各组件协同工作帮助读者建立 Docker 整体架构认知。一、容器3W学习框架What、Why、How1.1 容器技术发展史容器并不是Docker发明的容器隔离思想很早就已经出现关键发展时间线1979年Unix V7引入Chroot Jail与chroot系统调用实现进程根目录隔离是最早容器化雏形但root进程有逃逸风险安全性弱。1982年chroot机制加入BSD系统。2000年FreeBSD推出FreeBSD Jail增强chroot安全性可以划分多个独立子系统并分配独立IP。2001年Linux VServer问世结合安全上下文在单Linux内核运行多个发行版。2004年Solaris Containers使用Zone区域实现资源边界隔离。2006年Google提出Process Containers用于限制、统计进程组CPU/内存/磁盘IO/网络资源。2007年进程容器演变为cgroups合并进入Linux内核2.6.24。2008年LXCLinux Containers诞生结合cgroups namespace真正实现Linux容器管理器。2013年Docker正式发布基于LXC大幅优化用户体验后续替换为自研libcontainer。2014年Google开源LMCTFY把内部容器栈对外开源代码概念贡献给libcontainer同年CoreOS发布rkt容器。1.2 What什么是容器容器是一种轻量级、可移植、自包含的软件打包技术应用打包完成之后几乎可以在任意环境无修改运行。开发笔记本、虚拟机、物理服务器、公有云主机都可以直接跑同一个容器。容器由两部分构成应用程序本身应用运行全部依赖库、软件包容器运行在宿主机Host OS用户空间是一组被内核隔离的普通进程共享宿主机内核。这点和虚拟机有着本质区别。1.3 容器 vs 虚拟机对比虚拟机通过Hypervisor虚拟化完整硬件每一台虚拟机都拥有独立Guest操作系统容器共享宿主机内核只隔离用户空间。特性虚拟机容器启动速度数分钟秒级甚至毫秒级系统内核拥有独立Guest内核共享宿主机Host内核实现技术Hypervisor硬件虚拟化Linux Namespace Cgroups内核技术隔离效果硬件级完整强隔离进程级别隔离资源消耗开销大完整操作系统占用大量内存磁盘开销很小只是宿主机普通进程资源调用应用需要经过Hypervisor拦截转发进程直接调用宿主机操作系统单机运行数量单服务器一般几十台虚拟机单机可以运行1000容器镜像特点完整非分层操作系统镜像分层只读镜像典型使用场景硬件强隔离、需要不同内核版本场景DevOps、微服务、环境一致性交付硬盘占用GB级别MB级别迁移性一般优秀核心区别虚拟机虚拟硬件容器仅仅隔离进程复用宿主机Linux内核。1.4 Why我们为什么需要容器现代软件面临环境一致性难题 业务系统越来越复杂一个业务拆分为大量微服务每个组件拥有各自依赖库。同时软件要跑在开发虚拟机、QA测试服务器、私有数据中心、公有云、笔记本电脑等多种多样硬件环境。就形成一个N服务 × M运行环境矩阵。开发要适配各种环境运维要维护多套环境配置工作量巨大很容易出现“在我电脑能跑线上跑不起来”。现实类比现实世界集装箱过去货运行业同样遇到类似问题不同货物形态不一样装卸转运极其麻烦。集装箱标准化之后不管里面装钢琴、汽车、货物统一规格箱体卡车、火车、轮船都可以统一装卸运输到达目的地才开箱。Docker借鉴集装箱思想把软件、依赖全部打包到标准化“软件集装箱”也就是容器。开发在笔记本构建容器镜像测试直接拉取镜像运行环境和开发完全一致生产环境直接部署同一个镜像不需要修改。对比项现实集装箱Docker容器打包对象各类实体货物软件 全部依赖库硬件适配标准箱体任意交通工具转运镜像可以在虚拟机、物理机、公有云运行隔离能力货物之间互相隔离互不损坏资源、网络、库版本互相隔离消除依赖冲突自动化标准接口起重机自动搬运标准化run/start/stop命令便于CI/CD自动化高效性不用开箱中转快速转运轻量级秒级启动、快速迁移职责划分货主只关心装箱运输方只负责运输开发只写业务代码运维只维护底层宿主机环境对于开发者Build OnceRun Anywhere一次构建到处运行。 对于运维人员Configure OnceRun Anything配置一套标准runtime就可以运行任意容器。 容器消除开发、测试、生产环境不一致的经典难题。1.5 How容器如何工作容器底层依赖Linux两大内核能力Namespace命名空间实现隔离容器看到独立主机名、网络、进程树、用户。Cgroups控制组实现资源限制限制容器CPU、内存、磁盘IO、网络最大使用量。后续章节会深入展开底层原理本章重点先掌握Docker整体架构。二、Docker介绍2.1 Docker项目简介Docker是Go语言开发的开源容器项目2013年由dotCloud公司发起项目影响力巨大dotCloud直接改名为Docker Inc专注容器产品开发。Docker核心价值提供完整工具链镜像分发、版本管理、容器移植屏蔽底层内核细节降低容器使用门槛创新分层镜像机制镜像复用大幅降低镜像存储与传输开销把容器复杂内核能力封装成简单命令用户操作容器就像操作普通应用程序。Docker容器可以理解为轻量级沙盒每个沙盒运行独立应用容器互相隔离容器之间也可以网络通信容器创建销毁速度极快资源开销极低。2.2 Docker版本演进Docker分为CE社区版免费EE企业版商业付费。在17.03版本之前Docker引擎版本号格式0.1.0 ~ 1.13.12017‑03‑02Docker正式区分CECommunity Edition社区版与EEEnterprise Edition企业版改用YY.MM年月式版本号CE每季度发布稳定版本每个月发布Edge预览版本季度版本维护4个月EE企业版季度发布每个版本官方维护12个月。版本号格式示例17.03.0YY.MM.patchYY年份MM月份patch补丁序号。2.3 Docker三大核心概念2.3.1 镜像ImageDocker镜像属于只读模板用来创建容器实例。例如Apache镜像内置最小操作系统 Apache Web服务。镜像支持增量分层构建可以从互联网下载现成镜像也可以自己编写Dockerfile构建。2.3.2 容器Container容器是镜像的运行实例。基于镜像启动得到容器容器可以启动、停止、删除容器之间互相隔离。类比面向对象镜像 类容器 实例对象。2.3.3 仓库Repository / Registry镜像仓库是集中存放镜像的地方。一个仓库下面可以存放同一个软件不同tag版本镜像。分为公开仓库、私有仓库。Docker Hub全球最大公开公共仓库阿里云、华为云SWR国内公共镜像仓库用户可以自建私有Registry、Harbor私有仓库。三、Docker架构详解3.1 Docker整体C/S客户端‑服务端架构Docker采用经典Client‑ServerC/S架构。Docker Client客户端docker命令行CLIDocker Daemondockerd服务端守护进程后台服务真正干活 两者之间使用REST API通信可以本地socket通信也可以跨机器远程TCP网络通信。完整Docker七大组成组件Docker Daemon守护进程dockerd侦听API请求管理镜像、容器、网络、数据卷同时可以和其他主机daemon通信。REST API接口客户端和daemon交互接口CLI或者程序代码都可以调用这套API。Docker Client客户端即docker命令用户日常交互入口发送REST API请求给dockerd执行任务。Registry镜像仓库存放镜像Docker Hub或者自建私有Harbor。Image镜像只读模板用来生成容器。Container容器镜像运行实例可以启停删除、挂载存储、配置网络也可以基于容器制作新镜像。Services服务Swarm集群模式组件跨多台主机扩展容器副本实现负载均衡。3.2 Docker内部底层执行流程用户执行docker客户端命令向Docker Daemon发送请求Docker Daemon内部Docker Server接收API请求Docker Engine收到任务每一项任务封装成为JobJob需要镜像访问Registry拉取镜像graph驱动管理镜像分层存储Job需要网络network驱动配置容器网络Job需要资源限制/执行命令exec驱动执行libcontainer底层库对接Linux内核调用namespace、cgroups等内核接口真正创建容器。3.3 Docker Client客户端就是我们终端执行的docker命令工具提供大量子命令。dockerrun# 创建运行容器dockerexec# 在运行容器执行命令dockerps# 列出容器dockerbuild# 构建镜像dockerpull# 拉取镜像dockerpush# 推送镜像dockerinfo# 查看系统整体信息dockerversion# 查看版本客户端不仅仅是命令行第三方程序也可以直接调用REST API访问Docker服务端。3.4 Docker Daemon服务端dockerddockerd是Linux后台守护服务进程。systemctl status docker.servicedockerd负责接收所有任务管理镜像、容器、网络、存储卷全部对象。注意客户端与服务端可以部署不同机器实现远程操作Docker对应教案第一章的C/S分离部署实验。3.5 镜像、容器、Registry回顾镜像Image只读模板可以从网络下载也可以Dockerfile构建容器Container镜像运行实例拥有可写容器层Registry仓库存放镜像docker pull下载镜像docker push上传镜像。四、Docker组件如何协同工作docker run完整流程以执行docker run -d -p 80:80 httpd为案例完整拆解组件协同用户在客户端执行docker run命令Docker Client把请求发送给本地dockerd守护进程dockerd检查本地是否已经存在httpd镜像本地没有镜像则向Docker Hub Registry发起拉取请求Registry把httpd镜像分层下载保存到本地dockerd基于本地httpd镜像创建容器配置端口映射、网络启动容器httpd服务在容器内部运行。执行完成后可以使用dockerimages# 看到已经下载httpd镜像dockerps# 看到正在运行httpd容器五、第2章小结容器技术不是Docker首创拥有很长发展历史从chroot、jail、cgroups、LXC一路演进Docker简化使用体验普及容器。容器是软件打包技术共享宿主机内核对比虚拟机容器轻量、启动快、资源占用小。集装箱思想解决软件环境N×M矩阵难题实现一次构建到处运行。Docker是C/S架构Client客户端 dockerd服务守护进程REST API作为中间通信层支持本地socket、远程TCP访问。三大核心概念镜像只读模板、容器运行实例、Registry镜像仓库。Docker内部执行链路CLI → REST API → dockerd → engine Job → libcontainer → Linux内核namespace/cgroups。docker run完整流程客户端发请求 → daemon检查本地镜像 → 缺失镜像从Registry拉取 → 创建并启动容器。