Dockerでボリュームを管理する2つの方法

Dockerでボリュームを管理する2つの方法

前回の記事では、Dockerの基礎知識であるローカルディレクトリのマウント方法を紹介しました。今日は、Dockerでデータボリュームを管理する2つの方法を紹介します。具体的な内容は以下のとおりです。

データボリュームとは

データ量:ボリュームとは、1 つ以上のコンテナー内に存在する特定のファイルまたはフォルダーです。このディレクトリは、ユニオン ファイル システムから独立した形式でホスト マシン内に存在し、データの共有と永続化を容易にします。

データ ボリュームを使用する理由は何ですか?

Docker 階層化ファイルシステムの問題:
Docker イメージは一連の読み取り専用レイヤーで構成されています。コンテナを起動すると、Docker はイメージのすべての読み取り専用レイヤーを読み込み、その上に読み取り/書き込みレイヤーを追加します。この設計により、Docker はイメージの構築、保存、配布の効率を向上させ、時間とストレージ スペースを節約できます。ただし、次のような問題もあります。
1. パフォーマンスが悪い。
2. 複数のコンテナ間でデータを共有することはできません。
3. ライフサイクルはコンテナのライフサイクルと同じです。コンテナを削除すると、コンテナによって生成されたデータは失われます。データ ボリューム メカニズムの利点:
1. 階層化ファイルシステムをバイパスしてホストにマウントします。
2.ボリュームは異なるコンテナ間で共有および再利用できます。
3. ホスト ディスクと同じパフォーマンス。
4. ボリューム内のデータに対する操作はイメージ自体には影響しません。
5.ボリュームのライフサイクルは、コンテナのライフサイクルとは独立しています。コンテナが削除されても、ボリュームは存在し続けます。どのコンテナにも使用されていないボリュームは、Docker によって削除されません。
Docker はボリュームドライバー インターフェースを提供します。このインターフェースを実装することで、Docker コンテナにさまざまなボリューム ストレージ サポートを提供できます。現在、ローカル ボリューム ドライバーがデフォルトで実装されており、ホストのファイル システムを使用して Docker コンテナーにボリュームを提供します。

データ量を管理する2つの方法

Docker ボリュームの本質は、コンテナ内の特別なディレクトリです。コンテナーの作成プロセス中に、Docker はホスト上の指定されたディレクトリ (ボリューム ID で名前が付けられたディレクトリ、または指定されたホスト ディレクトリ) をコンテナー内の指定されたディレクトリにマウントします (bing マウント メソッドを使用)。そのため、マウントが完了した後のホスト ディレクトリとコンテナー内のターゲット ディレクトリは一致します。

1. バインドマウント

バインドマウントは、ホスト上のディレクトリまたはファイルをコンテナにマウントすることです。直感的で効率的に使用でき、理解しやすいです。
-vオプションを使用して、マウント パスを<host path>:<container path>形式で指定します。
#最初の部分はホストマシン上に実際に存在するパスです。2番目の部分はコンテナ内のパスです

nginxイメージを使用してコンテナをバックグラウンドで実行し、ホストの/dataディレクトリをコンテナのディレクトリ/usr/share/nginx/htmlにマウントします。[root@server1 ~]# docker run -d --name demo -v /data:/usr/share/nginx/html nginx 

ここに画像の説明を挿入

フォアグラウンドに切り替えて実行し、ホストとコンテナのそれぞれ指定されたディレクトリの内容を確認します。同じです。これは、このマウント方法が、通常使用するマウント方法と同じであるためです。元のデータは隠され、ホストマシンのデータに置き換えられます。
##Dockerのデフォルトのデータディレクトリは/dataなので、/dataディレクトリにはたくさんのものがあります

[root@server1 ~]# docker exec -it demo bash 

ここに画像の説明を挿入

バインドマウントのデフォルトの権限は読み取り/書き込み (rw) ですが、マウント時に読み取り専用 (ro) を指定できます。

-v オプションで指定されたパスが存在しない場合は、マウント時に自動的に作成されます。
docker run -it --name vm1 \ /etc/yum.repos.d/dvd.repo:/etc/yum.repos.d/dvd.repo:ro rhel7 bash

2. Docker管理ボリューム

バインドマウントではホストファイルシステムのパスを指定する必要があり、移植性が制限されます。
Docker 管理ボリュームではマウント ソースを指定する必要はなく、Docker はコンテナーのデータ ボリューム ディレクトリを自動的に作成します。作成されるデフォルトのデータ ボリューム ディレクトリはすべて /var/lib/docker/volumes にあります。
マウントがコンテナ内の既存のディレクトリを指している場合、コンテナ内の元のデータがボリュームにコピーされます。
ボリュームを作成する方法:

[root@server1 ~]# docker volume create webdata #webdataという名前のボリュームを作成します[root@server1 ~]# docker rm -f demo #上記で作成したボリュームを削除します[root@server1 ~]# docker run -d --name demo -v webdata:/usr/share/nginx/html nginx		
#コンテナ内の/usr/share/nginx/htmlディレクトリにwebdataボリュームをマウントし、コンテナを実行します

作成したWebデータボリュームをコンテナの/usr...ディレクトリにマウントします。
ここに画像の説明を挿入
Dockerがデフォルトで作成するデータボリュームのディレクトリに入り、ボリュームの中身を確認します。上ではボリュームが作成されているだけで、何も書き込まれていないことがわかります。ただし、ボリューム内の内容は、マウント時にコンテナ内の指定ディレクトリに何かあったため、それをコピーしたためです。
ここに画像の説明を挿入
コンテナを実行するために nginx イメージを使用します。アクセスに問題はありません。
ここに画像の説明を挿入
マウント時にマウント ソースが指定されていない場合、Docker は長いファイル名を持つランダムなボリュームを自動的に作成します。

[root@server1 ~]# docker rm -f デモ
[root@server1 ~]# docker run -d --name demo -v /usr/share/nginx/html nginx
67ab13a7b24c19c53f4ce117136b9d0e4dec93c615a0192ead919d10e6c2acae 

ここに画像の説明を挿入
ボリュームのソースディレクトリを表示するには、dockerinspectdemoコマンドを使用します。
ここに画像の説明を挿入
パスを取得したら、ディレクトリの内容を表示できます。

ls /var/lib/docker/volumes/2ca22fd769e4b7b6f5a02dd96fe8d47a6df5578074c0d340ced3ab33b25456ca/_data 

ここに画像の説明を挿入

バインドマウントとDocker管理ボリュームの比較

類似点: どちらもホスト ファイル システム内のパスです。
違いは図に示されています:
ここに画像の説明を挿入

これで、Docker でボリュームを管理する 2 つの方法についての説明は終了です。Docker ボリュームの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker のコンテナ データ ボリュームの概要
  • Dockerボリューム削除操作
  • Dockerボリュームのファイルマッピング方法
  • Dockerボリュームマウントの実装方法
  • Docker データ ストレージ ボリュームの詳細な説明
  • Docker ボリュームの使用の詳細と例
  • Dockerはデータボリュームにデータを書き込む

<<:  MySQL における IF()、IFNULL()、NULLIF()、および ISNULL() 関数の使用に関する詳細な説明

>>:  リンクをクリックしたときに表示される点線のボックスを削除するいくつかの方法

推薦する

Vue はモバイル端末にマルチグリッド入力ボックスを実装

最近、同社は、下図に示すように、h5 ページ操作を完了するという要件を提示しました。 ネットで入手で...

MySQL 5.7.20 解凍版のインストールとルートパスワードの変更に関するチュートリアル

1. MySQL アーカイブ (解凍版) をダウンロードするURL: https://downloa...

HTML テーブルタグチュートリアル (26): セルタグ

<TD> タグの属性は、テーブル内のセルのプロパティを設定するために使用されます。表 &...

MySQL サブクエリとグループ化されたクエリ

目次概要サブクエリサブクエリの分類クエリの結果によるとサブクエリの位置で区別する選択後のサブクエリサ...

JavaScript は最大値と最小値のアルゴリズムを通じて AI 三目並べゲームを実装します

では、早速スクリーンショットを実行してみましょう。黒い駒はプレイヤーの位置、赤い駒はコンピュータの位...

MySQLの基本操作学習ノートテーブル

テーブルを作成テーブルテーブル名を作成create table if not exists 表名 m...

Docker で Let's Encrypt から永久無料 SSL 証明書を取得する方法

1. 原因公式の cerbot は面倒すぎます。野生の成長よりもさらに悪い acme.sh の使用は...

MySQL 8.0.22 のインストールと設定のグラフィックチュートリアル

MySQL8.0.22のインストールと設定(超詳細)参考までに、具体的な内容は次のとおりです。みなさ...

Linux で mysql-8.0.20 をインストールするための詳細なチュートリアル

** Linuxにmysql-8.0.20をインストールする**環境の紹介オペレーティングシステム:...

初心者がHTMLタグを学ぶ(1)

初心者は、いくつかの HTML タグを理解することで HTML を学習できます。この入門書は、初心者...

Mysql5.7でのスケジュールバックアップの実装

1. MySQL インストール パス D:\xxx\MYSQL\MySQL Workbench CE...

MySQLとRedisキャッシュ間の同期ソリューションについての簡単な説明

目次1. ソリューション 1 (UDF)デモケース2. ソリューション2(binlogの解析)キャナ...

VSCode 開発 UNI-APP 構成チュートリアルとプラグイン

目次前面に書かれた予防開発環境構築開発構成に関する注意事項前面に書かれたuni-app は、Vue....

Vue でのキープアライブコンポーネントの使用例

問題の説明(キープアライブとは何か)キープアライブ 名前の通り、アクティブな状態を維持します。誰が活...

MySQL 5.7.17 winx64 解凍版のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 5.7.17 winx64解凍版のインストールと設定方法を紹介します。具体...