镜像与容器概念
镜像和容器是 Docker 的核心概念,下面梳理其关系与特性。
镜像(Image)
什么是镜像
镜像是容器的只读模板,包含运行应用所需的代码、运行时、库、环境变量和配置文件。
分层架构
镜像由多个层(Layer)组成,采用 UnionFS 联合文件系统:
Bash
镜像 = Layer1 (基础系统层) + Layer2 (运行时层) + Layer3 (应用层)
↓ ↓ ↓
Ubuntu 22.04 + JDK 17 + App.jar
- 每一层对应 Dockerfile 中的一条指令
- 层是只读的,构建后不可修改
- 相同层在多个镜像间共享,节省存储
查看镜像层
Bash
# 查看镜像历史层
docker history nginx:latest
# 输出示例
IMAGE CREATED CREATED BY SIZE
605c77e624dd 2 weeks ago CMD ["nginx" "-g" "daemon off;"] 0B
<missing> 2 weeks ago EXPOSE map[80/tcp:{}] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) COPY file: 1.2kB
容器(Container)
什么是容器
容器是镜像的运行实例,包含一个可写的容器层:
text
容器 = 镜像层 (只读) + 容器层 (可读写)
镜像与容器关系
| 维度 | 镜像 | 容器 |
|---|---|---|
| 状态 | 静态模板 | 运行实例 |
| 读写 | 只读 | 可读写的顶层 |
| 生命周期 | 长期存在 | 可创建/启动/停止/删除 |
| 类比 | 类 (Class) | 对象 (Instance) |
| 数量 | 1 个镜像 | 可创建 N 个容器 |
容器可写层
容器启动时,Docker 在镜像层之上创建一个薄的可写层:
text
容器层 (可读写) ← 容器运行时写入
↓
镜像层3 (只读)
↓
镜像层2 (只读)
↓
镜像层1 (只读)
- 容器内修改文件实际写入容器层
- 删除容器后,容器层数据丢失(除非使用 Volume)
- 多个容器共享同一镜像层,互不影响
查看镜像与容器
text
# 列出本地镜像
docker images
# 查看镜像详情
docker inspect nginx:latest
# 列出运行中的容器
docker ps
# 列出所有容器(包括停止的)
docker ps -a
# 查看容器文件系统变更
docker diff <container_id>
要点总结
- 镜像是只读模板,由多个层叠加而成,层间共享节省存储
- 容器是镜像的运行实例,顶部增加可写层
- 镜像与容器关系类似类与对象:1 个镜像可创建多个容器
- 容器内修改的数据存储在容器层,删除容器后丢失
- 持久化数据需使用 Volume 或 Bind Mount
📝 发现内容有误?点击此处直接编辑