Docker Swarmはどのようにボリューム共有を実装しますか?


96

Docker Swarmは、次の2種類のストレージを管理できます。

volume そして bind

一方でbind、それはタスクに(各群れノード上で)ローカルディレクトリ間の結合を作成するのでドッカードキュメントによって示唆されていない、volume私はボリュームがタスク間で共有されているかを理解していないので、実装は、言及されていませんか?

  • Docker Swarmはノード間でボリュームをどのように共有しますか?
  • ボリュームはどこに保存されますか(マネージャー上?およびマネージャーが複数ある場合?)
  • 異なるネットワーク上の異なるマシンで実行されている場合、ノード間で問題はありませんか?
  • VPNを作成しますか?

1
Swarmはボリュームを共有しますか?Dockerスウォームを扱ったのは約1年前ですが、スウォームはノード間でボリュームを共有する責任はないと思います。ノードで同じボリュームを共有する場合は、azurevolumedriverなどのボリュームプラグインを使用する必要があります。
マンチキン2017

回答:


68

あなたが質問しているのはよくある質問です。ボリュームデータとそのボリュームで実行できる機能は、ボリュームドライバーによって管理されます。、、、などのさまざまなネットワークドライバーを使用できるのと同じようoverlaybridgehostさまざまなボリュームドライバーを使用できます。

DockerとSwarmには、標準のlocalドライバーのみが付属しています。Swarmを認識せず、サービスタスクがスケジュールされているノードにデータ用の新しいボリュームを作成するだけです。これは通常あなたが望むものではありません。

Swarmに対応し、サービスタスク用に作成したボリュームを適切なノードで適切なタイミングで使用できるようにするサードパーティのドライバープラグインが必要です。オプションには、「Docker for AWS / Azure」とそれに含まれるCloudStorドライバー、または人気のあるオープンソースのREX-Rayソリューションの使用が含まれます。

Dockerストアで見つけることができるサードパーティのボリュームドライバーがたくさんあります。


Hadoopはそのような共有ボリュームとして機能できますか?
stackit

57

スウォームモード自体はボリュームに対して何も変わりません。コンテナが実行されているノードで指定したボリュームマウントコマンドを実行します。ボリュームマウントがそのノードに対してローカルである場合、データはそのノードにローカルに保存されます。ノード間でデータを自動的に移動する組み込み機能はありません。

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サーバーでディレクトリの所有権と権限を調整する必要がある場合があります。


9

AWS EFSの私のソリューション、それは機能します:

  1. EFSを作成します(セキュリティグループでNFSポート2049を開くことを忘れないでください)
  2. nfs-commonパッケージをインストールします。

    sudo apt-get install -y nfs-common

  3. efsが機能するかどうかを確認します。

    mkdirefs-テストポイント
    sudo chmod go + rw efs-test-point
    sudo mount -t nfs -o nfsvers = 4.1、rsize = 1048576、wsize = 1048576、hard、timeo = 600、retrans = 2、noresvport [YOUR_EFS_DNS]:/ efs-test-point
    efs-test-point /1.txtに触れます
    sudo umount efs-test-point /
    ls -la efs-test-point /

    ディレクトリは空でなければなりません

    sudo mount -t nfs -o nfsvers = 4.1、rsize = 1048576、wsize = 1048576、hard、timeo = 600、retrans = 2、noresvport [YOUR_EFS_DNS]:/ efs-test-point

    ls -la efs-test-point/

    ファイル1.txtが存在する必要があります

  4. docker-compose.ymlファイルを構成します。

    サービス:
      sidekiq:
        ボリューム:
          --uploads_tmp_efs:/ home / application / public / uploads / tmp
      ..。
    ボリューム:
      uploads_tmp_efs:
        ドライバー:ローカル
        driver_opts:
          タイプ:nfs
          o:addr = [YOUR_EFS_DNS]、nfsvers = 4.1、rsize = 1048576、wsize = 1048576、hard、timeo = 600、retrans = 2
          デバイス:[YOUR_EFS_DNS]:/


6

ローカルでホストされている群れに対する私のソリューション:すべてのワーカーノードは、ファイルサーバーによって提供されるnfs-shareをマウントしてい/mnt/docker-dataます。サービス構成ファイルでボリュームを定義するときは、デバイスを次のようなパスに設定します/mnt/docker-data

volumes:
  traefik-logs:
    driver: local
    driver_opts:
      o: bind
      device: /mnt/docker-data/services/traefik/logs
      type: none

このソリューションでは、dockerがすべてのノードにボリュームを作成し、サービスがデプロイされます。これは、他のノードのボリュームが使用したのと同じパスであるため、データがすでに存在します。

ノードファイルシステムを詳しく見ると、ファイルサーバーマウントへのマウントが下/var/lib/docker/volumesに作成されていることがわかります。ここを参照してください。

root@node-3:~# df -h
Dateisystem                                                                                                   Größe Benutzt Verf. Verw% Eingehängt auf
[...]
fs.mydomain.com:/srv/shares/docker-data/services/traefik/logs                                 194G    141G   53G   73% /var/lib/docker/volumes/traefik_traefik-logs/_data

0

デフォルトでは、swarmは常にローカルボリュームドライバーを探すので、最善の方法は

  1. nfs共有を作成します。 yum -y install nfs-utils
  2. 以下のように/ etc / exportsにエクスポートします。 /root/nfshare 192.168.1.0/24(rw,sync,no_root_squash)
  3. 必要なポートを開きます。私の場合、以下で行いました。 firewall-cmd --permanent --add-service mountd ; firewall-cmd --permanent --add-service rpc-bind ; firewall-cmd --permanent --add-service nfs ; firewall-cmd --zone=public --permanent --add-port 2049/tcp
  4. 新しく作成された共有をDockerワーカーノードにマウントしてから
  5. docker service create --name my-web --replicas 3 -p 80:80 --mount 'type=volume,source=nfshare,target=/usr/share/nginx/html/,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/root/nfshare,"volume-opt=o=addr=192.168.1.8,rw"' nginx:latest
  6. 上記の例では、192.168.1.8ホストでnfshareを作成し、/ etc / exportsファイルを使用してエクスポートしました
  7. デーモンを開始しました systemctl start nfs-server rpcbind & systemctl enable nfs-server rpcbind
  8. 変更へのexportfs-rが有効になります
  9. / root / nfshareには独自のindex.htmlがあります。10。ボリュームドライブのエントリを注意深く確認します。外部にもある可能性があります。
  10. 詳細についてはhttps://docs.docker.com/storage/volumes/
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.