web-dev-qa-db-ja.com

Dockerコンテナー内でNFS共有をマウントする

CentOSベースイメージでDockerコンテナ内にnfs共有をマウントする方法を知っている人はいますか?私はこのコマンドを試しました:

mount server:/dir /mount/point

次のエラーが発生しました:

mount.nfs: rpc.statd is not running but is required for remote locking.
mount.nfs: Either use '-o nolock' to keep locks local, or start statd.
mount.nfs: an incorrect mount option was specified

-o nolockオプションで使用しようとすると、エラーは次のようになります。

mount.nfs: Operation not permitted
23
Anatoly

mountを使用するには、CAP_SYS_ADMIN機能が必要です。これは、コンテナの作成時にDockerによって削除されます。

これにはいくつかの解決策があります。

  1. --cap-add sys_adminフラグでコンテナを開始します。これにより、DockerはCAP_SYS_ADMIN機能を保持します。これにより、コンテナー内からNFS共有をマウントできるようになります。これはセキュリティの問題である可能性があります。信頼できないコンテナではこれを行わないでください。 [この回答の以前のバージョンでは、--privileged=trueを使用してall機能を保持することを提案しました。--cap-add代わりに]。
  2. NFS共有をホストにマウントし、ホストボリュームとしてコンテナーに渡します。

    you@Host > mount server:/dir /path/to/mount/point
    you@Host > docker run -v /path/to/mount/point:/path/to/mount/point
    
  3. Dockerボリュームプラグイン( Netshare プラグインなど)を使用して、NFS共有をコンテナーボリュームとして直接マウントします。

    you@Host > docker run \
      --volume-driver=nfs \
      -v server/dir:/path/to/mount/point \
      centos
    
35
helmbert

Docker 17.06からは、追加機能を必要とせずに、実行時にNFS共有をコンテナに直接マウントできます。

export NFS_VOL_NAME=mynfs NFS_LOCAL_MNT=/mnt/mynfs NFS_SERVER=my.nfs.server.com NFS_SHARE=/my/server/path NFS_OPTS=vers=4,soft

docker run --mount \
  "src=$NFS_VOL_NAME,dst=$NFS_LOCAL_MNT,volume-opt=device=:$NFS_SHARE,\"volume-opt=o=addr=$NFS_SERVER,$NFS_OPTS\",type=volume,volume-driver=local,volume-opt=type=nfs" \
  busybox ls $NFS_LOCAL_MNT

または、コンテナの前にボリュームを作成できます。

docker volume create --driver local \
  --opt type=nfs --opt o=addr=$NFS_SERVER,$NFS_OPTS \
  --opt device=:$NFS_SHARE $NFS_VOL_NAME

docker run --rm -v $NFS_VOL_NAME:$NFS_LOCAL_MNT busybox ls $NFS_LOCAL_MNT

https://github.com/moby/moby/issues/28809 からヒントを得ました

42
ThiagoAlves

受け入れられた回答にリストされている2番目のオプションについて、実際に"docker run -v"コマンドを使用してホストのNFS共有をボリュームとしてdockerコンテナーに渡そうとしたかどうかはわかりません。私は最近そうしようとしましたが、以下はホスト上のnfs共有の情報です:

nfs-server:/path_to_mount on /path_dest type nfs

その後:

docker run -it -v /path_dest:/path_in_docker docker_name bash

ただし、Dockerデーモンは常に以下のエラーを報告します。

docker: Error response from daemon: stat /path_dest: permission denied.

何度も検索した結果、エラーは実際には "root"として実行されているdockerデーモンに由来することがわかりました。マウントするボリュームを含むコンテナーをdockerが実行すると、dockerデーモンがマウントするように要求します。問題は、NFSサーバーが "root"を異なる方法で処理することです。デフォルトでは、NFSサーバーは "root" "nobody"にマッピングし、エラーメッセージを生成します。 reference

10
Jing Qiu

@helmbertに感謝し、Dockerコンテナにnfsをマウントします。

  1. --privileged=trueフラグを使用してdockerコンテナーを実行します。

    $ docker run -it --privileged=true centos:7 bash
    [root@f7915ae635aa /]# yum install -y nfs-utils
    
  2. Nfsツールパッケージをインストールし、CentOSにnfsをマウントします。

    [root@f7915ae635aa /]# yum install -y nfs-utils
    [root@f7915ae635aa /]# mount -t nfs example.tw:/target/ /srv -o nolock
    
  3. NFSサーバーのマウントを表示します。

    [root@f7915ae635aa /]# showmount example.tw
    Hosts on example.tw:
    10.10.10.1
    10.10.10.2
    
1
Chu-Siang Lai

クライアントコンテナに--cap-add sys_adminフラグを追加するだけでは不十分です。エラーが発生していました:

mount.nfs: mount(2): Permission denied
mount.nfs: access denied by server while mounting 1.2.3.4:/exports

数時間の調査の結果、Dockerコンテナ内に正しくマウントするには完全な権限--privilegedが必要であることがわかりました。

また、必要なnfsクライアントパッケージをdockerコンテナ内にインストールすることを忘れないでください。 Debianベースのコンテナの場合:

apt-get install -y nfs-common
0
Shinebayar G