15.5.1 数据卷类型与使用场景(volume、bind、tmpfs)
数据卷类型概览#
Docker 持久化主要有三类:volume(卷)、bind(绑定挂载)、tmpfs(内存挂载)。它们在管理方式、生命周期、性能与安全性上差异明显,需结合业务场景选择。
1. Volume(命名卷)#
特点
- 由 Docker 管理,存储在 /var/lib/docker/volumes/。
- 生命周期独立于容器,可共享与复用。
- 可使用驱动扩展(如 NFS、Ceph、云盘等)。
使用场景
- 数据库、消息队列等需要稳定持久化的数据。
- 多容器共享数据(如主从、读写分离)。
- 需要统一备份与迁移的场景。
优缺点
- ✅ 管理规范、易迁移、隔离性好
- ❌ 对宿主机路径不可控,排查时需定位卷位置
示例:创建并使用命名卷
# 1) 创建命名卷
docker volume create appdata
# 2) 查看卷信息(Mountpoint 为实际路径)
docker volume inspect appdata
# 3) 启动容器并挂载卷
docker run -d --name web \
-v appdata:/var/www/html \
nginx:alpine
# 4) 在容器内写入数据(预期:宿主机卷中可见)
docker exec web sh -c 'echo hello > /var/www/html/index.html'
# 5) 删除容器后数据仍在
docker rm -f web
命令解释
- docker volume create appdata:创建 Docker 管理的命名卷。
- docker volume inspect appdata:查看卷的挂载点和配置。
- -v appdata:/var/www/html:把命名卷挂载到容器路径。
排错要点
- Mountpoint 不存在:检查 Docker 数据根目录是否被修改(/etc/docker/daemon.json)。
- 挂载后无权限:进入容器调整目录权限或运行时指定用户。
练习
1. 创建卷 dbdata,将 MySQL 数据目录挂载到 /var/lib/mysql。
2. 删除容器后重新启动,验证数据是否保留。
2. Bind(绑定挂载)#
特点
- 直接将宿主机的目录或文件挂载进容器。
- 读写权限由宿主机文件系统控制。
- 对路径强依赖,宿主机结构变更影响容器。
使用场景
- 开发测试:挂载代码目录实现热更新。
- 需要访问宿主机已有文件(如证书、日志、配置)。
- 特定路径与外部系统共享数据(如日志采集)。
优缺点
- ✅ 灵活、直观、调试方便
- ❌ 可移植性差、宿主机耦合强、安全风险较高
示例:绑定挂载宿主机目录
# 1) 宿主机准备目录
mkdir -p /opt/app
echo "from host" > /opt/app/index.html
# 2) 挂载宿主机目录到容器
docker run -d --name web \
-v /opt/app:/usr/share/nginx/html:ro \
-p 8080:80 \
nginx:alpine
# 3) 验证
curl http://127.0.0.1:8080
命令解释
- -v /opt/app:/usr/share/nginx/html:ro:宿主机目录绑定到容器目录,ro 只读。
- -p 8080:80:映射端口,验证页面内容。
排错要点
- 容器内看不到文件:检查宿主机路径是否存在且有权限。
- SELinux 拒绝访问(CentOS/RHEL):使用 :z 或 :Z 标签修复。
docker run -d --name web \
-v /opt/app:/usr/share/nginx/html:Z \
nginx:alpine
练习
1. 将宿主机 /etc/hosts 以只读方式挂载到容器 /tmp/hosts。
2. 修改宿主机文件并验证容器内同步变化。
3. Tmpfs(内存挂载)#
特点
- 数据保存在内存中,容器停止即丢失。
- 读写性能高,避免磁盘 IO。
使用场景
- 临时数据、缓存、会话、敏感信息短期存储。
- 高频读写但无需持久化的数据。
- 需要提升容器性能的场景。
优缺点
- ✅ 性能高、安全性更好(不落盘)
- ❌ 不持久化,受内存限制
示例:tmpfs 挂载
# 1) 启动容器并挂载 tmpfs
docker run -d --name cache \
--tmpfs /cache:rw,size=64m \
alpine sleep 3600
# 2) 写入数据
docker exec cache sh -c 'echo hot > /cache/data.txt && ls -l /cache'
# 3) 删除容器后数据丢失
docker rm -f cache
命令解释
- --tmpfs /cache:rw,size=64m:在内存中挂载 /cache,限制大小 64MB。
- sleep 3600:保持容器存活,便于验证。
排错要点
- 写入失败:检查 size 是否过小或宿主机内存不足。
- 误用持久数据:tmpfs 不会落盘,重启即丢失。
练习
1. 创建 tmpfs 挂载 /run/secrets,限制 10MB。
2. 在容器中写入文件,重启容器验证文件消失。
选型建议#
- 持久化生产数据 → 优先使用 volume
- 开发调试或共享宿主机资源 → 使用 bind
- 临时数据或高性能缓存 → 使用 tmpfs
合理选择数据卷类型,是容器稳定性、数据可靠性与运维效率的关键。