使用docker搭建nfs实现容器间共享文件 nfs server nfs client

本文介绍如何利用Docker和NFS实现容器间文件共享,通过搭建NFS服务器并配置Docker容器,使多个容器能够共享同一目录下的文件。此方案适用于有多个容器间文件共享需求的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先介绍下今天的两个主角:nfs和docker

nfs 是什么
NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。 摘自百度百科

docker 是什么
这个就不多说了,近两年一个非常流行的东西哦。

主角介绍完毕,那么要说说为什么要使用docker来搭建nfs,其实本文标题已经说明,主要目的还是为了实现容器间文件的共享。 用过docker的都应该知道docker可以支持容器目录挂载到宿主机。而通过nfs,则可以将容器之间的目录实现共享挂载。如果你有多个容器间需要共享文件的需求,这个将是一个可以尝试的方案,具体使用场景看大家发挥想象了,今天这里主要实践一下如何实现这个功能。

涉及到的知识
nfs安装
docker容器间通信
docker privileged
dockerfile
docker镜像
编写dockerfile
FROM ubuntu
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update -qq && apt-get install -y nfs-kernel-server runit inotify-tools -qq
RUN mkdir -p /exports

VOLUME /exports

EXPOSE 111/udp 2049/tcp
制作docker镜像
 docker build -t=scottkiss/nfs .
运行该命令需要一段时间,成功后执行

docker images
将会看到本地刚刚创建nfs的docker镜像

配置并运行nfs服务器
执行

 

docker run -it --name nfs-server --privileged scottkiss/nfs
执行完毕后进入容器终端

修改配置

vi /etc/exports
在末尾加入

/exports *(rw,sync,no_subtree_check,fsid=0,no_root_squash)
然后执行

exportfs -r
接着启动rpcbind服务

service rpcbind start
最后启动nfs服务

 

service nfs-kernel-server start
至此,不出意外,已经成功的启动了nfs服务器,并且将/exports目录共享了出去。这里,笔者在开始的时候遇到一坑, 就是启动时候需要加上–privileged参数,否则启动nfs服务时候会提示权限不足报错。主要是这个过程中涉及到了mount操作, 使用该参数后使得container内的root拥有真正的root权限,这样就不会报错了。

配置并启动客户端
客户端就简单多了,不需要像服务器那样配置了。 执行

docker run -it --link nfs-server:nfs  --privileged scottkiss/nfs
进入容器终端。然后执行

service rpcbind start
接着执行远程挂载命令

mount -t nfs -o proto=tcp,port=2049 $NFS_PORT_2049_TCP_ADDR:/exports /home
这样,便将服务器的exports目录挂载到了客户端的home目录了。

迫不及待的可以试试了,如在server终端的/exports目录下添加一个文件,在client的/home下也会同步添加。

 

这里涉及的主要就是–link参数,这个参数就是告诉Docker容器需要使用nfs-server这个容器并将其别名命名为nfs。这样,就可以使用$NFS_PORT_2049_TCP_ADDR来获取服务器ip了。

总结
以上所有只是为了测试而做的一个粗糙的方案,还有很多改进之处,包括dockerfile,这里为了便于试验,尽量使用了简单粗暴的方式。

### 安装和配置 NFS #### 在 Docker 中安装 NFS 服务端 为了在 Docker 中运行 NFS 服务器,可以采用预先准备好的镜像来简化部署过程。通过编写并执行启动脚本来完成 NFS 的快速设置[^4]。 ```bash vim start.sh ``` 该脚本的内容如下: ```bash docker run -d --privileged --restart=always \ -v /nfsdata:/nfs \ -e NFS_EXPORT_DIR_1=/nfs \ -e NFS_EXPORT_DOMAIN_1=* \ -e NFS_EXPORT_OPTIONS_1=rw,insecure,no_subtree_check,no_root_squash,fsid=1 \ -p 111:111 -p 111:111/udp \ -p 2049:2049 -p 2049:2049/udp \ -p 32765:32765 -p 32765:32765/udp \ -p 32766:32766 -p 32766:32766/udp \ -p 32767:32767 -p 32767:32767/udp \ fuzzle/docker-nfs-server:latest ``` 上述命令会拉取 `fuzzle/docker-nfs-server` 镜像,并按照指定参数启动容器实例,其中 `-v` 参数用于定义数据卷映射关系;环境变量部分则指定了要导出的目录及其访问权限等选项;最后一系列 `-p` 命令用来开放必要的网络端口以支持 NFS 协议通信。 #### 创建 NFS 数据卷供其他应用使用 对于希望利用 NFS 进行存储资源共享的应用程序而言,在创建对应的 Docker Volume 时需特别注意其驱动器类型以及挂载方式的选择。具体操作可以通过 CLI 来实现,例如下面这条指令展示了怎样建立一个名为 `nfs-web-6` 的持久化存储空并与远端主机上的 `/web` 路径关联起来[^3]。 ```bash [root@client nfs-web]# docker volume create --driver local --opt type=nfs --opt o=addr=192.168.175.138,nolock,soft,rw.sync --opt device=:/web nfs-web-6 ``` 此命令中的各个组成部分解释如下: - `--driver local`: 使用默认的本地驱动; - `--opt type=nfs`: 明确指出这是针对 NFS 设计的数据源; - `--opt device=:/web`: 表明实际物理位置位于远程服务器下的哪个路径下; - `nfs-web-6`: 新建卷的名字标签。 #### 启动 NFS 客户端工具集 当需要让某台计算机作为 NFS 请求发起方时,则必须先确保已成功安装相应的客户端组件库。这一步骤可通过包管理器轻松达成目的,比如 CentOS 或 RHEL 类似系统环境下可借助 YUM 工具来进行在线获取与自动装配工作[^1]。 ```bash yum install -y nfs-utils ``` 以上命令将会从官方仓库下载最新的稳定版软件集合,并将其妥善安置于操作系统内部以便随时调用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值