nfs4のサーバー機能をコンテナで実現する方法

記事の更新日:2026/09/30 評価を加筆

1.概要

この記事は2023年に記述した記事です。最近はクラウドベースのfuseが主流でnfsは以前のようには利用されなくなっていると感じています。しかし、イントラネット内部ではsmbとnfsは現在でも多数利用されていると考えて、備忘録に残すことにしました。

Dockerを利用してnfs4のサーバー機能をコンテナで実現する方法を調べました。参考資料を参照してdocker-composeで起動できて、クライアントからファイルのread/writeができるようにしました。クライアントはDockerを可動させているubuntu-20.04 Desktopです。/home/usernameにディレクトリを作成し、これをnfs4のコンテナから共有設定します。この内容を記述します。

私の評価は以下の通りです。

(1) nfs環境はファイル共有環境として利用されてきました
(2) mountして、VMwareの共有ストレージで良く利用をしていました
(3) 現在はクラウドストレージの利用が広がり、fuseを利用することが多くなりました
(4) それでもnfsはローカル環境で利用できる有効な技術で学習する価値があります

2.詳細

(1) nfs4サーバー環境構築

(a) ubuntu-20.04にdocker, docker-composeを導入
$ sudo apt -y install docker.io
$ sudo apt -y install docker-compose
$ sudo usermod -aG docker $(whoami)
$ docker --version
$ docker-compose --version
PCを1度再起動します

(b) uid=1000, gid=1000のusernameに/home/username/nfsディレクトリを作成
$ mkdir /home/username/nfs

(c) Dockerfile、docker-compose.yml作成して、コンテナ起動
Dockerfile作成

FROM itsthenetwork/nfs-server-alpine
RUN mkdir /nfsshare
RUN chown 1000.1000 /nfsshare

docker-compose.yml作成

version: '3'
services:
  nfs:
    build:
        context: .
    privileged: true
    volumes:
        - /home/username/nfs:/nfsshare
    environment:
        - "SHARED_DIRECTORY=/nfsshare"
    ports:
        - "2049:2049"

コンテナ起動

$ docker-compose up -d

(d) nfsクライアント導入、nfs mount
$ sudo apt install nfs-client

コンテナのIPを調べます。
$ docker ps
$ docker exec -it ContainerID /bin/bash
ip -a
exit

ip=172.18.0.2に設定されていたとします。

$ sudo mount.nfs4 -v 172.18.0.2:/ /mnt

(e) 試験
$ touch /mnt/file-a
$ ls /home/username/nfs にfile-aが存在することを確認します

(2) nfs4サーバーへDockerコンテナからアクセスする方法

Dockerを利用してnfs4のサーバー機能をコンテナで実現する方法を調べました。今回は別PCで動作しているnfs4サーバーへDockerコンテナからアクセスする方法を試したので記述します。nfs-clientを導入すると思っていたのですが、volumes定義をすることでアクセスできました。記述方法が良くわからず苦労しました。

作成した手順は以下の通りです。

(a) ubuntu-20.04にdocker, docker-composeを導入
$ sudo apt -y install docker.io
$ sudo apt -y install docker-compose
$ sudo usermod -aG docker $(whoami)
$ docker --version
$ docker-compose --version
PCを1度再起動します

(b) docker-compose.yml作成して、コンテナ起動
nfs4サーバーは、192.168.0.1で動作しているとします。

docker-compose.yml作成

version: '3'
services:
  ubuntu20:
    image: ubuntu:20.04
    volumes:
        - vol_nfs:/mnt
    tty: true
volumes:
    vol_nfs:
        driver: local
        driver_opts:
            type: nfs
            o: "addr=192.168.0.1,hard,nfsvers=4"
            device: ":/"

コンテナ起動

$ docker-compose up -d

(c) 試験
$ docker ps
でubuntu:20.04のコンテナIDを調べて、コンテナにログインします。
$ docker exec -it ContainerID /bin/bash

# ls /mnt

前回作成したfile-aが参照できます。

(3) 1台のPCでDockerを使用してNFS環境を構築

作成した手順は以下の通りです。

(a) ubuntu-20.04にdocker, docker-composeを導入
$ sudo apt -y install docker.io
$ sudo apt -y install docker-compose
$ sudo usermod -aG docker $(whoami)
$ docker --version
$ docker-compose --version
PCを1度再起動します

(b) docker-compose.yml作成して、コンテナ起動
docker-compose.yml作成

version: '3'
services:
  ubuntu20:
    image: ubuntu:20.04
    volumes:
        - vol_ubuntu:/mnt
    tty: true
  nfs:
    image: itsthenetwork/nfs-server-alpine
    privileged: true
    volumes:
        - vol_nfs:/nfsshare
    environment:
        - "SHARED_DIRECTORY=/nfsshare"
    ports:
        - "2049:2049"

volumes:
    vol_nfs:
    vol_ubuntu:
        driver: local
        driver_opts:
            type: nfs
            o: "addr=localhost,hard,nfsvers=4"
            device: ":/"
   
コンテナ起動

$ docker-compose up -d

(c) 試験
$ docker ps
でubuntu:20.04のコンテナIDを調べて、コンテナにログインします。
$ docker exec -it ContainerID /bin/bash

# df -h

:/ が /mnt にマウントされます。

3.所見

NFSサーバとNFSクライアント環境を構築して、単体PCで動作確認をしました。クラウド環境が整備される前まではNFSは様々な用途で利用されていました。例えば、VMwareの仮想マシン用のストレージとしてNFSは選択肢の1つでした。

しかし、クラウド利用が普通になってしまいネットワークアクセスはfuseを利用するようになったと認識しています。もちろん、SMB手順を利用したファイル共有サービスも存在しますが、これらはイントラネット内部で利用されていて、外部環境での共有ファイルサービスの仕組みは変わってしまったと思っています。

それでもNFSは基本的なシステムであり、ネットワークマウント操作をして多数のクライアントに共有ファイルを提供します。ネットワークを経由した接続確認を実施して理解を深める予定です。

参考

[本ブログ内参照]
・Google driveのアクセス方法とその他の手段について 
・openSSHで脆弱性の大きな問題が発生
[外部サイト参照]
・docker で nfs サーバを構築してみた
・itsthenetwork/nfs-server-alpine

コメント