データ永続化のためのボリュームマウント
このステップでは、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
に保存され、元のコンテナを削除した後も永続化されていたためです。同じボリュームをマウントした新しいコンテナは、以前に書き込まれたデータにアクセスできます。
これにより、ボリュームがコンテナのライフサイクルとは独立してデータを永続化する強力な機能であることが実証されました。