Docker コンテナ データ ボリュームの名前付きマウントと匿名マウントの問題

Docker コンテナ データ ボリュームの名前付きマウントと匿名マウントの問題

コンテナデータボリュームとは

コンテナデータボリュームはディレクトリのマウントです。コンテナのディレクトリはホストマシンにマウントされ、ホストマシンとコンテナ間のファイル共有機能を実現します。

コンテナ データ ボリュームが必要なのはなぜですか?

Docker の考え方は、アプリケーションと環境をイメージにパッケージ化することですが、データはどうでしょうか?データベースはもちろん、プロジェクトでは運用中に大量のログが生成されます。これらのログは開発者にとって非常に重要です。これらのログがあれば、運用中にどのような問題が発生したかを把握し、トラブルシューティングを行うことができます。

しかし、コンテナでは、プロジェクトが更新されて反復されるたびに、コンテナが削除され、新しいイメージに置き換えられます。この場合、これらのログファイルを保存したい場合、毎回ホストマシンにコピーすると、作業負荷が少し大きくなり、ログファイルが大きすぎると、コピー作業にも非常に時間がかかり、労力がかかります。そのため、このときは、コンテナデータボリューム機能を使用する必要があります。簡単に言えば、この機能は非常にシンプルで、ホストとコンテナ間のファイル共有機能を開くことです。Dockerコンテナで生成されたデータファイルは、リアルタイムでホストマシンに同期されます。逆に、ホストマシンで生成されたファイルもコンテナに同期されます。このようにして、双方向の伝送パイプラインが開かれます。

ここに画像の説明を挿入

コンテナ間でデータ共有が実装されると、共有データのコピーが 1 つだけ存在し、それがホスト マシンに保存されるため、メイン コンテナとサブ コンテナの区別がなくなります。いずれかのコンテナを削除しても、他のコンテナのデータ同期には影響しません。

ここに画像の説明を挿入

使用

コンテナ データ ボリュームの使用は非常に簡単です。実行時に-vオプションを追加するだけです。

docker run -d -v ホストディレクトリ: コンテナディレクトリ tomcat

上記のコマンドを実行すると、コンテナとホスト上に対応するディレクトリが自動的に作成され、ディレクトリ内で作成または変更されたファイルが自動的に同期されます。

データボリュームが使用されているかどうかを確認する方法

コンテナがコンテナ データ ボリューム機能を使用しているかどうかを確認するには、 inspect機能を使用してコンテナの詳細情報を表示します。

docker コンテナ ID/コンテナ名を検査する

上記のコマンドを実行すると、フォーマットされた JSON 文字列が多数出力されます。この時点で、キーMountsを持つ項目がコンテナ データ ボリュームの関連構成であることがわかります。

「マウント」: [
    {
        「タイプ」:「バインド」  
        "Source": "/root/dockerContainer", # ホストマシンのディレクトリ "Destination": "/text", # コンテナのディレクトリ "Mode": "",
        "RW": true、# RW は読み取りおよび書き込み可能です。ro は読み取り専用で、ホスト マシン上のファイルのみを変更できます。 
        「伝播」: 「rprivate」
    }
]、

名前付きマウントと匿名マウント

パスを指定してマウントする

上記の例では、指定されたパスマウントを使用します。つまり、ホスト パスとコンテナー パスを構成します。

docker run -d -v ホストディレクトリ: コンテナディレクトリ tomcat

名前付きマウント

指定された名前のディレクトリにマウントします。

# /xxx はディレクトリ、xxx はボリューム名、スラッシュのない方がボリューム名です docker run -d -v ボリューム名: コンテナ ディレクトリ tomcat 

# ボリューム名があるディレクトリを探す docker volume examine volume name

テストしてみましょう。まず、コンテナを作成し、ディレクトリをマウントします。

docker run -d --name my_tomcat -v my_folder:/data/my_folder tomcat

コンテナ情報を表示するにはinspectコマンドを使用します

docker で my_tomcat を検査する

印刷された情報でMounts項目を見つけます。 Sourceディレクトリはホスト ディレクトリ、 Destinationディレクトリはマウントされたコンテナー ディレクトリです。

「マウント」: [
    {
        「タイプ」:「ボリューム」、
        "名前": "my_folder",
        「ソース」: 「/var/lib/docker/volumes/my_folder/_data」、
        「宛先」: 「/data/my_folder」、
        "ドライバー": "ローカル",
        "モード": "z",
        「RW」:真、
        「伝播」: 「」
    }
]

次にコンテナに入ります

docker exec -it my_tomcat /bin/bash

# このディレクトリはコンテナ内にも作成されています root@ef94ff8928a1:/data/my_folder# pwd
/データ/私のフォルダ

匿名マウント

匿名マウントとは、コンテナ ディレクトリのみが存在し、ホスト ディレクトリが存在しないことを意味します。そのため、生成されるディレクトリは長い暗号化された文字列になります。一般に、匿名マウントは推奨されません。暗号化された文字列は見つけにくくなるためです。

docker run -d -v \コンテナディレクトリ tomcat

さあ、テストしてみましょう。まずコンテナを作成し、ディレクトリをマウントします。

docker run -d --name my_tomcat_2 -v /my_folder_2 tomcat

コンテナ情報を表示するにはinspectコマンドを使用します

docker で my_tomcat_2 を検査する

印刷された情報でMounts項目を見つけます。 Sourceディレクトリはホストディレクトリ、 Destinationディレクトリはマウントされたコンテナディレクトリです。

「マウント」: [
    {
        「タイプ」:「ボリューム」、
        「名前」: 「df4c649772a5ae65716de8ede0607d0776f8c1e2eda1d87b3ec9eaf011b43616」、
        「ソース」: 「/var/lib/docker/volumes/df4c649772a5ae65716de8ede0607d0776f8c1e2eda1d87b3ec9eaf011b43616/_data」、
        「宛先」: 「/my_folder_2」、
        "ドライバー": "ローカル",
        "モード": "",
        「RW」:真、
        「伝播」: 「」
    }
]

コンテナ間のデータ共有 - ボリューム -

コンテナ A とコンテナ B でデータを共有する必要があるシナリオがあります。つまり、コンテナ A で変更されたコンテンツをコンテナ B で確認したいのです。では、この機能はどのように実現すればよいのでしょうか?次に、データ ボリューム コンテナー機能を使用できます。この機能では、2 つのコンテナーだけでなく、複数のコンテナー間でデータを同期することもできます。

1. 最初のコンテナ centos_1 を作成し、ホストに /data/centos ディレクトリをマウントします。ホストとコンテナのディレクトリは両方とも/data/centosです。

docker run -it --name centos_1 -v /data/centos:/data/centos centos /bin/bash

2. 2 番目のコンテナを作成し、それを最初のコンテナにバインドします。-- --volumes-from centos_1オプションは、現在のコンテナのマウント ディレクトリを centos_1 コンテナにバインドし、コンテナ間のデータ同期を実現します。

docker run -it --name centos_2 --volumes-from centos_1 centos /bin/bash

3. 3番目のコンテナを作成し、2番目のコンテナcentos_2にバインドします。

docker run -it --name centos_3 --volumes-from centos_2 centos /bin/bash

次に、各コンテナの/data/centosディレクトリにファイルを作成します。

  • ホストマシンの/data/centosディレクトリにmain.javaファイルを作成します。
  • centos_1コンテナの/data/centosディレクトリにcentos_1.javaファイルを作成します。
  • centos_2 コンテナの /data/centos ディレクトリにcentos_2.javaファイルを作成します。
  • centos_3コンテナの/data/centosディレクトリにcentos_3.javaファイルを作成します。

最後に、4つの環境の/data/centosディレクトリでlsコマンドを実行すると、すべてのコンテナで作成されたファイルを確認できます。このようにして、コンテナ間のデータ同期を実現できます。

[root@259efdc362b4 centos]# ls
centos_1.java centos_2.java centos_3.java メイン.java

これで、docker コンテナ データ ボリューム (名前付きマウントと匿名マウント) に関するこの記事は終了です。docker コンテナ データ ボリュームに関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Dockerの匿名マウントと名前付きマウントの具体的な使用法
  • Docker での名前付きマウントと匿名マウントの実装

<<:  Node.js のイベント モジュールに関する知識ポイントのまとめ

>>:  MySQL 学習: 初心者のための 3 つのパラダイム

推薦する

MySQL ifnull のネスト使用手順

MySQL ifnull のネストされた使用ifnull をネストする方法があるかどうかオンラインで...

Docker イメージに基づいて Go プロジェクトをデプロイする方法と手順

知識への依存Go クロスコンパイルの基礎Dockerの基礎Dockerfileカスタムイメージの基本...

CSS3 フィルターの違いと応用の詳しい説明:ドロップシャドウフィルターとボックスシャドウ

標準 CSS3 を使用して要素の影の効果を実現するには、2 つの手順があります。1 つ目は一般的なb...

意外と知らないLinuxのSSHコマンドの使い方7選を徹底解説

システム管理者は複数のサーバーを同時に管理する場合があり、これらのサーバーは異なる場所に配置されてい...

MySQL ルートパスワードをリセットする方法

目次1. ルートパスワードを忘れてしまい、データベースにアクセスできない: DBA にとって、スーパ...

JSにおけるnewの原理と実装について詳しく話しましょう

目次意味コンストラクタ本体は異なる戻り値なし戻りオブジェクト非オブジェクトを返すプロパティバインディ...

Linux yum コマンドを使用して mysql8.0 をインストールする方法の詳細なチュートリアル

1. 設置前によく掃除する rpm -pa | grep mysql または rpm -qa | g...

検索エンジンのウェブサイトの入り口の無料コレクション

1: Baiduウェブサイトログイン入口ウェブサイト: http://www.baidu.com/s...

CSS スティッキーレイアウトを使用してヘッダーを上部に配置する方法

適用シナリオ:新しい要件の 1 つはアンケート調査を行うことですが、必然的に多くの質問が含まれ、1 ...

CentOS 上での MySQL 5.6 のコンパイルとインストール、および複数の MySQL インスタンスのインストールの詳細な説明

--1. mysql用の新しいグループとユーザーを作成する # ユーザー追加 -M -s /sbin...

CSSアニメーションとSVGを組み合わせてエネルギーの流れの効果を作成する

最終的な効果は次のようになります。アニメーションは2つのステップに分かれていますランニング軌道を開発...

Iframe 適応高さコードに関する 3 つの議論

B/S システム インターフェースを構築する場合、メイン ページ index.html 内に他のペー...

CSS3 ベジェ曲線の例: リンクホバーアニメーション効果の作成

CSS3 アニメーション トランジションを使用して、リンクの上にマウスを移動すると小さなポップアップ...

VMware Workstationはデバイス/資格情報ガードと互換性がありません

仮想マシンをインストールするときに、「VMware ワークステーションはデバイス/資格情報ガードと互...

Docker ロード後にイメージ名が none になる問題の解決方法

最近、docker load -i コマンドを使用してイメージ パッケージを圧縮した後、イメージ名と...