ボリュームは、Dockerコンテナーが永続データを生成して使用するための推奨メカニズムです。バインドマウントはホストのディレクトリ構造に依存し、ボリュームはDockerによって完全に管理されます。バインドマウントと比較して、ボリュームにはいくつかの利点があります。
- ボリュームは、バインドマウントよりもバックアップまたは移行が簡単です。
- DockerCLIコマンドまたはDockerAPIを使用してボリュームを管理できます。
- ボリュームは、LinuxおよびWindowsコンテナで動作します。
- ボリュームは、複数のコンテナー間でより安全に共有できます。
- ボリュームドライバーを使用すると、ボリュームを保存したり、ボリュームのコンテンツを暗号化したり、リモートホストまたはクラウドプロバイダーに他の機能を追加したりできます。
- 新しいボリュームの内容は、コンテナーによって事前に入力できます。(新しいボリュームには、コンテナーによってコンテンツが事前入力されている場合があります。)
さらに、データをコンテナの書き込み可能なレイヤーに永続化する場合と比較して、ボリュームは通常、ボリュームがそれを使用するコンテナのサイズを増加させず、ボリュームの内容が特定の存続期間外に存在するため、より適切な選択です。コンテナ。
コンテナーが非永続状態データを生成する場合は、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
のいずれであってもよい)bind
、volume
又はtmpfs
。このトピックではボリュームについて説明しているため、タイプ(type
)は常にボリューム(volume
)です。 - マウントのソース(
source
)。名前付きボリュームの場合、これはボリュームの名前です。匿名ボリュームの場合、このフィールドは省略されます。あなたは使用source
またはsrc
指定される場合があります。 - ターゲット(
destination
)、コンテナ内のファイルまたはディレクトリがその値としてマウントされるパス。それは使用することができdestination
、dst
または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
と-v
2つの構文、及び最初のショー--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-service
AuthenticationServiceが実行されています。
$ 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
マシン間でデータを共有する
フォールトトレラントアプリケーションを構築する場合、同じファイルにアクセスするために、同じサービスの複数のコピーを構成する必要がある場合があります。
アプリケーションを開発する場合、これを実現する方法はいくつかあります。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
たディレクトリにボリュームの内容/backup
のbackup.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
リンク:英語のテキスト