Skip to content

Docker基础架构与原理概览 ​

这篇文档不讲具体部署步骤,重点是先把 Docker 的底层认知搭起来。理解这些概念后,再看安装、运行、Compose、K8s 会顺很多。

1. Docker 到底解决什么问题 ​

Docker 本质上解决的是三个老问题:

  1. 环境不一致 开发机能跑,测试机不能跑,生产机更不一定能跑。
  2. 部署方式不统一 .NET、Java、Python、Node 各有各的部署套路,运维成本高。
  3. 应用隔离不够 多个项目装在一台机器上,端口、依赖、运行时版本经常互相打架。

Docker 的思路很直接:

把应用及其依赖打成镜像,再由容器统一运行。

这样以后部署时,更多是在“搬镜像”和“起容器”,而不是重新配环境。


2. 容器和虚拟机有什么区别 ​

最容易混淆的点,是把容器理解成“轻量虚拟机”。这个理解不算全错,但不够准确。

2.1 虚拟机 ​

虚拟机是在宿主机之上再虚拟出一套完整硬件,然后运行一个完整的 Guest OS。

特点:

  • 隔离性更强
  • 资源开销更大
  • 启动更慢

2.2 容器 ​

容器不是重新虚拟一套完整操作系统,而是共享宿主机内核,在用户态做隔离。

特点:

  • 更轻量
  • 启动更快
  • 同一台机器上能跑更多实例

2.3 一句话对比 ​

维度虚拟机容器
隔离级别强较强,但低于虚拟机
资源开销高低
启动速度慢快
适用场景强隔离、完整 OS 场景应用打包、部署、弹性扩缩

3. Docker 的典型架构 ​

一个完整的 Docker 运行体系,通常包含三部分:

  1. Docker Client 你在命令行输入的 docker build、docker run、docker ps,本质上都是客户端请求。
  2. Docker Host / Docker Engine 真正负责构建镜像、启动容器、管理网络和存储的是 Docker Engine。
  3. Docker Registry 镜像仓库。可以是官方的 Docker Hub,也可以是 Harbor、阿里云镜像仓库等私有仓库。

可以把它理解成:

客户端发命令,宿主机上的 Docker Engine 执行,镜像从 Registry 拉或往 Registry 推。


4. 容器的几个核心能力 ​

4.1 Namespace:隔离 ​

容器本质上还是进程。容器之间之所以“像互相看不见”,靠的是 Linux Namespace。

常见隔离维度包括:

  • PID:进程空间
  • NET:网络空间
  • MNT:挂载点
  • IPC:进程间通信
  • UTS:主机名

它解决的是:

为什么容器里的进程、网络、文件系统视角看起来像“独立的一台小机器”。

4.2 Cgroups:资源限制 ​

如果只有隔离,没有约束,某个容器就可能把宿主机 CPU、内存吃光。

Cgroups 负责限制:

  • CPU
  • 内存
  • I/O
  • 网络等资源的使用上限

它解决的是:

容器能跑,但不能无上限乱吃资源。

4.3 Union File System:镜像分层 ​

Docker 镜像不是一个平铺的整体包,而是按层组织的。

例如:

  • 基础镜像层:ubuntu / debian / alpine
  • 运行时层:JDK、.NET Runtime、Node
  • 应用层:你自己的发布文件

这样做的好处:

  • 多个镜像可以复用底层层
  • 传输更省
  • 构建更快

5. 镜像、容器、仓库三者关系 ​

这是 Docker 入门最基础的一组概念。

5.1 镜像(Image) ​

镜像是一个只读模板,用来定义应用运行环境。

可以把它理解成:

“应用运行所需文件系统和依赖的打包结果”

5.2 容器(Container) ​

容器是镜像运行起来后的实例。

同一个镜像可以启动多个容器。

5.3 仓库(Repository / Registry) ​

仓库是镜像存放的地方。

  • 公共仓库:Docker Hub
  • 私有仓库:Harbor、云厂商镜像仓库

5.4 最容易记住的一句话 ​

从仓库拉镜像,用镜像起容器,再把更新后的镜像推回仓库。


6. Docker 为什么适合现代部署 ​

容器技术对运维和交付最大的价值,不是“很新”,而是标准化。

6.1 标准化打包 ​

不再区分“Java 的发布包长什么样、.NET 的发布包长什么样”,最终统一成镜像。

6.2 标准化运行 ​

不再要求每台机器都手装一堆依赖,只要求这台机器有 Docker 运行时。

6.3 标准化编排 ​

单机上可以用 Docker Compose,多机或生产级集群可以用 Kubernetes。

这也是为什么:

  • 学会 Docker 后,再看 K8s 更自然
  • 不同技术栈的项目,最终都能往一套运维体系上收口

7. Docker Compose 在这套体系里的位置 ​

Docker 更适合单容器操作,而 Docker Compose 是对多容器场景的补充。

例如一个完整应用往往包括:

  • app
  • mysql
  • redis
  • nginx

如果每次都手写 docker run,很快就会乱。

Compose 的作用就是把这些服务关系写进一个 docker-compose.yml 中,之后通过:

bash
docker compose up -d

一次起整套环境。

它更适合:

  • 本地开发
  • 单机部署
  • 测试环境
  • 小型服务编排

8. 这篇原理文档该和哪些文档配合看 ​

如果你现在的目标是“真正把 Docker 用起来”,建议按这个顺序往下看:

  1. Docker零基础入门教程 先建立最小使用闭环
  2. Docker运行容器镜像指令 记住高频命令
  3. Docker运行环境配置指南 处理宿主机安装、镜像加速、Daemon 配置
  4. Docker容器化部署实战 看一个完整的项目部署链路

9. 一句话总结 ​

Docker 不是“另一个虚拟机”,而是一套基于 Linux 隔离与资源控制机制的应用标准化打包和运行方案。理解了镜像、容器、仓库、Namespace、Cgroups 这几个关键词,后面的安装、部署和排障就都有了抓手。

方舟 · Ark