データ永続化のためのボリュームをマウント
このステップでは、Docker ボリュームを使用してコンテナが生成・使用するデータを永続化する方法を学びます。デフォルトでは、コンテナ内のデータは一時的なもので、コンテナを削除すると失われます。ボリュームを使用すると、コンテナのファイルシステム外にデータを保存でき、コンテナを停止または削除した後もデータを保持できます。
まず、前のステップで作成したmy-nginxコンテナを停止して削除しましょう。
docker stop my-nginx
docker rm my-nginx
次に、Docker ボリュームを作成します。ボリュームは Docker によって管理され、ホストマシンの専用領域に保存されます。
docker volume create my-volume
ボリューム名 (my-volume) が表示され、作成が確認できるはずです。
docker volume lsコマンドで既存のボリュームを一覧表示できます。
docker volume ls
ボリュームの一覧にmy-volumeが表示されるでしょう。
ここで、新しいnginxコンテナを実行し、my-volumeをコンテナ内の Nginx のデフォルト Web ルートディレクトリ (/usr/share/nginx/html) にマウントします。これにより、コンテナ内の/usr/share/nginx/htmlに配置されたファイルは実際にはホストのmy-volumeに保存されます。
コンテナを detached モード (-d) で実行し、コンテナ内のポート 80 をホストのポート 8081 に公開 (-p 8081:80)、名前 (my-nginx-volume) を付け、-vフラグでボリュームをマウントします。名前付きボリュームのマウント形式はボリューム名:コンテナ内パスです。
docker run -d --name my-nginx-volume -p 8081:80 -v my-volume:/usr/share/nginx/html nginx
コンテナ ID が表示され、コンテナが実行中であることがわかります。
マウントされたボリュームにシンプルな HTML ファイルを配置しましょう。docker execを使用して実行中のコンテナ内でコマンドを実行し、/usr/share/nginx/htmlにindex.htmlファイルを作成します。
docker exec my-nginx-volume sh -c 'echo "<h1>Hello from the volume!</h1>" > /usr/share/nginx/html/index.html'
このコマンドはmy-nginx-volumeコンテナ内でシェル (sh -c) を実行し、echoコマンドでindex.htmlファイルを作成します。
ホストのポート 8081 で Web サーバーにアクセスし、作成したindex.htmlファイルの内容を確認しましょう。
curl http://localhost:8081
出力に<h1>Hello from the volume!</h1>が表示されるはずです。これにより、コンテナ内で作成したファイルが Nginx によって提供されており、マウントされたボリュームに書き込まれたためデータが永続化されていることが確認できます。
永続性を実証するため、my-nginx-volumeコンテナを停止して削除します。
docker stop my-nginx-volume
docker rm my-nginx-volume
次に、同じボリュームをマウントした新しいコンテナを実行します。この新しいコンテナをmy-nginx-volume-newと名付け、ポート 80 をホストのポート 8082 に公開します。
docker run -d --name my-nginx-volume-new -p 8082:80 -v my-volume:/usr/share/nginx/html nginx
新しいコンテナが実行され、同じmy-volumeを使用しています。ポート 8082 で Web サーバーにアクセスしましょう。
curl http://localhost:8082
出力には依然として<h1>Hello from the volume!</h1>が表示されるはずです。これはindex.htmlファイルがmy-volumeに保存され、元のコンテナを削除した後も永続化されていたためです。同じボリュームをマウントした新しいコンテナは、以前に書き込まれたデータにアクセスできます。
これにより、ボリュームがコンテナのライフサイクルとは独立してデータを永続化する強力な機能であることが実証されました。