核心是各宿主机挂载同一NFS服务器目录,再通过-v绑定至容器;需配置服务端exports、客户端fstab自动挂载,并注意UID/GID对齐与no_root_squash安全风险。

直接用 NFS 实现跨宿主机容器数据持久,核心是让多个 Docker 主机挂载同一个 NFS 服务器的目录,再把这个本地挂载点映射进容器。它不依赖 Docker 卷插件,配置轻量、内核原生支持、稳定可靠,适合中小规模生产环境。
准备 NFS 服务端
选一台稳定机器(物理机、VM 或 NAS)作为 NFS 服务器,确保它长期在线且网络可达:
- 安装
nfs-utils和rpcbind(RHEL/CentOS)或nfs-kernel-server(Ubuntu/Debian) - 创建共享目录,例如
/export/app-data,并设好权限:chmod 777 /export/app-data(测试阶段)或更精细的 UID/GID 控制(生产推荐) - 编辑
/etc/exports,开放给宿主机网段:/export/app-data 192.168.10.0/24(rw,no_root_squash,async)
其中no_root_squash允许容器以 root 写入(若应用需 root 权限),async提升性能(注意断电风险,生产可改sync) - 执行
exportfs -arv生效,并启动nfs-server和rpcbind - 关闭防火墙或放行
2049/tcp、111/tcp+udp等必要端口
在每台 Docker 宿主机上挂载 NFS
所有要运行容器的节点都必须能访问 NFS 服务端:
- 安装客户端工具:
yum install -y nfs-utils或apt install -y nfs-common - 手动测试挂载:
mount -t nfs 192.168.10.100:/export/app-data /mnt/nfs-app(IP 替换为你的 NFS 服务器地址) - 验证是否成功:
ls /mnt/nfs-app能列出内容,且可读写 - 写入
/etc/fstab实现开机自动挂载:192.168.10.100:/export/app-data /mnt/nfs-app nfs defaults,_netdev,soft,timeo=300,retrans=3 0 0_netdev确保网络就绪后再挂载,soft避免 NFS 故障导致容器卡死
容器内使用 NFS 挂载点
不再用 docker volume create,而是直接绑定宿主机已挂载的 NFS 路径:
- 启动容器时用
-v映射:docker run -d --name web1 -v /mnt/nfs-app:/app/data nginx:alpine - 多个容器(甚至跨主机)只要挂载同一路径,就能实时共享数据。比如日志收集场景:Web 容器写日志到
/app/data/logs,Logstash 容器也挂载该路径并读取 - 注意容器内进程 UID/GID 与 NFS 目录权限匹配。若 NFS 目录属主是
1001:1001,容器应用也应以该用户运行,避免权限拒绝
关键注意事项
避开常见坑,保障生产可用性:
- NFS 服务端必须高可用。单点故障会导致所有挂载点不可写,建议搭配 Keepalived 或云 NAS
- 慎用
no_root_squash。若容器以 root 运行,会获得 NFS 服务端 root 权限,存在安全风险;优先让应用降权运行 - 避免在容器内直接格式化或执行
rm -rf /类操作——NFS 是远程文件系统,误操作可能影响全局 - 监控挂载状态:
mount | grep nfs和cat /proc/mounts | grep nfs,配合脚本定期检查 - 大文件或高并发 IO 场景下,调优 NFS 参数(如
rsize/wsize、tcp协议)提升吞吐


















