Dockerとコンテナ技術 その13:ボリューム

過去の記事でコンテナのデータ永続化について簡単にまとめました。

キョウタコの技術日記

コンテナは作成し利用した後は都度削除するのが一般的です。しかし、コンテナを削除するとその中のデータも削除されてしまいます…

その中のボリュームについてより詳しくまとめていきます。

ボリュームとは

ボリュームとは、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に完全に管理された独立したデータ領域であるボリュームは複数のコンテナから接続可能で、同期されているように動作し、コンテナが削除されてもデータは保持されるというのが特徴です。
特徴をしっかりと理解した上で開発に役立てていきましょう。
ここまで読んでいただきありがとうございました。
それでは、また。