Docker学习:Docker介绍及其架构介绍

本期我们介绍一个对于当今的软件行业必不可少的工具:Docker

目录

Docker介绍

基础概念解释

[应用(Application) / 系统(System)](#应用(Application) / 系统(System))

[模块(Module) / 组件(Component)](#模块(Module) / 组件(Component))

分布式(Distributed)

集群(Cluster)

[主(Master) / 从(Slave)](#主(Master) / 从(Slave))

中间件(Middleware)

容器(Docker)

容器编排(K8S,Kubernetes)

评价指标分区

可用性(Availability)

[响应时长(Response Time, RT)](#响应时长(Response Time, RT))

[吞吐(Throughput) vs 并发(Concurrent)](#吞吐(Throughput) vs 并发(Concurrent))


Docker介绍

在 Docker(2013年开源)普及之前,我们交付和运行软件的方式与今天截然不同,那时的痛点是每一位运维和架构师都刻骨铭心的:

"环境不一致"噩梦

开发者常说的"在我机器上能跑",本质是因为开发环境与测试、生产环境在操作系统版本、依赖库、配置文件、运行时版本上存在细微却致命的差异。这种差异导致大量时间浪费在环境排查上,严重拖累交付效率。

"依赖地狱"与资源隔离孱弱

在同一台物理机或虚拟机上运行多个应用时,它们可能依赖同一个库的不同版本(如 Python 2.7 与 3.8,或 glibc 版本冲突)。传统方案难以在同一 OS 实例中实现强隔离,而不同应用进程相互影响,甚至一个应用的内存泄漏会拖垮整台宿主机。

虚拟机过于"厚重"

在容器出现前,环境隔离主要靠虚拟机。虚拟机虽然隔离性好,但每个 VM 都包含完整操作系统(Guest OS),镜像动辄数 GB,启动需数十秒到几分钟,资源开销大、密度低。这对于需要快速扩缩、高密度部署的互联网业务来说,成本过高、弹性不足。

交付形态混乱,持续集成难以贯通

我们交付的是一个 jar/war、可执行脚本或源码,附带冗长的部署文档,运维需手工配置环境。这种"半成品"交付导致发布周期长、回滚困难,持续集成往往在部署环节断裂,无法真正实现 CI/CD。

Docker 是如何彻底改变这一局面的?

Docker 是一种操作系统级虚拟化技术,它通过"容器"包装应用及其全部运行时依赖(代码、运行时、系统工具、库、配置),形成轻量、不可变的"镜像"。内核通过 Linux Namespace 和 Cgroups 实现进程、网络、文件系统等资源的隔离与限制。核心优势包括:

  • 环境一致性:镜像即交付件,任何地方运行一致,彻底消灭"在我机器能跑"。

  • 轻量与高效:容器共享宿主机内核,无 Guest OS,秒级启动,单机可运行成百上千个实例,资源利用率远超虚拟机。

  • 依赖隔离与封装:每个容器拥有独立的视图,应用可以自由打包版本,互不干扰。

  • 不可变基础设施:容器运行后不可修改,更新即替换新镜像,推动声明式配置与回滚简单化。

  • 生态与标准化:镜像仓库(如 Docker Hub)、分层构建、Dockerfile 等使构建、分发、复用标准化。

主要应用场景

  • 微服务架构:每个服务独立打包、独立部署、独立扩缩,天然契合容器轻量与隔离特性。

  • 持续集成/持续交付 (CI/CD):构建产出标准化镜像,经各环境验证后直接部署,流水线真正贯通。

  • 开发与测试环境标准化:分钟级搭建与销毁多套完备环境,提升研发效能。

  • 弹性伸缩与资源优化:配合编排工具,根据负载快速对容器实例增减,提升资源利用率。

  • 混合云与多云部署:容器屏蔽底层基础设施差异,应用可在不同云之间平滑迁移。

基础概念解释

应用(Application) / 系统(System)

  • 应用 (Application):直接为最终用户解决特定业务需求的软件程序,如电商订单系统、CRM 应用。它强调的是业务功能的闭环,可独立提供价值。

  • 系统 (System) :由多个相互作用的应用、服务、数据存储与基础设施组件共同组成的更高层级解决方案。一个"电商平台系统"包含订单、支付、库存等多个应用以及它们所依赖的消息队列、数据库等,并协同完成企业级目标。系统是应用的超集,是一个有机整体。

模块(Module) / 组件(Component)

这两个术语常被混淆,在架构设计中有清晰的区分:

  • 模块 (Module) :从代码组织和功能分解的视角定义,是软件开发时的逻辑单元。它追求内聚与低耦合,通常由语言机制实现(如 Java 的 Package、Maven Module)。模块偏重编译时结构,不一定能独立部署。

  • 组件 (Component) :从系统运行时和部署的视角定义,是软件架构中可独立替换、独立部署、具有明确接口契约的单元。一个组件可由多个模块构成,并作为整体对外提供服务(如一个微服务、一个 jar 包、一套前端组件库)。组件强调运行时的可组合性与可替换性。

经验之谈:做架构时,我会先用模块规划清晰的代码边界,再根据部署粒度和团队划分定义组件,两者从不同维度保证系统的可维护性。

分布式(Distributed)

分布式系统 指的是组件位于通过网络互联的多台独立计算机上,这些计算机通过传递消息来通信和协调,共同完成一个统一的任务。其核心挑战是处理部分失效、网络延迟、数据一致性、时钟不同步等。分布式的本质是为了横向扩展容错

集群(Cluster)

集群 是由多台计算机(节点)共同协作,对外表现为一个单一系统或服务的集合。集群通常为了提高可用性 (一个节点宕机,其他接替)和扩展能力(负载分担)。集群内节点既可以是同质的(如无状态 Web 服务器集群),也可以是异构的。

关键区别:分布式强调"分工与协作",任务分解到不同节点;集群强调"统一资源池与高可用",多节点承担相同或类似角色。一个分布式系统内部可能包含多个集群。

主(Master) / 从(Slave)

一种经典的复制架构模型,用于数据副本或计算协调:

  • 主节点 (Master):负责处理所有写操作、作出决策并协调变更,然后将变更同步。

  • 从节点 (Slave) :维护主节点的数据副本,被动接收主节点的更新,通常用于分担读请求、数据冗余或备份。

    这种模型在数据库(MySQL)、消息队列(Kafka 的 partition 主从)中极为常见,可提供读写分离和故障转移能力。需要注意的是,行业中正逐步用 Primary/Replica 等更中性的词来替代,但架构内涵一致。

中间件(Middleware)

中间件是介于操作系统和业务应用之间的独立系统软件层,提供通用、可复用的服务,帮助企业级应用实现集成、通信、数据管理等功能,从而让业务开发更聚焦于核心逻辑。常见类型包括:

  • 消息中间件:RabbitMQ、Kafka(解耦、削峰)

  • 缓存中间件:Redis、Memcached(加速读写)

  • 应用服务器中间件:Tomcat、WebLogic(托管业务组件)

  • API 网关:Zuul、Kong(路由、鉴权)

    中间件是架构中解耦和标准化的关键手段。

容器(Docker)

在此语境下,Docker 特指目前最主流的容器化平台实现。它是基于 Linux 内核的 Namespace 和 Cgroups 技术,为用户空间提供独立、隔离的运行环境,将应用及其依赖打包进一个标准化镜像。容器为软件提供了一种轻量级、可移植、自包含的交付与运行形式,是云原生应用的基石。

容器编排(K8S,Kubernetes)

Kubernetes 是用于自动化容器化应用的部署、扩展和管理的开源平台。容器本身只解决单机运行问题,当需要管理成百上千个容器实例时,就需要编排系统。K8s 提供了:

  • 服务发现与负载均衡

  • 自动装箱与调度

  • 水平伸缩与自愈(自动重启、替换故障容器)

  • 密钥与配置管理

  • 声明式 API 与期望状态管理

    K8s 使得我们像操作单一资源一样管理整个数据中心,它是目前容器编排的事实标准。

评价指标分区

这些指标是架构师判断系统是否健康、评估方案可行性的核心依据。

可用性(Availability)

系统在要求的时间内,能够正常提供服务的能力。通常以系统正常运行时间占总时间的百分比来衡量:

  • 99% (两个九):年停机 3.65 天

  • 99.9% (三个九):年停机 8.76 小时

  • 99.99% (四个九):年停机 52.6 分钟

  • 99.999% (五个九):年停机 5.26 分钟,已是极高可用性等级。

    高可用需通过冗余、自动故障转移、降级等手段设计,而非仅仅依赖组件本身。

响应时长(Response Time, RT)

指客户端发送请求到完整接收响应所经过的端到端时间,包括网络传输时间、服务器排队等待时间、处理时间。关注平均值不够,必须关注百分位数

  • P95 RT:95% 的请求响应快于此值,它反映大部分用户的体验。

  • P99 RT :捕捉异常长尾,直接反映系统的稳定性边界。

    长尾延迟往往是系统瓶颈的信号,如 GC 停顿、锁竞争等。

吞吐(Throughput) vs 并发(Concurrent)

这是经常被一并提及却极易混淆的两个指标:

  • 吞吐 (Throughput) :系统在单位时间内成功处理的请求数量或数据量,如 QPS (每秒查询数)、TPS (每秒事务数)。它反映系统的实际处理能力

  • 并发 (Concurrent) :在某一时间点,系统同时承载的活动请求或用户数(并发连接数、并发用户数)。它描述的是系统承担的负载宽度

内在关系(Little's Law 视角):

吞吐 = 并发数 / 平均响应时间

  • 当并发增大,若资源充足且响应时间不变,吞吐可线性上升,直到触及资源上限。

  • 当并发超过系统承载拐点后,响应时间会因排队、上下文切换等原因急剧拉长,吞吐量可能不升反降(过载效应)。

  • 因此,架构优化常追求在给定并发下提升吞吐、降低延迟,或是在保证延迟目标前提下最大化并发支撑能力。单纯谈高并发而不关注响应时间和吞吐是没有意义的。

本期内容到这里就结束了,喜欢请点个赞谢谢

封面图自取:

相关推荐
辰风沐阳1 小时前
ThinkPHP8.1 + think-swoole 4.1 使用指南(保姆级教程)
linux·后端·swoole
星夜夏空991 小时前
FreeRTOS学习(7)——任务列表
java·前端·学习
不羁的木木1 小时前
Form Kit(卡片开发服务)学习笔记01-核心概念与架构设计
笔记·学习·harmonyos
Mikowoo0071 小时前
神经网络 替代 线性模型_进行模型学习
人工智能·神经网络·学习
不羁的木木2 小时前
ArkWeb实战学习笔记01-核心概念与架构设计
笔记·学习·harmonyos
Gopher_HBo2 小时前
接入LVS+Nginx和服务发现
后端
Ajie'Blog2 小时前
Claude 大模型深度评测:从参数架构到实战边界
大数据·人工智能·架构
SpikeKing2 小时前
LLM - 集成 Hermes Agent 与 WebUI 至同一个 Docker 镜像配置
docker·webui·vibecoding·hermes agent
萧邯嵌入式笔记2 小时前
一文吃透断言 assert
后端