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

发布于:2025-09-02 ⋅ 阅读:(22) ⋅ 点赞:(0)

在 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 应用 为例:

# 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

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


网站公告

今日签到

点亮在社区的每一天
去签到