ボリュームを使用してホストと Docker コンテナ間でファイルを転送する方法

ボリュームを使用してホストと Docker コンテナ間でファイルを転送する方法

以前、Docker コンテナとローカル マシン間のファイル転送に関する記事を書きました。しかし、この方法は比較的面倒です。データ管理に関する公式ドキュメントを確認したところ、ボリュームを使用してホストとコンテナ間のファイル転送を実現する方が効率的であることがわかりました。実際には、ローカルディレクトリをコンテナにマウントすることです。公式の方法は3つあります。Dockerでデータを管理する、

ここではボリュームを使用する操作のみを紹介します。ボリュームを使用する

1. ボリュームを使用して、ホストとコンテナ間でファイルを転送します。

公式ドキュメントでは、次のコマンドを使用してボリュームを作成できることがわかります。

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

$ docker ボリューム作成 my-vol

このコマンドはすべての Docker バージョンで使用できるわけではないことに注意してください。

このコマンドを使用するには、クライアントとデーモン API の両方が少なくとも 1.21 である必要があります。クライアントとデーモン API のバージョンを確認するには、クライアントで docker version コマンドを使用します。

作成後、詳細情報を表示できます。

$ docker ボリューム検査 my-vol 

このマウントポイントに対応するディレクトリは、ホストとコンテナ間でファイルを転送するために使用するディレクトリであることに注意してください。

次に、run を使用してコンテナを起動するときにボリュームを使用できます。

-v コマンドにより、先ほど作成したデータボリュームがコンテナ内の hostdata ディレクトリにマウントされていることがわかります。このとき、コンテナ内の hostdata ディレクトリにファイルを追加すると、ホスト上の /var/lib/docker/volumes/my-vol/_data に表示されます。同様に、ホスト上のこのディレクトリにファイルを追加すると、コンテナの hostdata にも表示されます。

nginx ファイルをホスト内の exchange に使用されるディレクトリにコピーし、コンテナに入った後、hostdata ディレクトリでも表示できます。

同様に、ファイルをコンテナ内の hostdata ディレクトリにコピーすると、ホスト上の /var/lib/docker/volumes/my-vol/_data で表示できます。

ここで、コンテナ内にファイル testfile を作成し、それに「This is container write!」と書き込み、次にホストに戻ってそれを表示します。次に、ホストで vim を使用してそれに「This is host write!」と追加し、コンテナに戻ってそれを表示します。

2. データ ボリューム コンテナーを使用します。

複数のコンテナ間でデータを共有するためにデータ ボリューム コンテナを使用する人がいるのを見たことがあります。プロセスは次のとおりです。

1. まず、データ ボリューム コンテナー dbdata を作成し、その中にデータ ボリュームを作成して /bdata にマウントします。

docker volume ls を使用すると、ランダムな名前のボリュームを表示できます。

2. 次に、他のコンテナで --volumes-from を使用して、dbdata コンテナにデータ ボリュームをマウントします。たとえば、db1 と db2 という 2 つのコンテナを作成し、dbdata コンテナからデータ ボリュームをマウントします。

3. この時点で、3 つのコンテナのいずれかの /dbdata ディレクトリへの書き込みは、他のコンテナでも確認できます。

図では、testfile ファイルは dbdata コンテナに作成され、「dbdata container write!」に書き込まれます。次に、db1 コンテナ「db1 container write!」で表示され、書き込まれます。次に、db2 コンテナ「da2 container write!」で表示され、書き込まれます。最後に、dbdata コンテナで再度表示されます。

4. 次に、複数の –volumes-from を介して複数のデータ ボリュームをマウントすることもできます。また、インターネット上に大量に見つかるバックアップと回復の方法も提供されます。

3. データ ボリューム コンテナーを使用しないのはなぜですか?

データ ボリューム コンテナーに関する記事を多数見てきましたが、すべて似たような内容です。その後、考えてみると、データボリュームを使用する必要がないことがわかりました(十分に考えていなかったのかもしれません)。

前述のように、データボリュームコンテナは複数のコンテナ間でデータを共有するために使用されますが、この方法は同じローカルディレクトリをマウントすることで実現できます。たとえば、最初の手順で作成した my-vol データ ボリュームを db3 コンテナーと db4 コンテナーの両方にマウントできます。

図では、my-vol データ ボリュームを db3 と db4 にマウントし、それらの中の以前のデータ ファイルを見つけることができました。testfile ファイルを db4 コンテナーに書き込み、db3 コンテナーでも表示しました。

つまり、データボリュームをマウントすることで複数のコンテナでデータを共有することもでき、ホストディレクトリに追加されたファイルはすべてのコンテナで閲覧することもできます。バックアップしたい場合は、フォルダをホスト上のローカルにコピーするだけで済むので便利です。

4. データ ボリューム コンテナーを使用する理由は何ですか?

ただし、データ ボリューム コンテナには、マウントするローカル ディレクトリを指定するという別の優れた機能があります。最初のポイントでは、my-vol という名前のデータ ボリュームを作成します。データ ボリュームがローカルに保存されるディレクトリは、/var/lib/docker/volumes/my-vol/_data です。この名前は非常に長く、操作が不便であることがわかります。データ ボリューム コンテナを使用すると、この問題を解決できます。

たとえば、ホストとコンテナ間のやり取り用のファイルを保存するためだけに、ホスト上にディレクトリを作成しました。つまり、将来コンテナにファイルを転送したい場合、このディレクトリにファイルをコピーするだけで済みます。

docker volume create を使用してデータ ボリュームを作成するときに、ボリュームに対応するローカル ディレクトリを指定できるコマンドは公式ドキュメントに見つかりませんでした (十分に読んでいなかったのかもしれません)。

しかし、/usr/local/datadb ディレクトリだけを使用したいのですが、どうすればよいでしょうか?この時点で、データ ボリューム コンテナーの役割が重要になります。データ ボリューム コンテナーを作成し、データ ボリューム コンテナーにディレクトリをマウントできます。

図では、いわゆるデータボリュームコンテナを作成し、-v パラメータを使用してホストの /usr/local/datadb ディレクトリをその中にマウントしました。次に、コンテナ内にファイル testfile を作成し、それに「HAHAHAHA」と書き込み、それをホスト上で表示しました。

その後、他のコンテナが作成されたら、–volumes-from を使用してデータ ボリューム コンテナをマウントできます。コンテナにファイルを転送する場合は、/usr/local/datadb ディレクトリにコピーするだけです。逆に、コンテナがホストにファイルを転送する場合は、コンテナ内のマウント ディレクトリにコピーするだけです。

バックアップに関しては、ホスト /usr/local/datadb にコピーを割り当て、回復のために再度マウントするだけです。

しかし、問題があります。上記のボリュームマウント操作はすべて、run コマンドを使用して新しいコンテナを作成します。実行中のコンテナを直接マウントできるかどうかについては、長い間検索しましたが、これに関する記事は 1 つしか見つかりませんでしたが、検証していません。ご興味があれば、こちらをご覧ください: https://www.jb51.net/article/157179.htm

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Dockerfile における VOLUME と docker -v の違い
  • Dockerボリュームのファイルマッピング方法
  • Windows Docker をインストールする際の Gitlab ボリューム権限の問題の解決方法
  • Dockerボリュームマウントの実装方法
  • 実行中の Docker コンテナにボリュームを動的に追加する方法
  • Dockerボリューム削除操作

<<:  Reactの3つの主要属性における状態の使用の詳細な説明

>>:  MySQL 5.7 インストール不要の設定グラフィックチュートリアル

推薦する

MySQLは集計関数を使用して単一のテーブルをクエリします

集計関数データセットに作用し、そのデータセットの値を返します。 count: 統計結果のレコード数。...

MYSQL SERVER のログファイルを縮小する方法

トランザクション ログには、関連するデータベースに対する操作が記録され、データベースの回復に関連する...

Vue フィルターの使用とタイムスタンプ変換の問題

目次1. 概念をすぐに認識する: 2. ローカルフィルター: 3. グローバルフィルター: 4. 拡...

Linux でパスワードの有効期限を表示および設定する方法

適切な設定を行うことで、Linux ユーザーにパスワードを定期的に変更させることができます。パスワー...

HTML マルチヘッダーテーブルコード

1. マルチヘッダーテーブルコードコードをコピーコードは次のとおりです。 <!DOCTYPE ...

Vueフロントエンドの効率的な開発のためのレンダリング手順をリストします

v-for ディレクティブリストといえば、ループについても触れなければなりません。v-for 命令は...

HTML における li タグの水平配置の例

ほとんどのナビゲーション バーは、下の図に示すように水平に配置されていますが、これはどのように実現さ...

Linux ディスク管理 LVM の使用

1. LVM の概要Linux ディスクを管理するときに、このような状況に遭遇することがよくあります...

HTML テーブルタグチュートリアル (12): 境界線スタイル属性 FRAME

FRAME プロパティを使用して、表の境界線のスタイル タイプを制御します。基本的な構文<T...

MySQLは変数を使用してさまざまなソートを実装します

コアコード -- 以下では、MySQLでのソート列の実装を示します -- テストデータ CREATE...

JavaScript 履歴オブジェクトの説明

目次1. ルートナビゲーション2. 履歴状態管理API (1)ハッシュチェンジイベント(2)ポップス...

モバイルウェブページのサイズ調整を実装する方法

ようやく手元のプロジェクトが終了し、行方不明だった人たちが戻ってきました!プロジェクトを進める過程で...

Docker構成 Alibaba Cloud Container Serviceの操作

Alibaba Cloud Dockerコンテナサービスの設定Alibaba Cloud Image...

ネイティブJSでマウススライドによる愛の拡散効果を実現

この記事では、マウスをスライドすると愛が広がる js 特殊効果を紹介します。効果は次のとおりです。 ...