Docker的容器Container、镜像Image和卷Volume对比
在 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 |
一句话总结:
镜像是“蓝图”(定义应用结构),容器是“车间”(临时运行应用),卷是“仓库”(永久存放数据)。三者协作实现 不可变基础设施 + 数据持久化 的完整架构。