☰
大白话吃透容器生态!Docker架构、镜像、容器、仓库一次讲明白
2026/10/9 10:10:40 网站建设 项目流程

大白话吃透容器生态!Docker架构、镜像、容器、仓库一次讲明白

很多人学容器,上手就敲docker run、docker pull,命令敲得很熟,但底层一问就懵。
镜像和容器到底有什么本质区别?Docker 内部是怎么工作的?镜像仓库在整套流程里扮演什么角色?容器生态除了 Docker 还有哪些组件?

如果你也卡在 “只会命令不懂原理” 这个阶段,这篇文章一次性把容器生态全景、Docker 架构、镜像 / 容器 / 仓库三大核心概念讲透。不管是自学夯实基础,还是准备云计算面试,都能直接用。

一、容器生态到底是什么?(不止 Docker 一个工具)

先纠正一个最普遍的误区:容器 ≠ Docker。
Docker 只是容器生态里面,用于镜像构建和本地容器运行的工具之一。完整的容器生态,是一套从代码打包、镜像分发、容器运行、集群编排,再到监控、日志、安全治理的完整闭环。我们可以按工作流程拆分成 5 个层级。

1. 构建层:代码打包,生成镜像

核心目标:把项目代码、程序依赖、配置文件、运行环境一起打包,做成一份可移植、环境统一的模板。

  • Docker:最主流,通过 Dockerfile 构建镜像,新手入门首选

  • Buildah:无守护进程的镜像构建工具,不需要完整 Docker 环境

  • Jib:Java 项目专用构建工具,不用依赖 Docker 环境就能打包镜像

解决痛点:本地能跑,放到服务器就各种依赖缺失,也就是经典的 “在我电脑上是好的” 问题。

2. 分发层:镜像存储与跨机器传输

镜像打包完成之后,需要一个地方存放,并且支持多台服务器拉取。这一层就是镜像仓库体系。

  • Docker Hub:官方公共镜像仓库,大量 Nginx、MySQL 等开源官方镜像

  • Harbor:企业自建私有仓库,支持权限管理、镜像漏洞扫描、审计日志

  • 云厂商镜像仓库:华为云 SWR、阿里云 ACR、腾讯云 TCR,开箱即用,不用自己维护

3. 运行层:解析镜像,启动容器进程

拿到镜像之后,服务器需要运行时组件,来读取镜像、创建隔离环境,启动业务程序。

  • Docker Engine:传统常用容器运行时

  • containerd:Kubernetes 现在默认的容器运行时,稳定性更高,轻量化

  • CRI-O:专门为 K8s 设计的极简运行时

4. 编排层:大规模容器集群管理

单台服务器上跑几个容器,用 Docker Compose 就足够。但生产环境几十上百个容器分散在多台机器,就需要编排工具来统一调度。

  • Docker Compose:单机多容器编排,开发、测试环境使用,不适合生产集群

  • Kubernetes (K8s):目前行业标准容器编排平台,负责容器调度、自愈、自动扩缩容、滚动更新

5. 观测与治理层:监控、日志、安全

容器集群跑起来之后,需要持续观测业务状态,保障安全。

  • 监控:Prometheus + Grafana,采集容器 CPU、内存、网络指标,可视化展示

  • 日志:ELK、LTS,统一收集容器日志,方便故障排查

  • 安全:镜像漏洞扫描、容器网络策略、权限最小化管控

一句话串起完整链路:开发写代码 → Docker 构建镜像 → 推送到镜像仓库 → 服务器拉取镜像,通过 containerd/Docker 启动容器 → K8s 统一编排管理 → 监控日志持续观测。

二、Docker 架构详解:C/S 客户端 - 服务端模型

很多人使用 Docker 很久,都不知道 Docker 是典型的 C/S 架构,不是一个单一程序。我们平时敲的 docker 命令,只是客户端,真正干活的是后台守护进程。

1. Docker Client 客户端

就是我们在终端输入命令的工具,docker build、docker pull、docker run都属于客户端指令。
客户端本身不会执行任何镜像构建、容器创建操作,它的工作只是把我们输入的指令,通过 API 发送给后台的 dockerd 守护进程。

2. Docker Daemon(dockerd)守护进程

Docker 的核心服务,Linux 系统后台常驻进程,是真正执行任务的主体。
它负责这些工作:

  • 镜像的构建、拉取、本地存储管理

  • 容器的创建、启动、停止、删除

  • Docker 网络、存储卷的管理

  • 监听客户端 API 请求,处理指令

客户端和守护进程默认通过本地 Unix Socket 通信,也可以配置成远程 TCP 访问,生产环境一般不开放远程端口,避免安全风险。

3. Docker Registry 镜像仓库

也就是镜像仓库,负责镜像的存储、版本管理,提供镜像的上传推送、下载拉取能力。

Docker 完整工作流程演示

举个例子,执行docker pull nginx:

  1. 终端输入命令,Docker Client 收到指令;

  2. Client 把请求发给本机 dockerd 守护进程;

  3. dockerd 连接远程 Docker Registry(Docker Hub);

  4. 仓库返回 nginx 镜像的分层数据;

  5. dockerd 下载所有镜像层,保存在本地;

  6. 下载完成后,本地就拥有 nginx 镜像,后续可以用 docker run 启动容器。

补充知识点:容器和虚拟机核心差异
虚拟机:依靠 Hypervisor 虚拟化硬件,每一台虚拟机都有独立完整操作系统内核,资源开销大,启动需要几十秒甚至分钟级。
容器:共享宿主机 Linux 内核,只通过 Namespace 隔离进程、网络、文件系统,Cgroups 限制资源占用,本质是隔离后的进程,秒级启动,资源占用极低。
容器不是精简版虚拟机,这是面试高频考点,千万不要混淆。

三、镜像 Image:静态只读模板,分层存储

镜像是容器体系最基础的概念。

镜像:打包好的、只读、不可修改的应用环境模板,里面包含应用程序、依赖库、配置文件、运行时。镜像属于静态文件,没有在运行。

镜像两大核心特性

  1. 只读不可变
    镜像构建完成之后,本身不能做任何修改。如果你需要改程序代码或者配置,只能修改 Dockerfile,重新构建生成全新镜像。

  2. 分层存储,联合文件系统 UnionFS
    Docker 镜像采用 UnionFS 联合文件系统,每一条 Dockerfile 指令,都会生成一个独立镜像层。
    举一个简单 Dockerfile 例子:

FROM centos:7 RUN yum install nginx -y COPY index.html /usr/share/nginx/html CMD ["nginx","-g","daemon off;"]

对应的分层:

  1. 基础层:FROM centos:7,CentOS 基础系统镜像层

  2. 依赖层:RUN 安装 nginx,生成新层

  3. 文件层:COPY 拷贝网页文件

  4. 启动层:CMD 定义容器启动命令

分层最大好处:缓存复用。
重新构建镜像的时候,如果某一层没有发生变化,Docker 不会重复构建、重复下载,直接复用本地缓存。大大节省构建时间,同时多个镜像可以共享相同基础层,节省服务器磁盘空间。

重点:一个镜像,可以启动成千上万个独立容器。

四、容器 Container:镜像运行出来的动态实例

镜像是静态模板(死的),容器是镜像启动之后,正在运行的隔离进程(活的)。

容器启动底层原理:
Docker 基于镜像启动容器的时候,不会修改底层只读镜像,而是在所有镜像层的最顶部,新增一层可读写容器层。

  • 下方所有镜像层:全部只读,多个容器可以共享

  • 顶层读写层:属于当前容器独有,容器内新增文件、修改配置、日志写入,全部保存在这一层

容器数据特点:

  1. 删除容器,顶层读写层所有数据会被清空;底层镜像层不受任何影响,依然保留在本地。

  2. 容器删除数据就丢失,所以业务数据不能放在容器读写层,需要使用 Volume 数据卷挂载到宿主机或者外部存储实现持久化。

容器隔离依靠 Linux 内核两大技术:

  • Namespace:隔离进程树、网络、主机名、挂载目录、用户 ID。容器内部进程看到的世界,是独立隔离的,感知不到宿主机其他进程。

  • Cgroups:限制容器可以使用的 CPU、内存、磁盘 IO,防止单个容器耗尽服务器全部资源。

五、仓库 Registry:镜像的存储分发平台

镜像仓库就是存放镜像的地方,用来解决镜像跨服务器分发、版本管理的问题。
分为公共仓库和私有仓库两类。

公共仓库 Docker Hub

Docker 官方公共仓库,大量开源软件官方镜像,学习测试场景非常方便。缺点是生产环境上传内部业务代码不安全,网络拉取速度不稳定。

私有仓库(企业生产首选)

  1. Harbor:企业最常用自建私有镜像仓库,支持用户权限、镜像漏洞扫描、日志审计、镜像复制,功能齐全。

  2. 云厂商托管仓库:华为云 SWR、阿里云 ACR 等,云原生环境推荐,不用自己维护 Harbor 服务,开箱即用。

仓库两个关键概念:Repository 和 Tag

  • Repository(仓库):一类镜像的集合,比如 nginx、mysql,同一个仓库下存放不同版本镜像。

  • Tag(标签):用来标记镜像版本,例如 nginx:1.24,latest 是默认标签。标签只是别名,镜像真正唯一标识是 SHA256 哈希值。

完整镜像流转(企业 CI/CD 流程):
开发本地代码 → Docker build 构建镜像 → 打版本 tag → docker push 推送到私有 Harbor/SWR 仓库 → 生产服务器 docker pull 拉取镜像 → docker run 启动容器。

六、镜像、容器、仓库三者关系总结

用通俗类比,方便记忆,面试可以直接描述:

  • 镜像 = 软件安装包,静态、只读,是运行程序的模板;

  • 容器 = 安装包运行起来之后的软件进程,动态实例,独立隔离;

  • 仓库 = 应用商店,统一存放各个版本安装包,支持下载上传。

一句话标准答案:镜像是静态模板,容器是镜像的运行实例,仓库是镜像存储分发平台。一个镜像可以启动多个容器,镜像通过仓库完成跨环境分发。

七、新手高频误区整理

❌ 误区 1:容器里面修改文件,可以保存到镜像。
✅ 纠正:容器修改只存在顶层读写层,容器销毁就丢失。要保存改动,只能 commit 提交成新镜像,推荐使用 Dockerfile 构建。

❌ 误区 2:删除容器,对应的镜像也会被删除。
✅ 纠正:删除容器只会销毁容器读写层,镜像文件保留在本地,需要手动 docker rmi 删除镜像。

❌ 误区 3:容器拥有独立操作系统内核。
✅ 纠正:容器共享宿主机 Linux 内核,只有虚拟机才有独立内核。Windows 宿主机运行 Linux 容器需要额外虚拟化支持。

❌ 误区 4:分层越多,镜像体积一定越大。
✅ 纠正:合理分层可以利用缓存;错误写法(比如一条 Dockerfile 多次 RUN)会增加镜像层数,清理不掉临时文件才会导致镜像臃肿。

八、最后

容器是云原生整套体系的地基,K8s、微服务、CI/CD 流水线全部基于容器构建。很多人急于上手 K8s,却忽略镜像、容器这些底层基础,最后遇到问题很难定位根因。

掌握容器生态全貌、Docker C/S 架构,吃透镜像分层、容器读写层原理,分清镜像 / 容器 / 仓库三者区别,才算真正入门容器。后续学习 Kubernetes 的时候,理解难度会大幅降低。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询