Appearance
Docker基础架构与原理概览
这篇文档不讲具体部署步骤,重点是先把 Docker 的底层认知搭起来。理解这些概念后,再看安装、运行、Compose、K8s 会顺很多。
1. Docker 到底解决什么问题
Docker 本质上解决的是三个老问题:
- 环境不一致 开发机能跑,测试机不能跑,生产机更不一定能跑。
- 部署方式不统一 .NET、Java、Python、Node 各有各的部署套路,运维成本高。
- 应用隔离不够 多个项目装在一台机器上,端口、依赖、运行时版本经常互相打架。
Docker 的思路很直接:
把应用及其依赖打成镜像,再由容器统一运行。
这样以后部署时,更多是在“搬镜像”和“起容器”,而不是重新配环境。
2. 容器和虚拟机有什么区别
最容易混淆的点,是把容器理解成“轻量虚拟机”。这个理解不算全错,但不够准确。
2.1 虚拟机
虚拟机是在宿主机之上再虚拟出一套完整硬件,然后运行一个完整的 Guest OS。
特点:
- 隔离性更强
- 资源开销更大
- 启动更慢
2.2 容器
容器不是重新虚拟一套完整操作系统,而是共享宿主机内核,在用户态做隔离。
特点:
- 更轻量
- 启动更快
- 同一台机器上能跑更多实例
2.3 一句话对比
| 维度 | 虚拟机 | 容器 |
|---|---|---|
| 隔离级别 | 强 | 较强,但低于虚拟机 |
| 资源开销 | 高 | 低 |
| 启动速度 | 慢 | 快 |
| 适用场景 | 强隔离、完整 OS 场景 | 应用打包、部署、弹性扩缩 |
3. Docker 的典型架构
一个完整的 Docker 运行体系,通常包含三部分:
- Docker Client 你在命令行输入的
docker build、docker run、docker ps,本质上都是客户端请求。 - Docker Host / Docker Engine 真正负责构建镜像、启动容器、管理网络和存储的是 Docker Engine。
- 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 是对多容器场景的补充。
例如一个完整应用往往包括:
appmysqlredisnginx
如果每次都手写 docker run,很快就会乱。
Compose 的作用就是把这些服务关系写进一个 docker-compose.yml 中,之后通过:
bash
docker compose up -d一次起整套环境。
它更适合:
- 本地开发
- 单机部署
- 测试环境
- 小型服务编排
8. 这篇原理文档该和哪些文档配合看
如果你现在的目标是“真正把 Docker 用起来”,建议按这个顺序往下看:
- Docker零基础入门教程 先建立最小使用闭环
- Docker运行容器镜像指令 记住高频命令
- Docker运行环境配置指南 处理宿主机安装、镜像加速、Daemon 配置
- Docker容器化部署实战 看一个完整的项目部署链路
9. 一句话总结
Docker 不是“另一个虚拟机”,而是一套基于 Linux 隔离与资源控制机制的应用标准化打包和运行方案。理解了镜像、容器、仓库、Namespace、Cgroups 这几个关键词,后面的安装、部署和排障就都有了抓手。
