【Docker】Docker的容器Container、镜像Image和卷Volume对比

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

协作流程

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

五、常见误区

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

六、总结:核心差异表

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

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

相关推荐
杨浦老苏1 天前
开源多用户图书追踪系统LibrisLog
docker·群晖·收藏管理
赵渝强老师1 天前
【赵渝强老师】Kubernetes(K8s)中的金丝雀升级
linux·docker·云原生·容器·kubernetes
鹤落晴春1 天前
【K8s】配置存储卷
云原生·容器·kubernetes
我叫张小白。1 天前
CentOS 7 安装 Docker并配置镜像加速(完整指南)
linux·docker·centos
原来是猿1 天前
Docker 【 技术架构(1)】
docker·容器·架构
ba_pi1 天前
k8s删除pod
linux·容器·kubernetes
木雷坞1 天前
Qdrant Docker 部署教程:数据卷、API Key 和集合初始化
运维·docker·容器·知识图谱
梦梦代码精1 天前
为什么这个开源的AI平台会火?有点东西。。。
人工智能·算法·机器学习·docker·开源
Lv_沐曦1 天前
银河麒麟桌面版安装、多屏配置、触摸校准
运维·docker·samba·vsftpd·银河麒麟·触控校准·多屏配置
浩风祭月1 天前
一个开发者的“看门狗”:我把服务器监控从被动告警变成了主动预防
后端·docker