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