スウォームモード自体はボリュームに対して何も変わりません。コンテナが実行されているノードで指定したボリュームマウントコマンドを実行します。ボリュームマウントがそのノードに対してローカルである場合、データはそのノードにローカルに保存されます。ノード間でデータを自動的に移動する組み込み機能はありません。
GlusterFSのようなソフトウェアベースの分散ストレージソリューションがいくつかあります。DockerにはまだGAではないInfinitと呼ばれるソリューションがあり、その開発はEEでのKubernetes統合に後れを取っています。
典型的な結果は、アプリケーション内のストレージのレプリケーションを管理する必要があるか(etcdやその他のraftベースのアルゴリズムなど)、外部ストレージシステムでマウントを実行する(できれば独自のHAを使用する)ことです。外部ストレージシステムのマウントには、ブロックベースまたはファイルベースの2つのオプションがあります。ブロックベースのストレージ(EBSなど)は通常、パフォーマンスが高くなりますが、単一ノードにのみマウントできるように制限されています。このため、通常、Dockerノードにそのブロックストレージへのアクセスを許可するには、サードパーティのボリュームプラグインドライバーが必要になります。ファイルベースのストレージ(EFSなど)はパフォーマンスが低下しますが、移植性が高く、複数のノードに同時にマウントできるため、レプリケートされたサービスに役立ちます。
最も一般的なファイルベースのネットワークストレージはNFSです(これはEFSで使用されるのと同じプロトコルです)。そして、サードパーティのプラグインドライバーなしでそれをマウントすることができます。dockerに同梱されている残念ながら名前の付いた「ローカル」ボリュームプラグインドライバーには、ドライバーオプションを使用してmountコマンドに必要な値を渡すオプションがあり、オプションがない場合、デフォルトでdockerディレクトリ/ var / lib /にボリュームが保存されます。 docker / volumes。オプションを使用すると、NFSパラメーターを渡すことができ、NFSホスト名(通常はNFSにはないもの)でDNSルックアップを実行することもできます。ローカルボリュームドライバーを使用してNFSファイルシステムをマウントするさまざまな方法の例を次に示します。
# create a reusable volume
$ docker volume create --driver local \
--opt type=nfs \
--opt o=nfsvers=4,addr=192.168.1.1,rw \
--opt device=:/path/to/dir \
foo
# or from the docker run command
$ docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
foo
# or to create a service
$ docker service create \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
foo
# inside a docker-compose file
...
volumes:
nfs-data:
driver: local
driver_opts:
type: nfs
o: nfsvers=4,addr=192.168.1.1,rw
device: ":/path/to/dir"
...
最後にファイル作成の例を使用する場合、ボリュームへの変更(サーバーのパスやアドレスの更新など)は、既存の名前付きボリュームが存在する限り反映されないことに注意してください。swarmが新しい値でボリュームを再作成できるようにするには、ボリュームの名前を変更するか、ボリュームを削除する必要があります。
ほとんどのNFSの使用法で見られる他の一般的な問題は、サーバーで「ルートスカッシュ」が有効になっていることです。これにより、rootとして実行されているコンテナがファイルをボリュームに書き込もうとすると、権限の問題が発生します。同様のUID / GID権限の問題があり、コンテナUID / GIDがボリュームへの書き込み権限を必要とするものであり、NFSサーバーでディレクトリの所有権と権限を調整する必要がある場合があります。