GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

Ubuntu22.04のDockerコンテナ間でデータを共有する方法

はじめに

Dockerは、実行に必要なすべてのものを含むファイルシステムをソフトウェアアプリケーションに提供するために使用される一般的なコンテナ化ツールです。 Dockerコンテナーを使用すると、ランタイム環境が一貫しているため、ソフトウェアがデプロイされている場所に関係なく同じように動作することが保証されます。

一般に、Dockerコンテナーは一時的なものであり、コンテナーで発行されたコマンドが完了するまで実行されます。ただし、コンテナが削除された後、アプリケーションがデータへのアクセスを共有したり、データを永続化したりする必要がある場合があります。データベース、Webサイト用にユーザーが生成したコンテンツ、およびログファイルは、Dockerイメージに含めることが非現実的または不可能であるが、アプリケーションがアクセスする必要があるデータのほんの一例です。データへの永続的なアクセスは、Dockerボリュームで提供されます。

Dockerボリュームは、コンテナーを作成するのと同じコマンドで作成してアタッチすることも、コンテナーとは別に作成して後でアタッチすることもできます。この記事では、コンテナ間でデータを共有する4つの異なる方法について説明します。

前提条件

この記事をフォローするには、次のUbuntu22.04サーバーが必要です。

  • sudo権限を持つroot以外のユーザー。 Ubuntu 22.04を使用したサーバーの初期設定ガイドでは、これを設定する方法について説明しています。
  • Dockerはステップ1の手順でインストールされます およびステップ2 Ubuntu22.04にDockerをインストールして使用する方法の概要

注: 前提条件には、Ubuntu 22.04にDockerをインストールするための手順が記載されていますが、docker この記事のDockerデータボリュームのコマンドは、Dockerがインストールされ、sudoユーザーがdockerに追加されている限り、他のオペレーティングシステムで機能するはずです。 グループ。

ステップ1—独立したボリュームを作成する

Dockerの1.9リリースで導入されたdocker volume create コマンドを使用すると、特定のコンテナーに関連付けずにボリュームを作成できます。このコマンドを使用して、DataVolume1という名前のボリュームを追加します :

  1. docker volume create --name DataVolume1

コマンドが成功したことを示す名前が表示されます:

OutputDataVolume1

ボリュームを利用するには、--rmを使用して、Ubuntuイメージから新しいコンテナーを作成します。 終了時に自動的に削除するフラグ。 -vも使用します 新しいボリュームをマウントします。 -v ボリュームの名前、コロン、およびボリュームがコンテナ内に表示される場所への絶対パスが必要です。パス内のディレクトリがイメージの一部として存在しない場合、コマンドの実行時にディレクトリが作成されます。彼らがする 存在する場合、マウントされたボリュームは既存のコンテンツを非表示にします:

  1. docker run -ti --rm -v DataVolume1:/datavolume1 ubuntu

コンテナ内で、ボリュームにデータを書き込みます:

  1. echo "Example1" > /datavolume1/Example1.txt

--rmを使用したため フラグを立てると、終了時にコンテナが自動的に削除されます。ただし、ボリュームには引き続きアクセスできます。

  1. exit

docker volume inspectを使用して、ボリュームがシステムに存在することを確認できます。 :

  1. docker volume inspect DataVolume1
Output[
    {
        "CreatedAt": "2018-07-11T16:57:54Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/DataVolume1/_data",
        "Name": "DataVolume1",
        "Options": {},
        "Scope": "local"
    }
]

注: Mountpointとしてリストされているパスにあるホスト上のデータを確認することもできます。 。ただし、アプリケーションやコンテナが変更を認識していない場合、データが破損する可能性があるため、変更は避けてください。

次に、新しいコンテナを起動し、DataVolume1をアタッチします :

  1. docker run --rm -ti -v DataVolume1:/datavolume1 ubuntu

内容を確認します:

  1. cat /datavolume1/Example1.txt
OutputExample1

コンテナを終了します:

  1. exit

この例では、ボリュームを作成し、それをコンテナーにアタッチして、その永続性を検証しました。

ステップ2—コンテナが削除されても持続するボリュームを作成する

次の例では、コンテナと同時にボリュームを作成し、コンテナを削除してから、ボリュームを新しいコンテナにアタッチします。

docker runを使用します ベースのUbuntuイメージを使用して新しいコンテナを作成するコマンド。 -t ターミナルを提供し、-i 私たちがそれと相互作用することを可能にします。わかりやすくするために、--nameを使用します コンテナを識別するため。

-v フラグを使用すると、DataVolume2と呼ばれる新しいボリュームを作成できます。 。コロンを使用して、ボリュームをコンテナにマウントする必要があるパスからこの名前を区切ります。最後に、ベースUbuntuイメージを指定し、UbuntuベースイメージのDockerファイルbashのデフォルトコマンドに依存します。 、シェルにドロップするには:

  1. docker run -ti --name=Container2 -v DataVolume2:/datavolume2 ubuntu

注: -v フラグは非常に柔軟です。構文を少し調整するだけで、ボリュームをバインドマウントまたは名前付けできます。最初の引数が/で始まる場合 または~/ バインドマウントを作成しています。それを削除すると、ボリュームに名前を付けることになります。例:

  • -v /path:/path/in/container ホストディレクトリ/pathをマウントします /path/in/container
  • -v path:/path/in/container pathという名前のボリュームを作成します ホストとは関係ありません。

ホストからのディレクトリのバインドマウントの詳細については、Dockerコンテナとホスト間でデータを共有する方法

を参照してください。

コンテナ内で、ボリュームにデータを書き込みます:

  1. echo "Example2" > /datavolume2/Example2.txt
  2. cat /datavolume2/Example2.txt
OutputExample2

コンテナを終了します:

  1. exit

コンテナを再起動すると、ボリュームが自動的にマウントされます:

  1. docker start -ai Container2

ボリュームが実際にマウントされ、データがまだ配置されていることを確認します。

  1. cat /datavolume2/Example2.txt
OutputExample2

最後に、終了してクリーンアップします:

  1. exit

Dockerは、コンテナーによって参照されている場合、ボリュームを削除することを許可しません。何が起こるかを確認するには、次のことを試してください:

  1. docker volume rm DataVolume2

このメッセージは、ボリュームがまだ使用中であり、コンテナーIDの長いバージョンを提供していることを示しています。

OutputError response from daemon: unable to remove volume: remove DataVolume2: volume is in use - [d0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63]

上記のエラーメッセージのIDを使用して、コンテナを削除できます。

  1. docker rm d0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63
Outputd0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63

コンテナを削除しても、音量には影響しません。 docker volume lsを使用してボリュームを一覧表示すると、システムにまだ存在していることがわかります。 :

  1. docker volume ls
OutputDRIVER              VOLUME NAME
local               DataVolume2

また、docker volume rmを使用できます 削除するには:

  1. docker volume rm DataVolume2

この例では、コンテナーの作成と同時に空のデータボリュームを作成しました。次の例では、すでにデータが含まれているコンテナディレクトリを使用してボリュームを作成するとどうなるかを調べます。

ステップ3—データを使用して既存のディレクトリからボリュームを作成する

通常、docker volume createを使用してボリュームを個別に作成します コンテナの作成中にコンテナを作成することは、1つの例外を除いて同等です。コンテナの作成と同時にボリュームを作成する場合 ベースイメージ内のデータを含むディレクトリへのパスを指定すると、そのデータがボリュームにコピーされます。

例として、コンテナを作成し、/varにデータボリュームを追加します 、ベースイメージのデータを含むディレクトリ:

  1. docker run -ti --rm -v DataVolume3:/var ubuntu

ベースイメージの/varのすべてのコンテンツ ディレクトリがボリュームにコピーされ、そのボリュームを新しいコンテナにマウントできます。

現在のコンテナを終了します:

  1. exit

今回は、ベースイメージのデフォルトのbashに依存するのではなく コマンドを実行すると、独自のlsを発行します コマンド。シェルに入らずにボリュームの内容を表示します:

  1. docker run --rm -v DataVolume3:/datavolume3 ubuntu ls datavolume3

ディレクトリdatavolume3 これで、ベースイメージの/varのコンテンツのコピーが作成されました ディレクトリ:

Outputbackups
cache
lib
local
lock
log
mail
opt
run
spool
tmp

/var/をマウントする可能性はほとんどありません。 このようになりますが、独自の画像を作成していて、データを簡単に保存する方法が必要な場合は、これが役立ちます。次の例では、ボリュームを複数のコンテナ間で共有する方法を示します。

ステップ4—複数のDockerコンテナ間でデータを共有する

これまで、一度に1つのコンテナにボリュームをアタッチしました。多くの場合、複数のコンテナを同じデータボリュームに接続する必要があります。これは比較的簡単に実行できますが、重要な注意点が1つあります。現時点では、Dockerはファイルロックを処理しません。ボリュームに複数のコンテナを書き込む必要がある場合、それらのコンテナで実行されているアプリケーションは必要です。 データの破損を防ぐために、共有データストアに書き込むように設計されています。

Container4とDataVolume4を作成

docker runを使用する Container4という名前の新しいコンテナを作成します データボリュームが接続されている場合:

  1. docker run -ti --name=Container4 -v DataVolume4:/datavolume4 ubuntu

次に、ファイルを作成してテキストを追加します:

  1. echo "This file is shared between containers" > /datavolume4/Example4.txt

次に、コンテナを終了します:

  1. exit

これにより、ホストコマンドプロンプトに戻ります。ここで、Container4からデータボリュームをマウントする新しいコンテナを作成します 。

Container5を作成してContainer4からボリュームをマウント

Container5を作成します 、Container4からボリュームをマウントします :

  1. docker run -ti --name=Container5 --volumes-from Container4 ubuntu

データの永続性を確認します:

  1. cat /datavolume4/Example4.txt
OutputThis file is shared between containers

次に、Container5からテキストを追加します :

  1. echo "Both containers can write to DataVolume4" >> /datavolume4/Example4.txt

最後に、コンテナを終了します:

  1. exit

次に、データがContainer4にまだ存在していることを確認します 。

Container5で行われた変更を表示

次に、Container5によってデータボリュームに書き込まれた変更を確認します。 Container4を再起動します :

  1. docker start -ai Container4

変更を確認します:

  1. cat /datavolume4/Example4.txt
OutputThis file is shared between containers
Both containers can write to DataVolume4

両方のコンテナがデータボリュームからの読み取りと書き込みが可能であることを確認したので、コンテナを終了します。

  1. exit

繰り返しになりますが、Dockerはファイルロックを処理しないため、アプリケーションは必須 ファイルロック自体を説明します。 :roを追加することで、コンテナが読み取り専用アクセスを必要とするときにデータの破損が誤って発生しないように、Dockerボリュームを読み取り専用としてマウントすることができます。 。次に、これがどのように機能するかを見ていきます。

コンテナ6を起動し、ボリュームを読み取り専用でマウントします

ボリュームがコンテナにマウントされたら、通常のLinuxファイルシステムのようにマウントを解除するのではなく、代わりに、希望どおりにマウントされた新しいコンテナを作成し、必要に応じて前のコンテナを削除できます。ボリュームを読み取り専用にするには、:roを追加します コンテナ名の最後まで:

  1. docker run -ti --name=Container6 --volumes-from Container4:ro ubuntu

サンプルファイルを削除して、読み取り専用ステータスを確認します。

  1. rm /datavolume4/Example4.txt
Outputrm: cannot remove '/datavolume4/Example4.txt': Read-only file system

最後に、コンテナを終了して、テストコンテナとボリュームをクリーンアップします。

  1. exit

完了したら、コンテナとボリュームをクリーンアップします。

  1. docker rm Container4 Container5 Container6
  2. docker volume rm DataVolume4

この例では、データボリュームを使用して2つのコンテナ間でデータを共有する方法と、データボリュームを読み取り専用としてマウントする方法を示しました。

結論

このチュートリアルでは、コンテナを削除してもデータを保持できるデータボリュームを作成しました。コンテナ間でデータボリュームを共有しましたが、データの破損を防ぐためにファイルロックを処理するようにアプリケーションを設計する必要があることに注意してください。最後に、共有ボリュームを読み取り専用モードでマウントする方法を示しました。コンテナとホストシステム間でデータを共有する方法について知りたい場合は、Dockerコンテナとホスト間でデータを共有する方法をご覧ください。


Docker
  1. Ubuntu 18.04 / Ubuntu 18.10 /Ubuntu19.04にDockerをインストールする方法

  2. Dockerコンテナ間でデータを共有する方法

  3. Dockerコンテナを一覧表示する方法

  1. Ubuntu22.04のDockerコンテナ間でデータを共有する方法

  2. DockerComposeの使用方法

  3. Dockerコンテナを接続する方法

  1. Dockerコンテナ間でデータを共有する方法

  2. Ubuntu22.04にDockerをインストールする方法

  3. UbuntuでDockerをインストールしてDockerコンテナを実行する方法