ボリュームを使用してホストと 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 インストール不要の設定グラフィックチュートリアル

推薦する

CSS スタイルを HTML 外部スタイルシートにインポートする方法

リンクインスタイルとは、すべてのスタイルを 1 つ以上の外部スタイルシート ファイルに配置することで...

Linuxコマンドunzipの詳しい説明

目次1. 解凍コマンド1.1 構文1.2 オプション2. 例1. 解凍コマンドunzip コマンドは...

Dockerにおけるコンテナとイメージの違いについてお話ししましょう

鏡とは何ですか?イメージは、複数のイメージ レイヤー (UnionFS および AUFS ファイル ...

CSSを使用してHTMLテキストボックス内のテキストの垂直方向の中央を制御する

Text の height 属性が定義されている場合、Text に入力されたテキストは垂直方向に中央...

さまざまな Tomcat ログと catalina.out ファイルのセグメンテーションの関係についての簡単な分析

Tomcatログの関係一枚の写真は千の言葉に値する! localhost.{yyyy-MM-dd}....

Linux ソースコードの解析 epoll

目次1. はじめに2. シンプルなepollの例2.1、epoll_create 2.2、構造体イベ...

js+ca​​nvas でコードレイン効果を実現

この記事では、js+ca​​nvasコードの雨効果の具体的なコードを参考までに共有します。具体的な内...

MySQL FAQ シリーズ: 一時テーブルを使用する場合

一時テーブルの概要一時テーブルとは: MySQL は中間結果セットを保存するために使用されます。一時...

CentOSにPHP+Apache+MySQLのサーバー環境をインストールして構築する

Yum (フルネームは Yellow dog Updater, Modified) は、Fedora...

vue3 のさまざまな構文形式を比較したサンプルコード

デフォルトのテンプレートメソッドはvue2に似ており、コンポーネント内のセットアップ関数を使用します...

MySQL メタデータで Hive テーブル作成ステートメントのコメント スクリプトを生成する方法

序文この記事は主にMySQLメタデータ生成Hiveテーブル作成ステートメントコメントスクリプトに関す...

WeChatアプレットAmapマルチポイントルート計画プロセス例の詳細な説明

電話Amap API を呼び出す方法は? Amap が https://lbs.amap.com/a...

Linux で gdb を使用してコア ファイルをデバッグする方法

1.コアファイルプログラム実行中にセグメンテーション エラー (コア ダンプ) が発生すると、プログ...

MYSQL 文字列強制変換メソッドの例

序文2 つのテーブル内の同じフィールドの型が異なっていたり、エンコード タイプが異なっていたりするた...

Linux ユーザー状態とカーネル状態間の通信方法の詳細な説明

CPU 権限の制限により、Linux ユーザー状態とカーネル状態間の通信は、プロセス間通信を使用した...