# docker-nfs-server-alpine **Repository Path**: chen2ha/docker-nfs-server-alpine ## Basic Information - **Project Name**: docker-nfs-server-alpine - **Description**: 一个基于 Alpine Linux 的便捷 NFS server 镜像,仅通过 TCP 在端口 2049 上运行 NFS v4 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-10-24 - **Last Updated**: 2024-10-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README - 原 Github 项目:[sjiveson/nfs-server-alpine](https://github.com/sjiveson/nfs-server-alpine) - 这个项目在 Github 算是比较久远了,作者也只是三年前更新了一下启动脚本的拼写检查,作者构建的镜像也停留在五年前了 - 原作者的项目在 sjiveson-nfs-server-alpine 目录下,目录以外的内容,是我个人做的一些修改 --- ## 容器启动方式 > 首先需要自己先 clone 项目,自己 build 构建镜像,下面以 `nfs-server-2.6.4:alpine-3.20` 来当作镜像名称 ### 环境变量方式 - `SHARED_DIRECTORY` 变量是必须传参的,定义的是 NFS 的共享目录名称 - `SYNC=` 表示采用 sync 的模式,启动时不带 `-e SYNC=` 表示采用 async - **`sync` 模式**: - **写入过程**:每次客户端进行写操作时,数据会立即写入到服务器的磁盘上,确保数据在操作完成时已经安全地存储在服务器端。 - **优点**:数据可靠性高,确保数据不会因为服务器宕机或网络问题而丢失。每次写入操作都会被确认已经完成,数据一致性较好。 **缺点**:由于需要等待磁盘操作完成,写入速度较慢,性能相对较低,特别是在频繁的写入操作中。 - **`async` 模式**: - **写入过程**:客户端的写操作会立即返回成功,但数据并不立即写入到服务器的磁盘,而是被缓存起来,稍后批量写入。服务器会在空闲时处理这些写入请求。 - **优点**:写入性能较高,因为客户端不需要等待每个写操作被真正写入磁盘,减少了延迟,适合对性能要求较高的场景。 - **缺点**:如果服务器在数据实际写入磁盘之前宕机,可能导致数据丢失,数据可靠性相对较低。 - **适用场景** - **`sync`**:适合对数据可靠性要求高的场景,例如数据库或需要确保数据不会丢失的关键任务。 - **`async`**:适合对性能要求较高,但数据偶尔丢失可以接受的场景,例如临时数据或对性能有更高要求的应用。 - `READ_ONLY=` 表示共享目录采用 ro 只读模式 - `PERMITTED="10.11.99.*"`:表示仅允许 IP 地址以 10.11.99 开头的主机挂载文件共享,不指定表示所有 IP 地址都可以挂载文件共享 ```shell docker run -d \ --name nfs-server \ --cap-add SYS_ADMIN \ -p 20490:2049 \ -v /appdata:/appdata \ -e SHARED_DIRECTORY=/appdata \ -e SYNC= \ nfs-server-2.6.4:alpine-3.20 ``` ### 配置文件挂载方式 > 自己准备 exports 配置文件,适合一些权限细化管理,访问地址细化管理的场景 ```shell docker run -d \ --name nfs-server \ --cap-add SYS_ADMIN \ -p 20490:2049 \ -v /nfsshare:/nfsshare \ -v /path/to/exports:/etc/exports \ -e SHARED_DIRECTORY=/nfsshare \ nfs-server-2.6.4:alpine-3.20 ``` ## 特权模式 > NFS 需要挂载 `/proc/fs/nfsd` 和 `/var/lib/nfs/rpc_pipefs` 这两个目录,不启用特权,会有如下报错,所以启用特权模式是无法避免的 ``` mount: /var/lib/nfs/rpc_pipefs: permission denied. dmesg (1) may have more information after failed mount system call. mount: /proc/fs/nfsd: permission denied. dmesg (1) may have more information after failed mount system call ``` > 如果完全开启 `--privileged` ,那只会更危险,这里采用 Linux capabilities 的 `SYS_ADMIN` 支持容器内部进行文件的挂载特权 ### docker ``` docker run --cap-add SYS_ADMIN ``` ### docker-compose ```yaml cap_add: - SYS_ADMIN ``` ### K8S ```yaml spec: containers: - name: ... image: ... securityContext: capabilities: add: ["SYS_ADMIN"] ``` ## 本地挂载 NFS > - 配置文件默认启用了 `fsid=0`,因此从客户端挂载时无需指定文件夹名称 > - 外部映射的端口不是 2049,挂载时,需要指定外部映射端口 ``` mount -t nfs -o port=20490,mountport=20490 10.11.12.101:/ /some/where/here ```