Docker ボリュームとは何でしょうか?使い方から徹底解説まで!

Docker ボリュームとは何でしょうか?使い方から徹底解説まで!

[[349110]]

Docker は永続ストレージと非永続ストレージの両方をサポートします。

  • 非永続ストレージは自動的に作成され、コンテナーに属します。そのライフサイクルはコンテナのライフサイクルと同じであるため、コンテナを削除すると、すべての非永続データも削除されます。
  • データをコンテナ内に保持する、つまり永続化したい場合は、データをボリュームに保存する必要があります。ボリュームはコンテナから分離されているため、ボリュームは独立して作成および管理でき、ボリュームはコンテナ宣言ライフサイクルにバインドされません。つまり、ユーザーがボリュームに関連付けられたコンテナを削除しても、ボリュームは削除されません。

非永続ストレージ

各コンテナにはローカル ストレージが自動的に割り当てられます。デフォルトでは、コンテナ内のすべてのファイルとディレクトリがこのストレージに保存されます。非永続ストレージはコンテナの一部であり、コンテナと同じライフサイクルを持ちます。つまり、非永続ストレージはコンテナの作成時に作成され、コンテナの削除時に削除されます。

Linuxシステムでは、ストレージディレクトリは/var/lib/docker/です。以下はコンテナの一部です。 storage-driver は、使用するストレージ ドライバーを指します。実稼働環境で Linux 上で Docker を実行する場合は、現在のストレージ ドライバーが現在の Linux バージョンと互換性があるかどうかを確認する必要があります。

  • RedHat Enterprise Linux: Docker 17.06 以降で Overlay2 ドライバーを使用します。
  • Ubuntu: Overlay2 または AUFS ドライバーを使用します。 Linux 4.x 以降のカーネルを使用している場合は、Overlay2 を使用することをお勧めします。

全体的に、Overlay2 ドライバーはますます人気が高まっており、将来的にはほとんどのプラットフォームで推奨されるストレージ ドライバーになる可能性があります。

持続性

コンテナ内にデータを保持するための推奨される方法は、ボリュームを使用することです。つまり、最初にボリュームを作成し、次にそのボリュームをコンテナにマウントします。この時点で、ボリュームはコンテナ ファイル システム内のディレクトリにマウントされ、ディレクトリに書き込まれたすべてのコンテンツがボリュームに書き込まれます。コンテナが削除されても、ボリュームとその上のデータはそのまま残ります。

下の図に示すように、Docker ボリュームはコンテナの /code ディレクトリにマウントされます。 /code ディレクトリに書き込まれたデータは実際には Docker ボリュームに書き込まれ、この Docker ボリュームはコンテナが削除された後も存在し続けます。その他のディレクトリは一時的なローカル ストレージを使用します。

ボリュームは、基本的に Docker ホスト上のディレクトリです。 Docker ホスト内のディレクトリがコンテナ ファイル システム内のディレクトリにマウントされた後、コンテナ ファイル システム内のディレクトリを操作すると、実際には対応する Docker ホスト上のディレクトリを操作することになります。つまり、コンテナはコンテナのファイルシステムにアクセスできるだけでなく、コンテナが配置されている Docker ホストのファイルシステムにもアクセスできるようになります。 「自分の目で確かめてください

ボリュームの作成と表示

  1. docker volumn create myvol # myvolという名前のボリュームを作成します

デフォルトでは、Docker は新しいボリュームを作成するときに組み込みのローカル ドライバーを使用します。このドライバーを使用すると、作成されたボリュームは、コンテナーが配置されている Docker ホストでのみ使用できるようになります (上記ではローカル ドライバーが使用されます)。

ローカル ドライバーに加えて、-d パラメーターを使用して別のドライバーを指定することもできます。サードパーティのドライバーもプラグインを通じて接続できます。これらのドライバーは高度なストレージ機能を提供し、Docker 用の外部ストレージ システムを統合します。ボリューム プラグインは、ブロック ストレージ、ファイル ストレージ、オブジェクト ストレージなどをカバーします。

  • ブロック ストレージ: 比較的高いパフォーマンスを持ち、小さなデータ ブロックのランダム アクセス ロードに適しています。たとえば、Amazon EBS や OpenStack ブロック ストレージ サービスなどです。
  • ファイル ストレージ: 高パフォーマンスのシナリオで優れたパフォーマンスを発揮する NFS および SMB プロトコル システムが含まれます。たとえば、NetApp FAS や Azure ファイル ストレージなどです。
  • オブジェクト ストレージ: ほとんど変更されないバイナリ データを長期にわたって大量に保存するのに適しています。オブジェクト ストレージは通常、コンテンツ アドレス可能であり、パフォーマンスが低くなります。たとえば、Amazon S3 などです。
  1. docker ボリューム ls
  2.  
  3. docker ボリューム検査 [VOLUMN_NAME]

検査コマンドは、対応するボリュームに関する詳細情報を出力します。ドライバーとスコープの両方がローカルの場合、ボリュームはデフォルトのローカル ドライバーを使用して作成され、現在の Docker ホスト上のコンテナーでのみ使用できることを意味します。マウントポイントは、Docker ホスト上のボリュームの場所を示します。ローカル ドライバーを使用して作成されたボリュームには、Docker ホスト上に専用のディレクトリがあります。 Linux では、/var/lib/docker/volumes ディレクトリにあります。

  1. [
  2. {
  3. 「作成日時」 : 「2020-09-28T16:07:25+08:00」
  4. 「ドライバー」 「ローカル」
  5. 「ラベル」 : {},
  6. 「マウントポイント」 : 「/var/lib/docker/volumes/myvol/_data」
  7. 「名前」 : 「myvol」
  8. 「オプション」 : {},
  9. 「スコープ」 「ローカル」  
  10. }
  11. ]

VOLUMNはDockerfileで使用できますコマンドライン インターフェイスを使用してボリュームを展開します。ホスト ディレクトリは通常、ホストに対する相対ディレクトリ (つまり、ホストに関連するディレクトリ) であるため、Dockerfile ではホスト ディレクトリを指定できないことに注意してください。そうすると、このディレクトリはホストごとに異なるため、ビルドが失敗する可能性があります。 Dockerfile で指定する場合は、デプロイするたびにホスト ディレクトリを指定する必要があります。 ”

ボリューム使用量

  1. docker コンテナを実行 -it --name voltainer --mount source=bizvol,target=/vol alpine  

上記のコマンドは、新しい独立したコンテナを作成し、コンテナ内の /vol ディレクトリを bizvol という名前のボリュームにマウントします。コンテナのファイルシステムに /vol ディレクトリが存在しない場合は作成されます。すでに存在する場合はそれが使用されます (その内容がボリュームの内容になります)。同様に、システムに bizvol というボリュームが存在しない場合は、このコマンドによってそのようなボリュームも作成されます。そのようなボリュームがすでに存在する場合は、それが使用されます。

このコンテナを削除しても、ボリューム bizvol はまだ存在します。さらに、コンテナの実行中に /vol ディレクトリに書き込んだデータもこのボリュームに保存されます。以下に示すように、コンテナの実行中に、最初にデータが /vol/file に書き込まれ、その後コンテナが終了して削除されます。その後、ボリュームが配置されているディレクトリを確認し、作成されたファイルと書き込まれたデータがまだ残っていることを確認します。

さらに深く

上記のボリュームの説明は、永続性の観点からのものです。ボリュームのもう 1 つの主要な機能は、コンテナ ファイル システムとホスト ファイル システムを「接続」することです。これにより、コンテナ内の指定されたディレクトリに作成されたファイルにホストからアクセスでき、ホスト上の指定されたディレクトリ内のファイルにコンテナ内のプロセスからアクセスできるようになります。それで、これはどのように行われるのでしょうか?

ここでは主に Linux のバインドマウント メカニズムが使用されます。その主な機能は、指定されたディレクトリにディレクトリまたはファイルをマウントすることです。さらに、マウント ポイントで実行する後続の操作は、マウントされたディレクトリまたはファイルに対してのみ実行され、元のマウント ポイントの内容は非表示になり、影響を受けません。バインドマウントは、実際には inode の置換プロセスです。たとえば、mount --bind /home /test を実行すると、/home が /test にバインド モードでマウントされます。この操作は、実際には /test を /home の inode にリダイレクトすることと同じです。したがって、/test ディレクトリを変更すると、実際には /home ディレクトリの inode が変更されます。

したがって、「コンテナ プロセス」が作成され、コンテナの rootfs が準備された後、chroot の前に、ボリュームで指定されたホスト ディレクトリを、ホスト上の指定されたコンテナ ディレクトリに対応するディレクトリにマウントするだけで済みます (この時点では、コンテナ プロセスは常にホスト上のファイル システム全体を参照でき、このマウント操作の実行時にコンテナが作成されているため、マウント名前空間はこの時点で有効になっているのと同じであり、マウント イベントはコンテナ内でのみ表示されます)。

ここでのコンテナ プロセスは、アプリケーション プロセス (ENTRYPOINT+CMD) ではなく、Docker によって作成されたコンテナ初期化プロセス (dockerinit) です。 dockerinit は、ルート ディレクトリの準備、デバイスとディレクトリのマウント、ホスト名の構成など、コンテナー内で実行する必要がある一連の初期化操作を完了する役割を担います。最後に、execv() システム コールを通じて、プロセスは自身を置き換え、コンテナー内で PID=1 のプロセスになります。 「ボリュームは指定されたコンテナ ディレクトリにマウントされ、ホスト上の対応するディレクトリは読み取りおよび書き込み可能なレイヤーにあるため、docker commit 中に送信されますか? いいえ。これは主に、docker commit がホスト空間で発生し、マウントがコンテナ内で発生し、マウント名前空間の分離によりこのマウントがホストに影響を与えないためです。つまり、ホスト上にそのようなマウントはありません。したがって、コミット中に送信されるのは、/test が実際には読み取りおよび書き込み可能なレイヤーに作成されるため、空のディレクトリのみです (マウント名前空間はマウント関連にのみ影響するため、この作成はマウント名前空間の影響を受けません)。

これを試してみましょう。まず、コンテナを起動し、コンテナ内の /test ディレクトリにマウントされたボリュームをコンテナが使用できるようにします。次に、コンテナの /test ディレクトリに test.txt という名前の新しいファイルを作成します。

次に、ボリュームの場所に移動して、対応する test.txt ファイルが作成されているかどうかを確認します。結果には、test.txt ファイルが作成されたことが示されています。その後、読み取りおよび書き込み可能なレイヤーに対応するディレクトリに移動して、test.txt ファイルがあるかどうかを確認します。結果には、テスト ディレクトリは存在しますが、test.txt ファイルは存在しないことが示されています。したがって、docker commit を実行すると、空のテスト ディレクトリのみが送信されます。

一般的なコマンドの概要

  1. # myvol という名前のボリュームを作成します。デフォルトでは、新しいボリュームはローカルスタートアップを使用して作成されますが、-dを使用して別のドライバーを指定することもできます。
  2. docker ボリューム作成myvol
  3.  
  4. # ローカル Docker ホスト上のすべてのボリュームを一覧表示します
  5. docker ボリューム ls
  6.  
  7. # ボリュームの詳細情報を表示します。このコマンドを使用すると、Docker ホスト ファイル システム内のボリュームの特定の場所を表示できます。
  8. docker ボリューム検査 [VOLUMN_NAME]
  9.  
  10. # コンテナまたはサービスにロードされていないすべてのボリュームを削除します。コンテナまたはサービスによって使用されているボリュームは削除しないでください。
  11. docker ボリュームのプルーニング
  12.  
  13. # 指定されたボリュームを削除します。コンテナまたはサービスによって使用されているボリュームを削除することはできません。
  14. docker ボリューム rm [ボリューム名]
  15.  
  16. # 新しいコンテナを作成し、コンテナ内の /vol ディレクトリを bizvol という名前のボリュームにマウントします。コンテナのファイルシステムに /vol ディレクトリが存在しない場合は作成されます。すでに存在する場合はそれが使用されます (その内容がボリュームの内容になります)。同様に、システムに bizvol という名前のボリュームが存在しない場合は、このコマンドによってそのようなボリュームが作成されます。そのようなボリュームがすでに存在する場合は、それが使用されます。
  17. docker コンテナを実行 -it --name voltainer --mount source=bizvol,target=/vol alpine  
  18.  
  19. # ホスト ディレクトリが明示的に宣言されていない場合は、ホスト上に一時ディレクトリ /var/lib/docker/volumn/[volume_name]/_data が作成され、コンテナの /test ディレクトリにマウントされます。
  20. docker run -v /test ...
  21.  
  22. #ホストの/homeディレクトリをコンテナの/testディレクトリにマウントする
  23. docker run -v /home:/test ...

この記事はWeChatの公開アカウント「Multi-Select Parameters」から転載したものです。以下のQRコードからフォローできます。この記事を転載する場合は、Multi-Select Parameters の公開アカウントにご連絡ください。

<<:  IDC: 世界のエッジコンピューティング市場は2024年に2,506億ドルに達する

>>:  Ansible の Kubernetes モジュールを使用したコンテナ オーケストレーションの自動化

推薦する

WeChatの第一層入口がJD.comにオープンし、WeChatストアが全面的にオープン

【Ebrun Power Networkニュース】4月17日、情報筋はEbrun Power Net...

一歩先へ:百度諾米O2Oチェスゲームでリンクされた馬

2014年、BATが地元の生活の場に参入すると、ほとんど忘れ去られていた共同購入業界が突如として熱を...

O2Oが伝統的なサービス産業をどう覆すかをご覧ください。インターネットの3大巨頭がO2O分野に集結

文/ビアン・ハイフェン電子商取引が人々のショッピング習慣を覆し、Weibo がマスコミュニケーション...

H5 開発者にとって道の終わりなのでしょうか? WeChatは本日「ミニゲーム」を正式に開始しました!

昨年の今頃、張小龍は「 WeChatミニプログラムは今はゲームには使えない」と発言したばかりだった。...

SEO 最適化: Baidu はなぜウェブサイトに公開された最新の記事を掲載しないのでしょうか?

月収10万元の起業の夢を実現するミニプログラム起業支援プラン多くの友人が以前、Mituo にこう尋ね...

TIC 2018で人工知能が熱く議論され、AIが応用段階に突入

[51CTO.com からのオリジナル記事] クラウド コンピューティング、ビッグ データ、ブロック...

V.PSはどうですか?オランダのAS9929高速ネットワーククラウドサーバーの評価

v.ps はオランダで VPS/クラウド サーバー サービスを提供しています。最近、ネットワークは ...

ウェブマスターネットワークからの毎日のレポート:O2Oは弱く、打破する必要がある。百度は360度検索により大きな損失を被った。

1. TudouとYoukuの合併後、「1234」ビデオウェブサイトのパターンが徐々に形成されました...

buyvm-公式SSD VPSが販売開始

本日より buyvm が正式に SSD ハード ドライブをリリースすることをお知らせします。これは、...

sharktech: 10% 割引コード/40g 高防御/98 ドルから Los Angeles E3-1270v2

ロサンゼルス データ センターの Sharktech の E3-1270v2 シリーズは現在 10%...

ウェブサイト構築における小さな親切行為を怠らないようにし、マーケティングにおける小さな悪行を怠らないようにする

ウェブサイトの構築と開発は、ウェブマスターにとって最優先事項です。ウェブマスターにとって、1日食事を...

終末の日11.11: タオバオストアのホリデープロモーションに関する興味深い話

伝説によると、今年は世界の終わりの年だそうです。今年の独身の日は11月11日です。おしゃべりはやめて...

分散ストレージのメタデータ設計

[[247858]]従来のストレージ設計方法には、主に以下のカテゴリが含まれます。 GlusterF...

インフルエンサー マーケティングがブランド オーナーにとって魅力的なのはなぜでしょうか?

月収10万元の起業の夢を実現するミニプログラム起業支援プラン「インターネット」がツールとなり、オンラ...