はじめに
Dockerは、物理ホストマシン上で実行されている他のソフトウェアから隔離された状態でソフトウェアを実行できるようにする、軽量で仮想化された、ポータブルな、ソフトウェア定義の標準化された環境であるコンテナプラットフォームです。Dockerは、ソフトウェア開発の継続的開発および統合(CI/CD)の側面を定義する重要なコンポーネントです。一貫した実行環境を提供することで、Dockerはデプロイ先の物理ホストマシンに関係なく、ソフトウェアが同じように動作することを保証します。詳細なDockerエコシステムの概要については、こちらの記事をご覧ください.
Dockerコンテナは自己完結型ですが、コンテナの停止後にデータへのアクセスを共有したり、データをディスクに永続化したりする必要がある場合があります。データは、データベース、ログファイル、またはユーザー生成データの形式をとることができます。このようなデータをDockerイメージの構成ファイルに含めることは不可能ですが、アプリケーションが期待通りに動作するためには利用可能である必要があります。Dockerコンテナにおけるデータの共有と永続化は、Dockerボリュームによって処理されます。Dockerボリュームは、コンテナの作成中に作成することも、後で作成してコンテナにアタッチすることもできます。このチュートリアルでは、コンテナ間でデータを共有する4つの異なる方法について説明します。
前提条件
- Ubuntu 20.04を実行するサーバーをセットアップする および sudo権限を持つ非ルートユーザーを作成する。次の手順に進むには、非ルートユーザーでログインします。
- Dockerをインストールする - UbuntuにDockerをインストールして操作する方法に関するチュートリアルがあります。ステップ1、2、3、4に従う必要があります。これは、どのUbuntuディストリビューションでも機能するはずです。
なお、ここではUbuntu 20.04を使用していますが、Dockerの指示とコマンドは、上記の前提条件で説明されているように、Dockerがインストールされ、sudoユーザーがdockerグループに追加されている他のオペレーティングシステムでも機能します。
ステップ 1: 独立したDockerボリュームの作成
まず、どのDockerコンテナにも関連付けられていない独立したボリュームを作成することから始めます。これを実現するために、docker volume createコマンドを使用します。これはDocker 1.9バージョンで導入されました。次のコマンドを入力して、Step1DataVolume :
|
1 |
docker volume create --name Step1DataVolume |
ボリュームの作成が成功したことを示す次の出力が表示されるはずです:
![]()
独立したボリュームができたので、例として公式のUbuntuイメージから新しいコンテナを作成し、それを利用してみましょう。次のコマンドを入力してコンテナを作成し、ボリュームをアタッチします:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
このコマンドでは、 --rmフラグは、終了後にコンテナを自動的に削除します。 -vフラグは、ボリュームを指定してマウントするために使用されます。 -vフラグは、ボリュームの名前、コロン(:)、およびボリュームが表示されるコンテナ内の絶対パスを受け取ります。コマンドの実行時に、パスで指定されたディレクトリが存在しない場合は作成されることに注意してください。すでに存在する場合、マウントされたボリュームは既存のコンテンツを非表示にします。 -tiフラグについては、 -tがターミナルへのアクセスを提供し、 -iがターミナルを介してコンテナと対話することを可能にします。
コンテナの内部にいる間に、次のコマンドを実行してボリュームにデータを書き込みます:
|
1 |
echo "Step One Sample Text" > /Step1DataVolume/StepOne.txt |
Type exitと入力し、 enterキーを押してコンテナを終了します。説明したように、 --rmフラグのおかげで終了時にコンテナは自動的に削除されますが、ボリュームには引き続きアクセスできます。
ボリュームがまだ存在することを確認するには、 docker volume inspectコマンドを使用します:
|
1 |
docker volume inspect Step1DataVolume |
次の出力が表示されるはずです:

次に、新しいコンテナを作成しましょう。まず、ボリュームをアタッチして、前のコンテナで作成したテキストにアクセスできるかどうかを確認します。次のコマンドを入力し、 ubuntu イメージ:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
コンテナ内で、次のコマンドを実行して、 StepOne.txt ファイルが存在することを確認します。
|
1 |
cat /Step1DataVolume/StepOne.txt |
以下のような出力が表示されるはずです。

次に、 exit と入力し、 enter を押してコンテナを終了します。このステップでは、独立した Docker ボリュームを使用してデータの永続化を処理する方法と、ボリュームをコンテナにアタッチする方法を学びました。
ステップ 2: コンテナを削除してもデータが永続化される Docker ボリュームの作成
このステップでは、1つのコマンドを使用して、コンテナの作成と同時にボリュームを作成します。その後、コンテナを削除し、そのボリュームを新しいコンテナにアタッチします。コマンドは、ステップ 1 で使用したものと似ていますが、コンテナの名前を指定するために、1つのフラグ --name を追加します。
|
1 |
docker run -ti --name=Step2Container1 -v Step2DataVolume:/Step2DataVolume ubuntu |
コンテナ内で、次のコマンドを入力してボリュームにデータを書き込み、データが存在することを確認します。
|
1 2 3 |
echo "Step Two Sample Text" > /Step2DataVolume/StepTwo.txt cat /Step2DataVolume/StepTwo.txt |
以下は、3つのコマンドの出力です。

次に、コンテナを終了します。次のコマンドを使用してコンテナを再起動すると、ボリュームは自動的にアタッチされます。
|
1 |
docker start -ai Step2Container1 |
コンテナ内で、次のコマンドを使用して StepTwo.txt ファイルが存在することを確認し、ボリュームがマウントされていることを検証します。
|
1 |
cat /Step2DataVolume/StepTwo.txt |
出力は次のとおりです。

これでコンテナを終了できます。Docker は、別のコンテナが参照しているボリュームの削除を防止します。次のコマンドを使用してボリュームの削除を試みることができます。
|
1 |
docker volume rm Step2DataVolume |
出力にエラーメッセージが表示されるはずです。
![]()
出力に表示されているコンテナ ID を使用して、 docker rm コマンドでコンテナを削除しましょう。
|
1 |
docker rm e3932e65e484bbf4524ca8de1b1dd99c4e92c12f92a9d6b0567a643d0aa6bb2d |
ハイライトされた container id を、ターミナルに表示されているお使いのコンテナの id に置き換えてください。このコマンドはコンテナを削除しますが、作成したボリュームは削除しません。確認のために、 docker volume ls コマンドを使用して、利用可能なボリュームを一覧表示できます。
|
1 |
docker volume ls |
出力は次のとおりです。

次のコマンドを入力して、ステップ 2 で作成されたコンテナを削除します:
|
1 |
docker volume rm Step2DataVolume |
このステップでは、コンテナの作成と同時に Docker ボリュームを作成することができました。次に、データが含まれている既存のディレクトリからボリュームを作成する方法を見てみましょう。
ステップ 3: データが含まれている既存のディレクトリからの Docker ボリュームの作成
ボリュームにデータをコピーしたい場合は、コンテナを作成しながらボリュームを作成し、ベースイメージ内のデータが含まれているディレクトリへのパスを指定できます。以下のコマンドでは、コンテナを作成し、ベースイメージ内のデータが含まれているディレクトリである /var にデータボリュームを追加します。
|
1 |
docker run -ti --rm -v Step3DataVolume:/var ubuntu |
コマンドが実行されると、ベースイメージの /var ディレクトリの内容がボリュームにコピーされます。このボリュームは新しいコンテナにアタッチできます。次に、コンテナを終了します。

次のコマンドを入力してコンテナを作成し、ボリュームをアタッチして、 ls コマンドでボリュームの内容を一覧表示します。
|
1 |
docker run --rm -v Step3DataVolume:/Step3DataVolume ubuntu ls Step3DataVolume |
コマンドから同様の出力が表示されるはずです。これは、ベースイメージの /var ディレクトリの内容のコピーであり、現在は Step3DataVolume:

この例で行ったように、 /var ディレクトリをマウントすることは実用的ではないかもしれませんが、カスタムイメージ内に作成された任意のディレクトリをDockerボリュームにマウントして、他のコンテナからデータを利用できるようにできることを理解するのに役立ちます。
ステップ 4: 複数のDockerコンテナ間でのデータの共有
ほとんどの場合、複数のコンテナから1つのDockerボリュームのデータにアクセスしたいと思うでしょう。これまでの例では、ボリュームを1つのコンテナにのみアタッチしていました。ここでは、ボリュームを複数のコンテナにアタッチする方法を学びます。これは簡単に実現できますが、Dockerはファイルロックを処理しません。複数のコンテナが同じボリュームに書き込む場合、データの破損を避けるために、共有データストアへの書き込みを処理するように、それらのコンテナで実行されるアプリケーションを個別に設計する必要があります。
- 作成: Step4Container1 および Step4DataVolume
次のコマンドを使用します: docker run コマンドに --name フラグを指定して、名前付きコンテナを作成します。
|
1 |
docker run -ti --name=Step4Container1 -v Step4DataVolume:/Step4DataVolume ubuntu |
コンテナ内で、次のコマンドを実行してテキストファイルを作成し、テキストを追加します。
|
1 |
echo "Step Four Sample Text" > /Step4DataVolume/StepFour.txt |
その後、コンテナを終了してホスト環境に戻ります。次に、別のコンテナを作成し、 Step4Container1 からボリュームをマウントします。
- 作成: Step4Container2、および次のコンテナからのボリュームのアタッチ: Step4Container1
次のコマンドを実行して、 Step4Container2 を作成し、次のコンテナからボリュームをマウントします: Step4Container1:
|
1 |
docker run -ti --name=Step4Container2 --volumes-from Step4Container1 ubuntu |
コンテナ内で、 cat コマンドを使用して、データの永続性を確認します:
|
1 |
cat /Step4DataVolume/StepFour.txt |
次のような出力が表示されるはずです。

次のコマンドを入力することで、 Step4Container2 からファイルにテキストをさらに追加できます:
|
1 |
echo "We are appending text while inside Step4Container2" >> /Step4DataVolume/StepFour.txt |
この後コンテナを終了し、 Step4Container1 に戻ってデータがまだ存在するか確認します。
- 異なるコンテナ間でDockerボリュームに加えられた変更を確認する
変更を表示するには、まず次のコマンドを使用して Step4Container1 を再起動します:
|
1 |
docker start -ai Step4Container1 |
次のコマンドを使用して変更を確認します:
|
1 |
cat /Step4DataVolume/StepFour.txt |
下のスクリーンショットのような出力が表示されるはずです。

両方のコンテナが同じボリュームに対してデータの読み書きができることを確認したら、コンテナを終了できます。前述のように、Dockerはファイルロックを処理しません。共有データストアへの読み書きアクセスを処理するのは、コンテナ内で実行されるアプリケーションロジックの役割です。Dockerでは、読み取り専用アクセスのみを必要とするコンテナによる偶発的なデータ破損を防ぐために、次の例に示すように、 :ro を追加することで、ボリュームを読み取り専用としてマウントすることができます。
- Dockerコンテナにボリュームを読み取り専用としてマウントする
この例では、次の名前のコンテナを作成します: Step4Container3。作成コマンドで、 Step4Container1 からボリュームをマウントし、 :ro を追加して、このコンテナが読み取り専用アクセス権を持ち、ボリュームに書き込みできないことを指定します。ターミナルで次のコマンドを実行します:
|
1 |
docker run -ti --name=Step4Container3 --volumes-from Step4Container1:ro ubuntu |
コンテナ内に入ったら、次のコマンドを入力してボリューム内のテキストファイルを読み取ることができます:
|
1 |
cat /Step4DataVolume/StepFour.txt |

ただし、次のコマンドを使用してファイルを削除しようとすると:
|
1 |
rm /Step4DataVolume/StepFour.txt |
ターミナルに以下のようなエラーメッセージが表示されます。
![]()
読み書きの権限を確認したら、コンテナを終了できます。このチュートリアルで作成したコンテナとボリュームをクリーンアップしたい場合は、次のコマンドを実行します。
|
1 2 3 |
docker rm Step4Container1 Step4Container2 Step4Container3 docker volume rm Step4DataVolume |
このステップでは、Dockerボリュームを使用して複数のコンテナ間でデータを共有する方法、およびデータボリュームを読み取り専用としてコンテナにマウントする方法を学びました。
まとめ
このチュートリアルでは、いくつかのDockerボリュームを作成し、Dockerコンテナ間でデータを共有する方法を学びました。コンテナ間のデータ共有を扱う際、Dockerにはファイルロックを処理する実装がないため、共有データストアへの書き込み時にデータの破損を防ぐために、コンテナ内の個々のアプリケーションロジックでファイルロックを処理する必要があることに注意しました。
Dockerを活用するためのさらなるリソースについては、次のサイトで他のチュートリアルをご覧ください:当社のブログ:
- Dockerコンテナとホストの間でデータを共有する方法
- Dockerリソースのクリーンアップ – イメージ、コンテナ、ボリューム
- Docker Composeを使用したLaravel、Nginx、MySQLのデプロイ
- CentOS 7へのDockerのインストールとセットアップ
快適なコンピューティングを!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。