はじめに
このチャレンジでは、podman を使用してコンテナに永続ストレージ(Persistent Storage)をアタッチします。コンテナは本質的にエフェメラル(一時的)なものであり、コンテナ内で作成されたデータはコンテナが削除されると失われてしまいます。データを保存し続けるには、ホストシステムのディレクトリをコンテナ内にマウントします。このマウントされたディレクトリは永続ボリューム(Persistent Volume)と呼ばれ、コンテナが停止、削除、または再作成されたとしても、データを確実に残すことができます。
コンテナへの永続ストレージのアタッチ
このチャレンジでは、まずホストシステム上に永続ボリュームとして機能するディレクトリを作成します。次に、新しいコンテナを実行し、その永続ボリュームをアタッチします。最後に、コンテナ内からボリュームに書き込まれたデータが、コンテナの再起動後も保持されていることを確認します。
タスク
- ホストシステム上に、永続ボリュームとして機能するディレクトリを作成する。
- 新しいコンテナを実行し、永続ボリュームをアタッチする。
- コンテナ内からボリュームに書き込まれたデータが、コンテナの再起動後も保持されていることを確認する。
要件
- ホストシステム上に
/dataという名前のディレクトリを作成してください。このディレクトリはボリュームマウントのホスト側パスとして使用されます。 nginxイメージを使用してコンテナを実行してください。コンテナ名はmy-nginx-containerとします。- ホストの
/dataディレクトリを、コンテナ内の/usr/share/nginx/htmlディレクトリにマウントしてください。 - 実行中のコンテナ内で、
/usr/share/nginx/html/my-file.txtというファイルを作成し、その内容を正確にThis is a persistent fileとしてください。
例
タスク完了後、コンテナのマウントされたディレクトリ内で、デフォルトの Nginx ファイルとともに作成したカスタムファイルを確認できるはずです。また、ホスト側のディレクトリ /data を確認しても、同じファイルが存在していることがわかります。
[labex@host ~]$ podman exec my-nginx-container cat /usr/share/nginx/html/my-file.txt
This is a persistent file
[labex@host ~]$ podman exec my-nginx-container ls /usr/share/nginx/html
my-file.txt
ヒント
/dataディレクトリを作成するにはsudo mkdirコマンドを使用します。- コンテナのプロセスが書き込みを行えるように、
sudo chownによる所有権の変更やsudo chmodによる権限の設定が必要になる場合があります。 podman runコマンドでホストディレクトリをコンテナにマウントするには、-vまたは--volumeフラグを使用します。形式は-v /host/path:/container/pathです。- RHEL のような SELinux が有効なシステムでは、ホストディレクトリに適切な SELinux コンテキストを設定する必要があります。
sudo semanage fcontext -a -t container_file_t "/data(/.*)?"とsudo restorecon -R /dataを使用して SELinux ラベルを構成してください。 - 権限エラーが発生した場合は、ディレクトリの所有権をコンテナのユーザー ID(nginx の場合は通常 1000:1000)に合わせてみてください。
まとめ
このチャレンジでは、バインドマウント(Bind Mount)を使用してコンテナに永続ストレージを提供する方法を学びました。ホストシステムのディレクトリをコンテナにマウントすることで、コンテナが停止、削除、または再起動された場合でも、アプリケーションによって生成されたデータが保持されるようになります。この手法は、コンテナでステートフル(状態を持つ)なアプリケーションを実行するための基本となります。



