Docker的容器Container、镜像Image和卷Volume对比
- 一、核心定义与角色
- 二、关键特性对比
- 1. 数据存储与持久性
- 2. 管理与操作
- 3. 技术原理
- 三、典型使用场景
- 四、协作关系示例
- 五、常见误区
- 六、总结:核心差异表
在 Docker 生态中,容器(Container)、镜像(Image) 和 卷(Volume) 是三大核心组件,它们协同工作但职责截然不同。以下是系统化对比:
一、核心定义与角色
组件 | 本质 | 角色 | 生命周期 |
---|
镜像 | 只读模板 | 应用的静态打包(如代码、依赖、配置) | 持久存在 |
容器 | 运行时实例 | 镜像的动态执行环境(隔离的进程) | 临时性(停止即销毁) |
卷 | 持久化存储单元 | 独立的数据存储空间(绕过容器生命周期) | 永久存在 |
二、关键特性对比
1. 数据存储与持久性
特性 | 镜像 | 容器 | 卷 |
---|
存储内容 | 代码、依赖、系统文件(只读) | 运行时状态、临时文件(可写) | 数据库、日志、用户文件(可读写) |
数据持久化 | ✅ 永久存在(除非手动删除) | ❌ 删除容器即丢失 | ✅ 独立存在(删除容器仍保留) |
修改影响 | 不可变(需重新构建镜像) | 修改仅限当前容器生命周期 | 修改直接持久化到主机 |
2. 管理与操作
操作 | 镜像 | 容器 | 卷 |
---|
创建 | docker build / docker pull | docker run / docker create | docker volume create |
查看 | docker images | docker ps / docker ps -a | docker volume ls |
删除 | docker rmi | docker rm | docker volume rm |
共享性 | ✅ 可分发(推送到仓库) | ❌ 无法直接共享 | ✅ 多容器可挂载同一卷 |
3. 技术原理
特性 | 镜像 | 容器 | 卷 |
---|
存储位置 | Docker 本地仓库(如 /var/lib/docker/image ) | 容器层(UnionFS 可写层) | 主机目录(如 /var/lib/docker/volumes ) |
性能 | 高效(分层复用) | 中等(写操作需通过 UnionFS) | 最高(直接读写主机文件系统) |
依赖关系 | 容器依赖镜像运行 | 卷可独立于镜像/容器存在 | 镜像无需感知卷的存在 |
三、典型使用场景
场景 | 镜像 | 容器 | 卷 |
---|
部署应用 | nginx:latest | docker run -d nginx | ❌ 无需卷(静态文件在镜像内) |
运行数据库 | mysql:8.0 | docker run -d mysql | ✅ 挂载卷:-v mysql_data:/var/lib/mysql |
开发环境 | node:18 | docker run -it node bash | ✅ 挂载代码目录:-v $(pwd):/app |
日志收集 | fluentd | docker run -d fluentd | ✅ 挂载日志卷:-v logs:/fluentd/log |
四、协作关系示例
以 运行一个 WordPress 应用 为例:
docker pull wordpress:latest
docker pull mysql:8.0
docker volume create wp_data
docker volume create db_data
docker run -d --name db \-v db_data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=secret \mysql:8.0
docker run -d --name wp \-v wp_data:/var/www/html \--link db:mysql \-p 8080:80 \wordpress:latest
协作流程:
- 镜像:提供 WordPress 和 MySQL 的静态模板。
- 容器:启动两个隔离的运行环境(WordPress + MySQL)。
- 卷:
wp_data
持久化 WordPress 文件(如主题、插件)。db_data
持久化 MySQL 数据库(即使容器重建,数据不丢失)。
五、常见误区
误区 | 真相 |
---|
容器内修改会保存到镜像 | 镜像是只读的!容器修改仅存在可写层,删除容器即丢失。 |
删除镜像会删除相关容器 | 容器依赖镜像,但删除镜像不影响已运行的容器(除非强制删除)。 |
卷会随容器自动删除 | 卷需手动删除(docker volume rm ),否则会持续占用磁盘空间。 |
所有数据都应存在卷中 | 临时数据(如缓存)可直接存在容器内,避免卷的额外开销。 |
六、总结:核心差异表
维度 | 镜像 | 容器 | 卷 |
---|
本质 | 静态模板 | 动态实例 | 持久化存储 |
可写性 | ❌ 只读 | ✅ 可写(临时) | ✅ 可写(永久) |
生命周期 | 永久(手动删除) | 临时(停止即销毁) | 永久(手动删除) |
共享性 | ✅ 可分发(仓库) | ❌ 不共享 | ✅ 多容器共享 |
典型命令 | docker build/pull/rmi | docker run/ps/rm | docker volume create/ls/rm |
一句话总结:
镜像是“蓝图”(定义应用结构),容器是“车间”(临时运行应用),卷是“仓库”(永久存放数据)。三者协作实现 不可变基础设施 + 数据持久化 的完整架构。