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 应用 为例:
bash
# 1. 镜像:获取应用模板
docker pull wordpress:latest
docker pull mysql:8.0
# 2. 卷:创建持久化存储
docker volume create wp_data # 存储WordPress文件
docker volume create db_data # 存储MySQL数据
# 3. 容器:启动服务
# MySQL容器(挂载数据卷)
docker run -d --name db \
-v db_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
mysql:8.0
# WordPress容器(挂载代码卷 + 连接数据库)
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 |
一句话总结 :
镜像是"蓝图" (定义应用结构),容器是"车间" (临时运行应用),卷是"仓库" (永久存放数据)。三者协作实现 不可变基础设施 + 数据持久化 的完整架构。