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
mount
を使用するには、CAP_SYS_ADMIN
機能が必要です。これは、コンテナの作成時にDockerによって削除されます。
これにはいくつかの解決策があります。
--cap-add sys_admin
フラグでコンテナを開始します。これにより、DockerはCAP_SYS_ADMIN
機能を保持します。これにより、コンテナー内からNFS共有をマウントできるようになります。これはセキュリティの問題である可能性があります。信頼できないコンテナではこれを行わないでください。 [この回答の以前のバージョンでは、--privileged=true
を使用してall機能を保持することを提案しました。--cap-add
代わりに]。NFS共有をホストにマウントし、ホストボリュームとしてコンテナーに渡します。
you@Host > mount server:/dir /path/to/mount/point
you@Host > docker run -v /path/to/mount/point:/path/to/mount/point
Dockerボリュームプラグイン( Netshare プラグインなど)を使用して、NFS共有をコンテナーボリュームとして直接マウントします。
you@Host > docker run \
--volume-driver=nfs \
-v server/dir:/path/to/mount/point \
centos
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 からヒントを得ました
受け入れられた回答にリストされている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
@helmbertに感謝し、Dockerコンテナにnfsをマウントします。
--privileged=true
フラグを使用してdockerコンテナーを実行します。
$ docker run -it --privileged=true centos:7 bash
[root@f7915ae635aa /]# yum install -y nfs-utils
Nfsツールパッケージをインストールし、CentOSにnfsをマウントします。
[root@f7915ae635aa /]# yum install -y nfs-utils
[root@f7915ae635aa /]# mount -t nfs example.tw:/target/ /srv -o nolock
NFSサーバーのマウントを表示します。
[root@f7915ae635aa /]# showmount example.tw
Hosts on example.tw:
10.10.10.1
10.10.10.2
クライアントコンテナに--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