在 Docker 生态中,容器(Container)镜像(Image)卷(Volume) 是三大核心组件,它们协同工作但职责截然不同。以下是系统化对比:


一、核心定义与角色

组件本质角色生命周期
镜像只读模板应用的静态打包(如代码、依赖、配置)持久存在
容器运行时实例镜像的动态执行环境(隔离的进程)临时性(停止即销毁)
持久化存储单元独立的数据存储空间(绕过容器生命周期)永久存在

二、关键特性对比

1. 数据存储与持久性
特性镜像容器
存储内容代码、依赖、系统文件(只读运行时状态、临时文件(可写数据库、日志、用户文件(可读写
数据持久化✅ 永久存在(除非手动删除)❌ 删除容器即丢失✅ 独立存在(删除容器仍保留)
修改影响不可变(需重新构建镜像)修改仅限当前容器生命周期修改直接持久化到主机
2. 管理与操作
操作镜像容器
创建docker build / docker pulldocker run / docker createdocker volume create
查看docker imagesdocker ps / docker ps -adocker volume ls
删除docker rmidocker rmdocker volume rm
共享性✅ 可分发(推送到仓库)❌ 无法直接共享✅ 多容器可挂载同一卷
3. 技术原理
特性镜像容器
存储位置Docker 本地仓库(如 /var/lib/docker/image容器层(UnionFS 可写层)主机目录(如 /var/lib/docker/volumes
性能高效(分层复用)中等(写操作需通过 UnionFS)最高(直接读写主机文件系统)
依赖关系容器依赖镜像运行卷可独立于镜像/容器存在镜像无需感知卷的存在

三、典型使用场景

场景镜像容器
部署应用nginx:latestdocker run -d nginx❌ 无需卷(静态文件在镜像内)
运行数据库mysql:8.0docker run -d mysql✅ 挂载卷:-v mysql_data:/var/lib/mysql
开发环境node:18docker run -it node bash✅ 挂载代码目录:-v $(pwd):/app
日志收集fluentddocker run -d fluentd✅ 挂载日志卷:-v logs:/fluentd/log

四、协作关系示例

运行一个 WordPress 应用 为例:

# 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

协作流程

  1. 镜像:提供 WordPress 和 MySQL 的静态模板。
  2. 容器:启动两个隔离的运行环境(WordPress + MySQL)。
    • wp_data 持久化 WordPress 文件(如主题、插件)。
    • db_data 持久化 MySQL 数据库(即使容器重建,数据不丢失)。

五、常见误区

误区真相
容器内修改会保存到镜像镜像是只读的!容器修改仅存在可写层,删除容器即丢失
删除镜像会删除相关容器容器依赖镜像,但删除镜像不影响已运行的容器(除非强制删除)。
卷会随容器自动删除卷需手动删除(docker volume rm),否则会持续占用磁盘空间。
所有数据都应存在卷中临时数据(如缓存)可直接存在容器内,避免卷的额外开销。

六、总结:核心差异表

维度镜像容器
本质静态模板动态实例持久化存储
可写性❌ 只读✅ 可写(临时)✅ 可写(永久)
生命周期永久(手动删除)临时(停止即销毁)永久(手动删除)
共享性✅ 可分发(仓库)❌ 不共享✅ 多容器共享
典型命令docker build/pull/rmidocker run/ps/rmdocker volume create/ls/rm

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐