Dockerの基本-ボリューム(ボリューム)を使用してアプリケーションデータを管理する

ボリュームは、Dockerコンテナーが永続データを生成して使用するための推奨メカニズムです。バインドマウントはホストのディレクトリ構造に依存し、ボリュームはDockerによって完全に管理されます。バインドマウントと比較して、ボリュームにはいくつかの利点があります。

  • ボリュームは、バインドマウントよりもバックアップまたは移行が簡単です。
  • DockerCLIコマンドまたはDockerAPIを使用してボリュームを管理できます。
  • ボリュームは、LinuxおよびWindowsコンテナで動作します。
  • ボリュームは、複数のコンテナー間でより安全に共有できます。
  • ボリュームドライバーを使用すると、ボリュームを保存したり、ボリュームのコンテンツを暗号化したり、リモートホストまたはクラウドプロバイダーに他の機能を追加したりできます。
  • 新しいボリュームの内容は、コンテナーによって事前に入力できます。(新しいボリュームには、コンテナーによってコンテンツが事前入力されている場合があります。)

さらに、データをコンテナの書き込み可能なレイヤーに永続化する場合と比較して、ボリュームは通常、ボリュームがそれを使用するコンテナのサイズを増加させず、ボリュームの内容が特定の存続期間外に存在するため、より適切な選択です。コンテナ。

docker-types-of-mounts-volume

コンテナーが非永続状態データを生成する場合は、tmpfsマウント使用して、データがどこにでも永続的に保存されないようにし、コンテナーの書き込み可能レイヤーへの書き込みを回避してコンテナーのパフォーマンスを向上させることを検討してください。

rprivateバインディング伝播、ボリュームへの伝播、およびバインディングを使用するボリュームは構成できません。

-vまたは--mountフラグを選択します

最初に、-vまたはクラスターサービス用--volume--mountラベル付けされた、個別のコンテナー用にマークされています。ただし、Docker 17.06以降--mount、コンテナとは独立して使用することもできます通常、--mountマークの表現はより明確で冗長です。最大の違いは、-vフィールド内のオプションのすべての組み合わせの--mount構文と、構文オプションが分離されていることです。以下は、各タグの構文比較です。

新しいユーザーは--mount、より--volume単純な構文よりも文法を使用することをお勧めします。

ボリュームドライバオプションを指定する必要がある場合は、それらを使用する必要があります--mount

  • -vまたは--volume:コロン(:)で区切られた3つのフィールドで構成されます。フィールドは正しい順序で配置する必要があり、各フィールドの意味は十分に直感的ではありません。
    • 名前付きボリュームの場合、最初のフィールドはボリュームの名前であり、特定のホストで一意です。匿名ボリュームの場合、最初のフィールドを省略します。
    • 2番目のフィールドは、コンテナ内のファイルまたはディレクトリがマウントされるパスです。
    • 3番目のフィールドはオプションであり、たとえば、オプションのコンマ区切りのリストですroこれらのオプションについては、この記事で後述します。
  • --mount:複数のキー-コンマで区切られた値のペア、各キー-<key>=<value>タプルの1つの値--mount構文より-v--volume、より詳細な、しかし、キーの順序は重要ではありませんが、タグ値も理解しやすいです。
    • (実装のタイプtypeのいずれであってもよい)bindvolume又はtmpfsこのトピックではボリュームについて説明しているため、タイプ(type)は常にボリューム(volume)です。
    • マウントのソース(source)。名前付きボリュームの場合、これはボリュームの名前です。匿名ボリュームの場合、このフィールドは省略されます。あなたは使用sourceまたはsrc指定される場合があります。
    • ターゲット(destination)、コンテナ内のファイルまたはディレクトリがその値としてマウントされるパス。それは使用することができdestinationdstまたはtarget指定します。
    • readonlyオプション(存在する場合)、バインドマウントは読み取り専用としてコンテナーにマウントされます
    • volume-opt オプションは複数回指定でき、オプション名とその値で構成されるキーと値のペアを受け入れます。

外部CSVパーサーからの値のエスケープ

ボリュームドライバーがオプションとしてコンマ区切りのリストを受け入れる場合は、値を外部CSVパーサーからエスケープする必要があります。エスケープするにはvolume-opt、二重引用符( ")を使用して囲み、一重引用符( ')を使用してマウントパラメーター全体を囲みます。

たとえば、ローカル(local)パラメータードライバーoは、コンマ区切りのリストオプションとしてマウントすることを受け入れます。次の例は、エスケープリストを作成する正しい方法を示しています。

$ docker service create \
    --mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"'
    --name myservice \
    <IMAGE>

同時に、可能な限り、次の例が示す--mount-v2つの構文、及び最初のショー--mount

-vそして--mount、行動の違い

また、バインドはすべてのオプションに対して異なるボリュームをマウントし--mount-vマークが使用可能です。

サービスボリュームと組み合わせて使用​​する場合は、--mountサポートのみ

ボリュームの作成と管理

バインドマウントとは異なり、任意のコンテナのスコープ外でボリュームを作成および管理できます。

ボリュームを作成します。

$ docker volume create my-vol

ボリュームリスト:

$ docker volume ls
# 输出结果:
DRIVER              VOLUME NAME
local               my-vol

音量を確認します。

$ docker volume inspect my-vol
# 输出结果:
[
    {
    
    
        "CreatedAt": "2020-07-04T07:06:47Z",
        "Driver": "local",
        "Labels": {
    
    },
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {
    
    },
        "Scope": "local"
    }
]

ボリュームの削除:

$ docker volume rm my-vol

ボリュームのあるコンテナを開始します

まだ存在しないボリュームでコンテナーを開始すると、Dockerがボリュームを作成します。次の例myvol2は、のコンテナ/app/ロールマウントします。

以下--mount-v例は同じ結果を生成します。最初のサンプルdevtestコンテナとmyvol2ボリュームを実行した後に削除するか、同時に実行できない場合を除きます。

--mount

$ docker run -d \
  --name devtest \
  --mount source=myvol2,target=/app \
  nginx:latest

-v

$ docker run -d \
  --name devtest \
  -v myvol2:/app \
  nginx:latest

docker inspect devtest検証を使用して、ボリュームを正しく作成およびマウントします。Mountsパーツを表示

"Mounts": [
    {
    
    
        "Type": "volume",
        "Name": "myvol2",
        "Source": "/var/lib/docker/volumes/myvol2/_data",
        "Destination": "/app",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],

これは、マウントがボリュームであり、正しいソースと宛先が表示され、マウントが読み取りおよび書き込み可能であることを示しています。

コンテナを停止し、ボリュームを削除します。ボリュームの削除は別の手順であることに注意してください。

$ docker container stop devtest

$ docker container rm devtest

$ docker volume rm myvol2

ボリュームでサービスを開始します

サービスを開始してボリュームを定義するとき、各サービスコンテナは独自のローカルボリュームを使用します。ローカル(local)ボリュームドライバーを使用する場合、コンテナーはこのデータを共有できませんが、一部のボリュームドライバーは共有ストレージをサポートします。Docker forAWSとDockerfor Azureはどちらも、Cloudstorプラグインを使用した永続ストレージをサポートしています。

次の例では、4つのコピーを使用しnginxてサービスを開始し、各コピーは名前付きmyvol2ローカルボリュームを使用します。

$ docker service create -d \
  --replicas=4 \
  --name devtest-service \
  --mount source=myvol2,target=/app \
  nginx:latest

Use docker service ps devtest-serviceAuthenticationServiceが実行されています。

$ docker service ps devtest-service

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
4d7oz1j85wwn        devtest-service.1   nginx:latest        moby                Running             Running 14 seconds ago

サービスを削除すると、サービスはすべてのタスクを停止します。

$ docker service rm devtest-service

サービスを削除しても、サービスによって作成されたボリュームは削除されません。ボリュームの削除は別の手順です。

サービスの文法上の違い

docker service createコマンドはサポート-vまたは--volumeマークを付けません--mountサービスにマウントされたコンテナーのボリュームの場合、マークを使用する必要があります

ボリュームをコンテナで満たします

上記のように新しいボリュームを作成するコンテナを起動し、そのコンテナ/app/のディレクトリにマウントするファイルまたはディレクトリ(上記など)がある場合、ディレクトリの内容が新しいボリュームにコピーされます。次に、コンテナはボリュームをマウントして使用し、ボリュームを使用する他のコンテナも事前に入力されたコンテンツにアクセスできます。

この点を説明するために、このケースnginxではコンテナが開始され、コンテナは/usr/share/nginx/html新しいボリュームコンテンツディレクトリnginx-vol満たされています。このディレクトリは、NginxHTMLコンテンツのデフォルトの保存場所です。

次の--mount-v例では、同じ最終結果が得られます。

--mount

$ docker run -d \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html \
  nginx:latest

-v

$ docker run -d \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html \
  nginx:latest

2つの例のいずれかを実行した後、次のコマンドを実行してコンテナーとボリュームをクリーンアップします。注:ボリュームの削除は別のステップです。

$ docker container stop nginxtest

$ docker container rm nginxtest

$ docker volume rm nginx-vol

読み取り専用ボリュームを使用する

一部の開発アプリケーションでは、変更がDockerホストに伝播されるように、コンテナーはバインドマウントを書き込む必要があります。それ以外の場合、コンテナはデータへの読み取りアクセスのみを必要とします。複数のコンテナーが同じボリュームをマウントでき、一部のコンテナーは読み取り/書き込みでマウントでき、その他のコンテナーは読み取り専用でマウントできることを忘れないでください。

この例では、上記の例を変更しますが、コンテナー内のマウントポイントの後にオプションリスト(デフォルトでは空)にroディレクトリを追加することにより、ディレクトリを読み取り専用ボリュームとしてマウントします複数のオプションがある場合は、コンマで区切ります。

ここ--mount-vサンプルの結果は同じです。

--mount

$ docker run -d \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
  nginx:latest

-v

$ docker run -d \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html:ro \
  nginx:latest

docker inspect nginxtest読み取り専用マウントが正しく作成されていることを確認するために使用します。Mountsパーツを表示

"Mounts": [
    {
    
    
        "Type": "volume",
        "Name": "nginx-vol",
        "Source": "/var/lib/docker/volumes/nginx-vol/_data",
        "Destination": "/usr/share/nginx/html",
        "Driver": "local",
        "Mode": "",
        "RW": false,
        "Propagation": ""
    }
],

コンテナを停止して削除してから、ボリュームを削除します。ボリュームの削除は別の手順です。

$ docker container stop nginxtest

$ docker container rm nginxtest

$ docker volume rm nginx-vol

マシン間でデータを共有する

フォールトトレラントアプリケーションを構築する場合、同じファイルにアクセスするために、同じサービスの複数のコピーを構成する必要がある場合があります。
docker-volumes-shared-storage

アプリケーションを開発する場合、これを実現する方法はいくつかあります。1つの方法は、アプリケーションにロジックを追加して、AmazonS3などのクラウドオブジェクトストレージシステムにファイルを保存することです。もう1つの方法は、外部ストレージシステム(NFSやAmazon S3など)へのファイルの書き込みをサポートするドライバーを使用してボリュームを作成することです。

ボリュームドライバーを使用すると、基盤となるストレージシステムをアプリケーションロジックから抽象化できます。たとえば、サービスがNFSドライバーを備えたボリュームを使用している場合、アプリケーションロジックを変更せずに、別のドライバーを使用するようにサービスを更新できます(たとえば、データをクラウドに保存します)。

ボリュームドライバーを使用する

docker volume createボリュームを作成するときに使用する場合、またはコンテナーのボリュームが作成されていない場合に使用を開始する場合は、ボリュームドライバーを指定できます。次の例では、vieux/sshfsボリュームドライバーを使用します。これは、最初に個別のボリュームを作成するときに使用し、次に使用中にコンテナーに新しいボリュームの作成を開始します。

初期設定

この例では、2つのノードがあることを前提としています。最初のノードはDockerホストであり、SSHを使用して2番目のノードに接続できます。

ホストコンピューターにDockerをインストールし、vieux/sshfsプラグインをインストールします。

$ docker plugin install --grant-all-permissions vieux/sshfs

ボリュームドライバーを使用してボリュームを作成する

この例ではSSHパスワードを指定していますが、2つのホストが共有キーで構成されている場合は、パスワードを省略できます。各リールドライバーは、0個以上の構成可能なオプションである場合があり、各オプションは-o指定されたタグを使用します。

$ docker volume create --driver vieux/sshfs \
  -o sshcmd=test@node2:/home/test \
  -o password=testpassword \
  sshvolume

ボリュームドライバーを使用してボリュームを作成するコンテナーを起動します

この例ではSSHパスワードを指定していますが、2つのホストが共有キーで構成されている場合は、パスワードを省略できます。各ボリュームドライバーには、0個以上の構成可能なオプションがあります。ボリュームドライバでオプションを渡す必要がある場合は、を使用するの--mountではなくタグを使用してボリュームをマウントする必要があります-v

$ docker run -d \
  --name sshfs-container \
  --volume-driver vieux/sshfs \
  --mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
  nginx:latest

NFSボリュームを作成するためのサービスを作成する

この例は、サービスを作成するときにNFSボリュームを作成する方法を示しています。この実施形態10.0.0.10は、NFSサーバとして使用され、NFSサーバ/var/docker-nfs上のディレクトリのアウトレットとして使用される。指定されたボリュームドライバはlocalですのでご注意ください

NFSV3

$ docker service create -d \
  --name nfs-service \
  --mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,volume-opt=o=addr=10.0.0.10' \
  nginx:latest

NFSV4

docker service create -d \
    --name nfs-service \
    --mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,"volume-opt=o=10.0.0.10,rw,nfsvers=4,async"' \
    nginx:latest

データボリュームのバックアップ、復元、または移行

ボリュームは、バックアップ、復元、および移行に非常に役立ちます。--volumes-fromマーカーを使用して、ボリュームをマウントするための新しいコンテナーを作成します。

バックアップコンテナ

たとえば、newcontainerというファイルを作成しますdbstore

$ docker run -v /dbdata --name dbstore ubuntu /bin/bash

次に、次のコマンドで、次のことを行います。

  • 新しいコンテナを開始し、dbstoreコンテナにマウントされたボリュームから
  • ローカルホストディレクトリを次のようにマウントします /backup
  • コマンドを渡し/dbdataたディレクトリにボリュームの内容/backupbackup.tarファイル。
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

コマンドが完了して船舶が停止すると/dbdata、バックアップボリュームが残りました。

バックアップからコンテナを復元する

作成したバックアップを使用して、同じコンテナまたは別の場所で作成したコンテナに復元できます。

たとえば、newcontainerというファイルを作成しますdbstore2

$ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash

次に、バックアップファイルを新しいコンテナのデータボリュームに解凍します。

$ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"

上記の手法を使用して、お気に入りのツールを使用してバックアップ、移行、および復元のテストを自動化できます。

ボリュームを削除する

コンテナが削除されても、Dockerデータボリュームは引き続き存在します。考慮すべきボリュームには2つのタイプがあります。

  • 名前付きボリュームには、たとえば、コンテナの外部からの特定のソースがありawesome:/barます。
  • 匿名ボリュームには特定のソースがないため、コンテナーが削除されると、Dockerエンジンデーモンにそれらを削除するように通知されます。

匿名ボリュームを削除する

匿名ボリュームを自動的に削除するには、--rmオプションを使用します。たとえば、このコマンドは匿名/fooボリュームを作成しますコンテナが削除されると、Dockerエンジンは/fooボリュームを削除しますがawesome、ボリュームは削除しません

$ docker run --rm -v /foo -v awesome:/bar busybox top

すべてのボリュームを削除します

未使用のボリュームをすべて削除してスペースを解放するには:

$ docker volume prune

著者:Dockerの公式ウェブサイト
翻訳者:Technical Zemin
発行元:Technical Verses
リンク:英語のテキスト

公開番号:技術翻訳ステーション

おすすめ

転載: blog.csdn.net/weixin_47498376/article/details/107321042