聊一聊容器3件套:镜像、容器、仓库

522 阅读4分钟

阅读收获:
看完这篇文章,你将彻底搞清楚 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 实际做了几件事:

  1. 查找本地是否已有 nginx 镜像;
  2. 没有则去远程仓库拉取;
  3. 用该镜像创建容器;
  4. 启动容器进程。

此时容器是运行中的一组“隔离环境 + 文件视图”。


四、镜像与容器的关系:一套图帮你理清

比喻镜像容器
类比编程语言类(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 到某节点时,会自动尝试:

  1. 查找本地是否有该镜像;
  2. 没有则去镜像仓库拉取;
  3. 拉取完成后启动容器。

六、常见误区与澄清

❌ 镜像修改后容器会同步更新?

✅ 错!镜像是不可变的,容器运行后与镜像“脱钩”,要更新必须重新创建容器。

❌ 镜像构建慢是因为命令多?

✅ 不完全正确。其实缓存机制和层顺序对构建速度影响更大。常见优化是把不变部分(如 pip install)放前面。

❌ Kubernetes 可以直接管理镜像?

✅ 不对,K8s 不管理镜像,它只是告诉 kubelet 去哪个仓库拉哪个镜像,镜像拉取和缓存由容器运行时负责。


七、从 Docker 到 Kubernetes:三件套在 K8s 中的延续

Docker 概念K8s 中的表现
镜像Pod 定义中的 image 字段
容器Pod 中的每个 container
仓库自动拉取的镜像来源

此外,K8s 还支持:

  • 镜像拉取策略(Always, IfNotPresent)
  • 镜像凭证 Secret(用于访问私有仓库)
  • 多容器协同(initContainers, sidecar)

八、总结

核心组件定义类比
镜像应用的完整打包蓝图菜谱、类、模具
容器镜像的运行实例做出来的菜、对象
仓库镜像存储与分发中心图书馆、Git 仓库

理解这三者关系,就能真正理解 Docker 如何高效构建应用,Kubernetes 如何高效调度容器,是所有后续进阶内容的前置基础。