Docker 镜像与容器的区别与联系
🐳 Docker 镜像与容器的区别与联系
“镜像是什么?容器又是什么?两者有什么关系?”
这是几乎每个学习 Docker 的人都会遇到的问题。
本文将用最直观的方式,帮你彻底搞清楚 镜像(Image) 与 容器(Container) 的关系。
🧠 一、先来一个比喻
你可以把 镜像 看成是一个 “程序模板”,
而 容器 就是这个模板“运行后”的实例。
就像:
| 类比对象 | Docker 对应概念 | 说明 |
|---|---|---|
| 类(class) | 镜像(Image) | 定义了对象的结构和行为 |
| 对象(object) | 容器(Container) | 由类实例化出来,独立运行 |
| 蓝图 | 镜像 | 只读的定义文件 |
| 房子 | 容器 | 根据蓝图建造出的实际可用空间 |
🧩 结论:
镜像是静态的模板,容器是运行中的实体。
🧱 二、Docker 镜像(Image)是什么?
镜像 是一个只读的、分层的文件系统。
它包含:
- 操作系统环境(如 Ubuntu、Alpine)
- 应用程序(如 Nginx、Python)
- 应用配置(环境变量、依赖等)
你可以理解为:
镜像 = “应用 + 运行环境 + 系统依赖”的打包文件。
🧩 镜像的特点
| 特性 | 说明 |
|---|---|
| 只读 | 镜像内容不可更改 |
| 分层结构 | 由多个只读层叠加组成(UnionFS) |
| 可复用 | 多个镜像可共享相同的底层层 |
| 可移植 | 一次构建,到处运行 |
示例
docker pull nginx:latest # 拉取镜像
docker images # 查看本地镜像
输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 weeks ago 142MB
📦 三、Docker 容器(Container)是什么?
容器是 镜像的运行实例。
当你运行一个镜像时,Docker 会:
- 从镜像创建一个可写层;
- 分配网络、挂载卷;
- 启动应用进程。
从此,容器就像一个独立的运行环境,拥有自己的文件系统、进程空间、网络接口。
容器的特点
| 特性 | 说明 |
|---|---|
| 轻量 | 共用宿主机内核,不需要完整系统 |
| 隔离 | 文件系统、网络、进程互不干扰 |
| 临时性 | 删除容器不会影响镜像内容 |
| 可复制 | 可快速创建多个相同实例 |
🔄 四、镜像与容器的关系图
+-----------------------------+
| Docker 镜像 |
| 代码 + 依赖 + 配置 + 系统 |
+-----------------------------+
│
│ docker run
▼
+-----------------------------+
| Docker 容器 |
| 镜像的运行实例(带可写层) |
+-----------------------------+
一个镜像可以创建多个容器:
docker run -d -p 8080:80 --name web1 nginx
docker run -d -p 8081:80 --name web2 nginx
这两个容器都基于同一个 nginx 镜像运行,但互不影响。
⚙️ 五、操作对比示例
| 操作 | 镜像相关命令 | 容器相关命令 |
|---|---|---|
| 查看列表 | docker images | docker ps -a |
| 拉取 | docker pull | (无) |
| 删除 | docker rmi | docker rm |
| 构建 | docker build | (无) |
| 创建 | (无) | docker create |
| 运行 | (无) | docker run |
| 导出 | docker save | docker export |
| 导入 | docker load | docker import |
🔍 六、文件层结构区别
🧩 镜像层结构(只读)
Layer 1: Ubuntu 基础系统
Layer 2: 安装 Nginx
Layer 3: 拷贝配置文件
-----------------------
Final Image = 只读层叠加结果
🧱 容器层结构(读写)
Read-only Layers (来自镜像)
Writable Layer (容器运行时产生)
-----------------------
容器运行时的文件修改都写入可写层
当容器删除时,可写层也会被清空,镜像层保持不变。
🧩 七、镜像与容器的常见问题
❓Q1:删除容器会影响镜像吗?
不会。
容器只是基于镜像的一个实例,删除容器不会影响镜像本身。
❓Q2:修改了容器内部文件,镜像会变化吗?
不会。
容器的修改只存在于“可写层”中,镜像层仍然保持只读。
如果你想保留修改结果,可以执行:
docker commit 容器名 新镜像名:tag
❓Q3:可以从一个容器创建多个镜像吗?
可以。
容器可以被多次 commit 成不同镜像版本,用于备份或打包分发。
🧭 八、总结对比表
| 对比项 | 镜像(Image) | 容器(Container) |
|---|---|---|
| 定义 | 应用及环境的模板 | 镜像的运行实例 |
| 状态 | 静态 | 动态 |
| 层类型 | 只读层 | 可读写层 |
| 数量关系 | 一个镜像可生成多个容器 | 基于镜像运行 |
| 修改后影响 | 不会变化 | 可临时修改 |
| 删除影响 | 删除镜像会导致无法新建容器 | 删除容器不影响镜像 |
| 创建方式 | docker build 或 docker pull | docker run |
🏁 九、一句话总结
镜像是“模板”,容器是“实例”;镜像是静态的,容器是动态的。
Docker 世界里的一切运行,都是从镜像开始,以容器为载体。
📚 延伸阅读
若有转载,请标明出处:https://blog.youkuaiyun.com/CharlesYuangc/article/details/154156770
439

被折叠的 条评论
为什么被折叠?



