過去の記事でコンテナのデータ永続化について簡単にまとめました。
その中のボリュームについてより詳しくまとめていきます。
ボリュームとは
ボリュームとは、Docker上に作成できる永続的なデータ領域です。
コンテナ上のデータはコンテナを削除すると消えてしまいますが、ボリューム上にデータを保持することで永続化させることができます。
ボリュームは複数のコンテナからアクセスすることができ、外付けHDDのような役割を果たします。
ボリュームのコマンド操作
ボリュームのコマンド操作についてまとめていきます。
ボリュームを操作する場合、docker volume ~~
というコマンドで様々な操作を実行していきます。
ボリュームの作成
ボリュームの作成は以下のコマンドで実行します。
docker volume create ボリュームの名前
ボリュームの一覧を表示する
ボリュームの一覧を表示するには以下のコマンドを実行します。
docker volume ls
ボリュームの詳細情報を取得する
ボリュームの詳細情報を取得するには以下のコマンドを実行します。
docker volume inspect ボリューム名
ボリュームを削除する
ボリュームを削除する場合は以下のコマンドを実行します。
docker volume rm ボリューム名
コンテナのデータをボリュームで永続化させる
では、実際にコンテナにボリュームをマウントしてデータの永続化を行なっていきます。
コンテナにボリュームをマウントするコマンド
コンテナ起動時にボリュームをマウントする場合は以下のようなコマンドを実行します。
docker container run -v ボリューム名:コンテナ内の絶対パス イメージ
または
docker container run --mount type=volumes src=ボリューム名,dst=コンテナ内の絶対パス イメージ
コンテナ内の絶対パスとボリューム内のデータは同期するように動作します。
つまり、コンテナ内の絶対パスでの変更がそのままボリュームに反映されることになります。
2つのコンテナにボリュームをマウントする
ボリュームを作成して2つのコンテナにマウントして、動作のイメージを掴んでいきましょう。
まずは以下のコマンドでボリュームを作成します。
docker volume create my-volume
以下のように表示されれば成功です。
次に1つ目のコンテナを作成しボリュームをマウントしていきましょう。
ubuntuのイメージを元にコンテナを作成して、/app1/
というコンテナ内のパスにマウントします。
以下のコマンドを実行してください。
docker container run -it -v my-volume:/app1 --name container1 ubuntu:20.04
コマンド実行後、コンテナ内に入るので以下のコマンドを実行し/app1/
にhello.txtというファイルを作成していきます。
cd /app1
touch hello.txt
上記コマンドを実行していくと、以下の画像のようになるかと思います。
次に2つ目のコンテナを作成し、/app2/
というパスに同じボリュームをマウントしていきます。
ターミナルで新しいウィンドウを開き、以下のコマンドを実行してください。
docker container run --name container2 -v my-volume:/app2 -it ubuntu:20.04
コマンド実行後、コンテナ内で以下のコマンドを実行していき、container1で作成したhello.txtがマウントされているか確認しましょう。
cd app2
ls
上記コマンドを実行していくと、以下の画像のようになります。
hello.txtがボリュームからマウントされて存在しているのが確認できます。
では、次に以下のコマンドを実行してhello.txtを編集していきましょう。
echo "Hello, World!" > hello.txt
container2でhello.txtを編集しました。
では、container1の方でもこの編集が反映されているか確認してみましょう。
先ほどcontainer1を作成したターミナルウィンドウに戻り、以下のコマンドを実行します。
cat hello.txt
以下のように表示されると思います。
しっかりと反映されているのが確認できます。
このように作成したデータはcontainer1とcontainer2を削除してもボリュームが残る限りは削除されることはなく、永続的にデータを保持することができます。
まとめ
今回はボリュームの操作について詳しくまとめました。
Dockerに完全に管理された独立したデータ領域であるボリュームは複数のコンテナから接続可能で、同期されているように動作し、コンテナが削除されてもデータは保持されるというのが特徴です。
特徴をしっかりと理解した上で開発に役立てていきましょう。
ここまで読んでいただきありがとうございました。
それでは、また。