ボリュームを使用してホストと 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 カーディナリティ統計の簡単な分析

1. カーディナリティとは何ですか?カーディナリティとは、MySQL テーブルの列内の異なる値の数を...

1 つの記事で Apache Avro データを解析する

概要: この記事では、Avro データをシリアル化して生成し、FlinkSQL を使用して解析する方...

IdeaでMySQLデータベースに接続すると中国語の文字化けが発生する問題

問題: JDBCを使用してMySQLデータベースに接続すると、中国語の文字を挿入すると文字化けした文...

DockerでMySQLマスタースレーブ環境を構築する方法の詳しい説明

序文この記事では、docker-compose と dockerfile を使用して、binlog ...

WeChatアプレットの世界的な状況の詳細な説明

序文WeChat アプレットでは、App.js の globalData を中間ブリッジとして使用し...

React-Native スクリーンショットコンポーネント react-native-view-shot の紹介と使い方のまとめ

目次1. 現象2. 解決策3. 要約: 1. 現象1. 要件: 特定の表示ページをキャプチャしてアル...

vue $http の get および post リクエストのクロスドメイン問題を解決する

Vue $http get および post リクエストのクロスドメイン問題まずconfig/ind...

JavaScript のアンチシェイクとスロットリングの違いと実装

目次1. 手ぶれ補正2. スロットリング3. まとめ序文:フロントエンド開発者には、次の 2 つの要...

HTML ウェブページの段落レイアウトと改行

Web ページの外観はレイアウトに大きく左右されます。ページ内に長い段落のテキストがある場合、通常は...

MySQLの高性能最適化スキルの概要

データベースコマンド仕様すべてのデータベース オブジェクト名には小文字を使用し、アンダースコアで区切...

Win10 に Tomcat サーバーをインストールし、環境変数を構成する詳細なチュートリアル (画像とテキスト)

目次JDKをダウンロードしてインストールするTomcat 圧縮パッケージをダウンロードTomcatの...

Windows 7 64 ビットに最新バージョンの MySQL サーバーをインストールする方法のグラフィック チュートリアル

最近、MySQL データベースを勉強していて、設定ファイルを頻繁に変更したため、MySQL データベ...

HTML の表の行と列を結合する問題の解決策の詳細な説明

私たちが構築しようとしていたウェブサイトには、長い文章だけでなく、多数の表も含まれており、表のレイア...

React setStateデータ更新メカニズムの詳細な説明

目次setStateを使用する理由setStateの使用法非同期または同期更新要約するsetStat...

Linux で Apache を使用してファイル サーバーを構築する手順

1. ファイルサーバーについてプロジェクトでは、公開ソフトウェアやデータをプロジェクト チーム メン...