ブログに戻る

Dockerコンテナ間でのデータ共有

Dockerコンテナ間でのデータ共有

はじめに

Dockerは、物理ホストマシン上で実行されている他のソフトウェアから隔離された状態でソフトウェアを実行できるようにする、軽量で仮想化された、ポータブルな、ソフトウェア定義の標準化された環境であるコンテナプラットフォームです。Dockerは、ソフトウェア開発の継続的開発および統合(CI/CD)の側面を定義する重要なコンポーネントです。一貫した実行環境を提供することで、Dockerはデプロイ先の物理ホストマシンに関係なく、ソフトウェアが同じように動作することを保証します。詳細なDockerエコシステムの概要については、こちらの記事をご覧ください.

Dockerコンテナは自己完結型ですが、コンテナの停止後にデータへのアクセスを共有したり、データをディスクに永続化したりする必要がある場合があります。データは、データベース、ログファイル、またはユーザー生成データの形式をとることができます。このようなデータをDockerイメージの構成ファイルに含めることは不可能ですが、アプリケーションが期待通りに動作するためには利用可能である必要があります。Dockerコンテナにおけるデータの共有と永続化は、Dockerボリュームによって処理されます。Dockerボリュームは、コンテナの作成中に作成することも、後で作成してコンテナにアタッチすることもできます。このチュートリアルでは、コンテナ間でデータを共有する4つの異なる方法について説明します。

前提条件

なお、ここではUbuntu 20.04を使用していますが、Dockerの指示とコマンドは、上記の前提条件で説明されているように、Dockerがインストールされ、sudoユーザーがdockerグループに追加されている他のオペレーティングシステムでも機能します。

ステップ 1: 独立したDockerボリュームの作成

まず、どのDockerコンテナにも関連付けられていない独立したボリュームを作成することから始めます。これを実現するために、docker volume createコマンドを使用します。これはDocker 1.9バージョンで導入されました。次のコマンドを入力して、Step1DataVolume :

ボリュームの作成が成功したことを示す次の出力が表示されるはずです:

Docker Volume Create

独立したボリュームができたので、例として公式のUbuntuイメージから新しいコンテナを作成し、それを利用してみましょう。次のコマンドを入力してコンテナを作成し、ボリュームをアタッチします:

このコマンドでは、 --rmフラグは、終了後にコンテナを自動的に削除します。 -vフラグは、ボリュームを指定してマウントするために使用されます。 -vフラグは、ボリュームの名前、コロン(:)、およびボリュームが表示されるコンテナ内の絶対パスを受け取ります。コマンドの実行時に、パスで指定されたディレクトリが存在しない場合は作成されることに注意してください。すでに存在する場合、マウントされたボリュームは既存のコンテンツを非表示にします。 -tiフラグについては、 -tがターミナルへのアクセスを提供し、 -iがターミナルを介してコンテナと対話することを可能にします。

コンテナの内部にいる間に、次のコマンドを実行してボリュームにデータを書き込みます:

Type exitと入力し、 enterキーを押してコンテナを終了します。説明したように、 --rmフラグのおかげで終了時にコンテナは自動的に削除されますが、ボリュームには引き続きアクセスできます。

ボリュームがまだ存在することを確認するには、 docker volume inspectコマンドを使用します:

次の出力が表示されるはずです:

Docker Volume Inspect

次に、新しいコンテナを作成しましょう。まず、ボリュームをアタッチして、前のコンテナで作成したテキストにアクセスできるかどうかを確認します。次のコマンドを入力し、 ubuntu イメージ:

コンテナ内で、次のコマンドを実行して、 StepOne.txt ファイルが存在することを確認します。

以下のような出力が表示されるはずです。

Docker Volume Content 1

次に、 exit と入力し、 enter を押してコンテナを終了します。このステップでは、独立した Docker ボリュームを使用してデータの永続化を処理する方法と、ボリュームをコンテナにアタッチする方法を学びました。

ステップ 2: コンテナを削除してもデータが永続化される Docker ボリュームの作成

このステップでは、1つのコマンドを使用して、コンテナの作成と同時にボリュームを作成します。その後、コンテナを削除し、そのボリュームを新しいコンテナにアタッチします。コマンドは、ステップ 1 で使用したものと似ていますが、コンテナの名前を指定するために、1つのフラグ --name を追加します。

コンテナ内で、次のコマンドを入力してボリュームにデータを書き込み、データが存在することを確認します。

以下は、3つのコマンドの出力です。

Persistent Docker Volume

次に、コンテナを終了します。次のコマンドを使用してコンテナを再起動すると、ボリュームは自動的にアタッチされます。

コンテナ内で、次のコマンドを使用して StepTwo.txt ファイルが存在することを確認し、ボリュームがマウントされていることを検証します。

出力は次のとおりです。

Docker Volume After Restart

これでコンテナを終了できます。Docker は、別のコンテナが参照しているボリュームの削除を防止します。次のコマンドを使用してボリュームの削除を試みることができます。

出力にエラーメッセージが表示されるはずです。

Error Response

出力に表示されているコンテナ ID を使用して、 docker rm コマンドでコンテナを削除しましょう。

ハイライトされた container id を、ターミナルに表示されているお使いのコンテナの id に置き換えてください。このコマンドはコンテナを削除しますが、作成したボリュームは削除しません。確認のために、 docker volume ls コマンドを使用して、利用可能なボリュームを一覧表示できます。

出力は次のとおりです。

Docker Volume List

次のコマンドを入力して、ステップ 2 で作成されたコンテナを削除します:

このステップでは、コンテナの作成と同時に Docker ボリュームを作成することができました。次に、データが含まれている既存のディレクトリからボリュームを作成する方法を見てみましょう。

ステップ 3: データが含まれている既存のディレクトリからの Docker ボリュームの作成

ボリュームにデータをコピーしたい場合は、コンテナを作成しながらボリュームを作成し、ベースイメージ内のデータが含まれているディレクトリへのパスを指定できます。以下のコマンドでは、コンテナを作成し、ベースイメージ内のデータが含まれているディレクトリである /var にデータボリュームを追加します。

コマンドが実行されると、ベースイメージの /var ディレクトリの内容がボリュームにコピーされます。このボリュームは新しいコンテナにアタッチできます。次に、コンテナを終了します。

Create Docker Volume

次のコマンドを入力してコンテナを作成し、ボリュームをアタッチして、 ls コマンドでボリュームの内容を一覧表示します。

コマンドから同様の出力が表示されるはずです。これは、ベースイメージの /var ディレクトリの内容のコピーであり、現在は Step3DataVolume:

Copy Docker Volume

この例で行ったように、 /var ディレクトリをマウントすることは実用的ではないかもしれませんが、カスタムイメージ内に作成された任意のディレクトリをDockerボリュームにマウントして、他のコンテナからデータを利用できるようにできることを理解するのに役立ちます。

ステップ 4: 複数のDockerコンテナ間でのデータの共有

ほとんどの場合、複数のコンテナから1つのDockerボリュームのデータにアクセスしたいと思うでしょう。これまでの例では、ボリュームを1つのコンテナにのみアタッチしていました。ここでは、ボリュームを複数のコンテナにアタッチする方法を学びます。これは簡単に実現できますが、Dockerはファイルロックを処理しません。複数のコンテナが同じボリュームに書き込む場合、データの破損を避けるために、共有データストアへの書き込みを処理するように、それらのコンテナで実行されるアプリケーションを個別に設計する必要があります。

  • 作成: Step4Container1 および Step4DataVolume

次のコマンドを使用します: docker run コマンドに --name フラグを指定して、名前付きコンテナを作成します。

コンテナ内で、次のコマンドを実行してテキストファイルを作成し、テキストを追加します。

その後、コンテナを終了してホスト環境に戻ります。次に、別のコンテナを作成し、 Step4Container1 からボリュームをマウントします。

  • 作成: Step4Container2、および次のコンテナからのボリュームのアタッチ: Step4Container1

次のコマンドを実行して、 Step4Container2 を作成し、次のコンテナからボリュームをマウントします: Step4Container1:

コンテナ内で、 cat コマンドを使用して、データの永続性を確認します:

次のような出力が表示されるはずです。

Container Data Sharing

次のコマンドを入力することで、 Step4Container2 からファイルにテキストをさらに追加できます:

この後コンテナを終了し、 Step4Container1 に戻ってデータがまだ存在するか確認します。

  • 異なるコンテナ間でDockerボリュームに加えられた変更を確認する

変更を表示するには、まず次のコマンドを使用して Step4Container1 を再起動します:

次のコマンドを使用して変更を確認します:

下のスクリーンショットのような出力が表示されるはずです。

Copied Container Data

両方のコンテナが同じボリュームに対してデータの読み書きができることを確認したら、コンテナを終了できます。前述のように、Dockerはファイルロックを処理しません。共有データストアへの読み書きアクセスを処理するのは、コンテナ内で実行されるアプリケーションロジックの役割です。Dockerでは、読み取り専用アクセスのみを必要とするコンテナによる偶発的なデータ破損を防ぐために、次の例に示すように、 :ro を追加することで、ボリュームを読み取り専用としてマウントすることができます。

  • Dockerコンテナにボリュームを読み取り専用としてマウントする

この例では、次の名前のコンテナを作成します: Step4Container3。作成コマンドで、 Step4Container1 からボリュームをマウントし、 :ro を追加して、このコンテナが読み取り専用アクセス権を持ち、ボリュームに書き込みできないことを指定します。ターミナルで次のコマンドを実行します:

コンテナ内に入ったら、次のコマンドを入力してボリューム内のテキストファイルを読み取ることができます:

Read Only Mount

ただし、次のコマンドを使用してファイルを削除しようとすると:

ターミナルに以下のようなエラーメッセージが表示されます。

Read Only Error

読み書きの権限を確認したら、コンテナを終了できます。このチュートリアルで作成したコンテナとボリュームをクリーンアップしたい場合は、次のコマンドを実行します。

このステップでは、Dockerボリュームを使用して複数のコンテナ間でデータを共有する方法、およびデータボリュームを読み取り専用としてコンテナにマウントする方法を学びました。

まとめ

このチュートリアルでは、いくつかのDockerボリュームを作成し、Dockerコンテナ間でデータを共有する方法を学びました。コンテナ間のデータ共有を扱う際、Dockerにはファイルロックを処理する実装がないため、共有データストアへの書き込み時にデータの破損を防ぐために、コンテナ内の個々のアプリケーションロジックでファイルロックを処理する必要があることに注意しました。

Dockerを活用するためのさらなるリソースについては、次のサイトで他のチュートリアルをご覧ください:当社のブログ:

快適なコンピューティングを!

author

Pranay Kapgate

著者 · CloudSigma

Preslav DobrevはCloudSigmaのクリエイティブデザイナーであり、従来型および革新的なマーケティングチャネルを活用した一貫性のあるビジネスアイデンティティに注力しています。彼は芸術的なビジョンと戦略的マーケティングを融合させ、インパクトのあるブランドナラティブを生み出すことに長けています。

コメント

コメントはまだありません。最初のコメントを投稿しましょう。