阅读收获:
看完这篇文章,你将彻底搞清楚 Docker 的三大核心概念 —— 镜像、容器、仓库,掌握它们之间的关系和工作原理,并理解 Kubernetes 是如何在背后用这些概念构建一个强大的调度系统。这是你深入 Kubernetes 之路的第二块基石!
一、Docker 三件套,常见但常混
如果你刚开始接触 Docker 或 Kubernetes,一定听过这三大术语:
- 镜像(Image)
- 容器(Container)
- 仓库(Registry)
它们就像“代码-编译-部署”流程中的“源码、可执行程序和版本管理系统”,但很多人却始终搞不清:
- 镜像是怎么构建出来的?
- 容器和镜像到底有什么区别?
- 镜像仓库和 Git 有什么关系?
- Kubernetes 部署 Pod 时,拉的镜像在哪?
如果这些问题你也曾困惑过,继续读下去,你会有系统性的答案。
二、镜像(Image):容器的“蓝图”
Docker 镜像是一个只读的打包文件,它包含了运行一个容器所需的所有文件、依赖和元数据。
你可以把它类比为:
镜像 = 模型蓝图 + 材料清单 + 施工说明书
2.1 镜像是分层结构
Docker 镜像是由一层层的文件系统构建而成的(基于 UnionFS):
- 每一层通常对应一个 Dockerfile 的指令(如 RUN, COPY 等);
- 层与层之间是增量的、只读的;
- 底层通常是一个 OS 基础镜像(如 alpine、ubuntu)。
示例(简化):
FROM python:3.9
COPY . /app
RUN pip install -r requirements.txt
CMD ["python", "main.py"]
每条指令构成一层,多个层叠加形成最终镜像。
三、容器(Container):镜像的“活体运行实例”
容器可以理解为是镜像的可运行实例,它拥有自己的进程空间、网络空间,但共享主机内核。
容器 = 镜像 + 文件系统 + 运行态(PID、网络等)
3.1 容器的生命周期:
graph TD
拉取镜像 --> 创建容器 --> 启动容器 --> 停止容器 --> 删除容器
当你执行:
docker run nginx
Docker 实际做了几件事:
- 查找本地是否已有 nginx 镜像;
- 没有则去远程仓库拉取;
- 用该镜像创建容器;
- 启动容器进程。
此时容器是运行中的一组“隔离环境 + 文件视图”。
四、镜像与容器的关系:一套图帮你理清
| 比喻 | 镜像 | 容器 |
|---|---|---|
| 类比编程语言 | 类(Class) | 对象(Instance) |
| 类比产品制造流程 | 模具 | 成品 |
| 类比厨艺 | 菜谱 | 做出来的菜 |
| 是否可修改 | 不可变(只读) | 可变(有运行态和写层) |
容器是镜像“+”运行状态的集合,因此可以有多个容器基于同一个镜像运行,但每个容器运行的进程和配置是独立的。
五、仓库(Registry):镜像的“图书馆”
仓库用于存储和分发镜像,最常用的是:
- 公共仓库:Docker Hub、GitHub Container Registry、Google GCR、阿里云 ACR 等;
- 私有仓库:Harbor、Artifactory、Nexus。
5.1 镜像命名规范
一个完整镜像地址一般是这样的:
[仓库地址]/[命名空间]/[镜像名]:[标签]
示例:
registry.cn-hangzhou.aliyuncs.com/myteam/nginx:1.23
如果省略仓库地址,默认从 Docker Hub 拉取。
5.2 Kubernetes 是如何用到镜像仓库的?
K8s 中定义 Pod 时,会使用容器镜像:
spec:
containers:
- name: web
image: nginx:1.23
当 kubelet 调度该 Pod 到某节点时,会自动尝试:
- 查找本地是否有该镜像;
- 没有则去镜像仓库拉取;
- 拉取完成后启动容器。
六、常见误区与澄清
❌ 镜像修改后容器会同步更新?
✅ 错!镜像是不可变的,容器运行后与镜像“脱钩”,要更新必须重新创建容器。
❌ 镜像构建慢是因为命令多?
✅ 不完全正确。其实缓存机制和层顺序对构建速度影响更大。常见优化是把不变部分(如 pip install)放前面。
❌ Kubernetes 可以直接管理镜像?
✅ 不对,K8s 不管理镜像,它只是告诉 kubelet 去哪个仓库拉哪个镜像,镜像拉取和缓存由容器运行时负责。
七、从 Docker 到 Kubernetes:三件套在 K8s 中的延续
| Docker 概念 | K8s 中的表现 |
|---|---|
| 镜像 | Pod 定义中的 image 字段 |
| 容器 | Pod 中的每个 container |
| 仓库 | 自动拉取的镜像来源 |
此外,K8s 还支持:
- 镜像拉取策略(Always, IfNotPresent)
- 镜像凭证 Secret(用于访问私有仓库)
- 多容器协同(initContainers, sidecar)
八、总结
| 核心组件 | 定义 | 类比 |
|---|---|---|
| 镜像 | 应用的完整打包蓝图 | 菜谱、类、模具 |
| 容器 | 镜像的运行实例 | 做出来的菜、对象 |
| 仓库 | 镜像存储与分发中心 | 图书馆、Git 仓库 |
理解这三者关系,就能真正理解 Docker 如何高效构建应用,Kubernetes 如何高效调度容器,是所有后续进阶内容的前置基础。