把 NFS 挂成 Docker 卷
用 local 驱动配合 type=nfs 可以把远端 NFS 导出目录挂成 Docker 卷:多个宿主共享同一份数据,适合无状态服务读取共享配置,或集群化文件存储。本质是让宿主替容器完成一次 NFS 挂载。
基本信息
| 语法 | --driver local --opt type=nfs --opt device=:导出路径 --opt o=addr=… |
|---|---|
| 前提 | 宿主能访问 NFS 服务且已安装 NFS 客户端 |
| 版本参数 | o 里可写 nfsvers=4 等挂载选项 |
| 验证 | 先在宿主上 showmount -e 与手工挂载验证 |
| 共享特性 | 多宿主共享同一份数据 |
典型使用场景
- 多台宿主的容器共享同一份配置或文件目录
- 把有状态数据放到集中存储,宿主本身可随意替换
- 集群化应用读取共享数据,避免逐台同步
- 迁移期先把数据放 NFS,再逐步迁到正式存储
- 共享日志或构建产物目录,多个容器写入同一位置
创建与读写验证
创建与读写验证
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=10.0.0.20,rw,nfsvers=4 \
--opt device=:/export/appdata \
nfsdata
docker run --rm -v nfsdata:/data alpine sh -c 'echo hi > /data/test' # 写入验证
docker volume inspect nfsdata --format '{{json .Options}}' # 复核参数排查关注点
| 关注点 | 检查项 | 异常表现 |
|---|---|---|
| 连通性 | showmount -e <NFS 地址> | 列表为空或连接超时 |
| 权限 | 导出参数与容器内 uid/gid | 写入被拒 |
| 挂载选项 | nfsvers 与导出端是否一致 | 挂载失败或性能异常 |
| 稳定性 | NFS 抖动 | 容器 IO 长时间挂起 |
先在宿主上用 showmount -e 与手工挂载验证 NFS 可达,再创建卷,能少走一层排查。
容器内 uid/gid 与 NFS 导出端的权限映射不匹配时写入会失败,需要两边对齐 UID,或调整导出参数。
NFS 抖动时容器 IO 会长时间挂起而不是立刻报错,关键业务要评估超时与重试策略,并预留降级方案。
NFS 版本要在卷参数与导出端保持一致,混用不同版本可能挂载成功但出现文件锁与缓存语义不一致的问题。
多容器同时写同一个 NFS 目录时要注意并发语义:NFS 的文件锁与缓存行为与本地盘不同,依赖强一致锁的应用要先做并发验证再上线。