Docker 镜像核心解析:以 Nginx 为例
很多刚接触 Docker 的朋友容易混淆'镜像'和'容器'。为什么运行容器前必须先拉取镜像?两者到底是什么关系?修改容器后如何保存为新镜像?本文通过 Nginx 实战,拆解镜像的本质与底层逻辑。
一、镜像是什么?
1. 通俗理解
如果把软件比作一个程序包,那么:
- 镜像(Image):相当于安装包(如 .exe/.dmg)。它包含了运行应用所需的所有文件——代码、运行时环境、依赖库、配置等。它是只读的静态集合。
- 容器(Container):相当于安装后的进程。基于镜像启动的可运行实例,是动态的、可读可写的环境。
举个例子:nginx 镜像包含 Nginx 服务器的所有组件,是一个静态包;而基于该镜像运行的容器,就是实际处理 HTTP 请求的 Nginx 进程。你可以修改容器内的配置,但这不会改变原始镜像。
2. 官方定义
Docker 镜像是由多个**只读层(Layer)**叠加而成的轻量级、可移植、自包含的软件打包格式。它能在任何支持 Docker 的环境中创建容器。
3. 核心特性
| 特性 | 解读 | 实操意义 |
|---|---|---|
| 只读性 | 构建完成后,所有层均为只读,不可修改 | 保证一致性,同一镜像在任何环境初始状态相同 |
| 分层存储 | 由基础层、依赖层、应用层等多个只读层组成 | 拉取时仅下载缺失层,节省资源(如多镜像共享 Ubuntu 基础层) |
| 可移植性 | 可在 Linux/Mac/Windows 间无缝迁移 | 实现'一次打包,到处运行',解决环境不一致问题 |
| 轻量级 | 基于宿主机内核,无需完整操作系统 | 体积远小于虚拟机(如 nginx 镜像约 200MB) |
二、镜像与容器的关联逻辑
新手最关心的问题是:镜像和容器到底怎么关联?从底层原理到实操流程,我们一步步看。
1. 底层原理:只读层 + 可写层
Docker 的架构本质是'层的叠加'。

- 镜像:由 1~N 个只读层组成,叠加后构成应用运行的基础环境。
- 容器:在镜像的只读层之上,新增一个可写层(容器层)。所有对容器的修改(如改配置、加文件)都发生在这个可写层,不会影响底层镜像。
关键结论:
- 销毁容器后,可写层被删除,只读的镜像层依然保留。
- 多个容器可基于同一个镜像创建,共享所有只读层,仅拥有各自的可写层,极大节省资源。


