【Docker使えるようになりたい】【#13 ボリューム】ボリューム領域を使ってデータを保存する

コンテナ内のデータは消える

コンテナを削除した場合、当然コンテナ内にあるデータは消えます。

なので、もしデータをコンテナが消えても保存しておきたい場合は、以下の2つのうちのいずれかの方法を取る必要があります。

  • ボリューム(volume)
  • バインドマウント(bind mount)

この記事では、ボリュームを使ってデータを保存をする手順を解説していこうと思います。

ボリュームについて

Dockerが管理している領域で、ホストOSのディレクトリとはまた別の隔離された領域にあります。

そのため、DockerDesktopを使用している場合は、ホストOSからのアクセスはできないです。
Linuxを使っている場合は、アクセスが可能かもしれません。

また、外付けSSDが別々のデバイスからアクセスできるように、ボリュームも「別々のコンテナ」からアクセスができる

volume関連でよく使うコマンド一覧

ボリューム作成から確認、削除までの一連の流れを体験 : create & ls & inspect & 削除

作成 : docker volume create {ボリューム名}

ボリュームの作成は簡単です。

docker volume create {ボリューム名}

実際に自分で名前をつけて作成してみます。
今回は、my-test-volumeというボリューム領域を作成してみます。

Bash
# 実行コマンド
docker volume create my-test-volume

# 出力
my-test-volume

指定したボリューム名がそのまま出力されればボリュームの作成が成功しています。

存在するボリュームの一覧を表示 : docker volume ls

作成したボリュームをまずは一覧表示してみます。

一覧表示といえばlsコマンドですが、Dockerのボリュームでも同じ考え方で表示ができます。

Bash
# コマンド
docker volume ls

# 出力
DRIVER    VOLUME NAME
local     my-volume

このコマンドを実行すると、私の環境では、先ほど作成したボリュームだけがあるので、1つだけボリュームが表示されました。

ボリュームの詳細表示 : docker volume inspect {ボリューム名}

すでに作成済みのボリュームの詳細情報を表示するにはinspectコマンドを使用します。
inspectはコンテナやイメージでも出てきた単語なのでなんとなく動作のイメージができると思います。

docker volume inspect {ボリューム名}

今回は、先程作成したmy-test-volumeの詳細情報を確認するために使ってみます

Bash
# コマンド
docker volume inspect my-test-volume

# 出力
[
    {
        "CreatedAt": "2024-09-21T04:37:59Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/my-volume/_data",
        "Name": "my-volume",
        "Options": null,
        "Scope": "local"
    }
]

ここで実際にデータが保存されている領域がMountpointとして表示されます。

しかし、最初にお話しした通り、DockerDesktopを使っているホストOSのフォルダシステムからではアクセスができないようです。
Linuxを使っていればアクセスできるかもしれません。

これは、DockerがLinux上でしか動かない特性上、本当のホストOS上に配置しているというよりは、その上にある仮想LinuxOS上にデータを配置しているからです。

削除 : docker volume rm {ボリューム名}

ボリュームを削除するには、rmを使用します。

docker volume rm {ボリューム名}

今回は、my-test-volumeを削除してみます。
指定したボリューム名が出力されれば削除成功です。

Bash
# コマンド
docker volume rm my-test-volume

# 出力
my-test-volume

ここで本当に消えたかdocker volume lsコマンドを使用して確認して見ます。

Bash
# コマンド
docker volume ls

# 出力
DRIVER    VOLUME NAME

1行だけ出力されていれば何もないことになるので削除が成功していることを確認できました。

私の環境にはボリュームが作成したmy-test-volumeのみだったのでこのような表示になりましたが、ほかのボリュームがある場合は、my-test-volumeだけが消えているはずです。

ボリュームとコンテナを紐づける

では、実際に作成したボリュームと、コンテナを紐づけてデータを保存してみます。

紐づけにはdocker container create時か、docker container run時に-vオプションか--mountオプションを使って、ボリュームを紐づける必要があります。

この記事では、-vオプションを使います。

また、このときに、指定したボリュームが存在しない場合は、ボリュームが自動生成されます。

docker container create -v {ボリューム名}:{マウント名}
  • ボリューム名 : 紐づけるボリューム名
  • マウント名 : コンテナ内で認識する時のボリュームの名前

ボリュームは、複数のコンテナと紐づける事もできます。
なので、一つのボリューム領域を同時に操作して片方のコンテナが書き込んだデータをもう片方のコンテナが読み込むような動作をすることができます。

例 : ボリュームを複数のコンテナと紐づけてそれそれのコンテナでデータを変更してみる

使用するイメージはubuntu:20.04を使用します。

まずは、ボリュームを作成します、生成するボリュームの名前は、share-volumeとします

Bash
# コマンド
docker volume create share-volume

# 出力
share-volume

次に、コンテナを2つ作成します。
1つめのコンテナは「create」で、2つめのコンテナは「run」で作成して、volumeを紐づけます

まずは、docker container createコマンドを使ってu1というコンテナを生成、ボリュームshare-volumeを紐づけします。
ボリュームのマウント名は、app1にします

Bash
# コマンド
docker container create -it -v share-volume:/app1 --name u1 ubuntu:20.04

# 出力
8d1887e3c3424e02cb378a6ab217babd0dc8eb928a94590a1dec94da79900e1d

次に2つめのコンテナとして、docker container runコマンドを使ってu2というコンテナをボリュームshare-volumeを紐づけて生成、実行します。
ボリュームをマウントする名前は、app2にします

Bash
# コマンド
docker run -it -v share-volume:/app2 --name u2 ubuntu:20.04

# 出力
root@cdab74faf324:/#

u1コンテナを別のshellで起動して、u1u2どちらのコンテナにも接続した状態にします。

Bash
# コマンド
docker container start -i u1

# 出力
root@8d1887e3c342:/#

まずは、u1で、app1に「hello.txt」ファイルを作成しつつ、データを流し込みます。

Bash
echo "hello from u1" > /app1/hello.txt

それを、u2コンテナでcat確認した後、追記します。

Bash
# コマンド
cat /app2/hello.txt

# 出力
hello from u1

# コマンド
echo "hello from u2" >> /app2/hello.txt

最後にu1でu2の変更が見れるかか確認してみます。

Bash
# コマンド
cat /app1/hello.txt

# 出力
hello from u1
hello from u2

このように1つのボリュームをそれぞれのコンテナ内から読み書きできることが分かります。

-vと–mountどちらを使うのがいいのか

それぞれのオプションは、同じ効果になりますが、特徴として-vのほうが記述量が短く、—-mountの方が長く記述する必要があります。

なので、私は記述量は減らしたいので、-vを使うことを推奨します。

url: https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/
title: "ボリュームの利用"
description: "ボリュームを利用します。"
host: matsuand.github.io
favicon: https://matsuand.github.io/docs.docker.jp.onthefly/favicons/docs@2x.ico
image: https://matsuand.github.io/docs.docker.jp.onthefly/favicons/docs@2x.ico

さいごに

今回は、基本的なボリュームの操作をまとめてみました。

次回の記事では、ボリュームをコンテナと連携させてより実際の動作に近い操作を行っていこうと思います

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA