コンテナを削除した場合
、当然コンテナ内にあるデータは消えます。
なので、もしデータをコンテナが消えても保存しておきたい場合は、以下の2つのうちのいずれかの方法を取る必要があります。
- ボリューム(volume)
- バインドマウント(bind mount)
この記事では、ボリューム
を使ってデータを保存をする手順を解説していこうと思います。
Dockerが管理している領域で、ホストOSのディレクトリとはまた別の隔離された領域にあります。
そのため、DockerDesktopを使用している場合は、ホストOSからのアクセスはできないです。
Linuxを使っている場合は、アクセスが可能かもしれません。
また、外付けSSDが別々のデバイスからアクセスできるように、ボリュームも「別々のコンテナ」からアクセスができる
- docker volume create – 新しいボリュームを作成します。
- docker volume inspect – ボリュームの詳細情報を表示します。
- docker volume ls – 既存のボリュームの一覧を表示します。
- docker volume rm – ボリュームを削除します。
- docker volume prune – 未使用のボリュームを一括で削除します。
作成 : docker volume create {ボリューム名}
ボリュームの作成は簡単です。
docker volume create {ボリューム名}
実際に自分で名前をつけて作成してみます。
今回は、my-test-volume
というボリューム領域を作成してみます。
# 実行コマンド
docker volume create my-test-volume
# 出力
my-test-volume
指定したボリューム名がそのまま出力されればボリュームの作成が成功しています。
存在するボリュームの一覧を表示 : docker volume ls
作成したボリュームをまずは一覧表示してみます。
一覧表示といえばls
コマンドですが、Dockerのボリュームでも同じ考え方で表示ができます。
# コマンド
docker volume ls
# 出力
DRIVER VOLUME NAME
local my-volume
このコマンドを実行すると、私の環境では、先ほど作成したボリュームだけがあるので、1つだけボリュームが表示されました。
ボリュームの詳細表示 : docker volume inspect {ボリューム名}
すでに作成済みのボリュームの詳細情報を表示するにはinspect
コマンドを使用します。inspect
はコンテナやイメージでも出てきた単語なのでなんとなく動作のイメージができると思います。
docker volume inspect {ボリューム名}
今回は、先程作成したmy-test-volume
の詳細情報を確認するために使ってみます
# コマンド
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
を削除してみます。
指定したボリューム名が出力されれば削除成功です。
# コマンド
docker volume rm my-test-volume
# 出力
my-test-volume
ここで本当に消えたかdocker volume ls
コマンドを使用して確認して見ます。
# コマンド
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
とします
# コマンド
docker volume create share-volume
# 出力
share-volume
次に、コンテナを2つ作成します。
1つめのコンテナは「create」で、2つめのコンテナは「run」で作成して、volume
を紐づけます
まずは、docker container create
コマンドを使ってu1
というコンテナを生成、ボリュームshare-volume
を紐づけします。
ボリュームのマウント名は、app1
にします
# コマンド
docker container create -it -v share-volume:/app1 --name u1 ubuntu:20.04
# 出力
8d1887e3c3424e02cb378a6ab217babd0dc8eb928a94590a1dec94da79900e1d
次に2つめのコンテナとして、docker container run
コマンドを使ってu2というコンテナをボリュームshare-volume
を紐づけて生成、実行します。
ボリュームをマウントする名前は、app2
にします
# コマンド
docker run -it -v share-volume:/app2 --name u2 ubuntu:20.04
# 出力
root@cdab74faf324:/#
u1
コンテナを別のshellで起動して、u1
、u2
どちらのコンテナにも接続した状態にします。
# コマンド
docker container start -i u1
# 出力
root@8d1887e3c342:/#
まずは、u1で、app1
に「hello.txt」ファイルを作成しつつ、データを流し込みます。
echo "hello from u1" > /app1/hello.txt
それを、u2
コンテナでcat
確認した後、追記します。
# コマンド
cat /app2/hello.txt
# 出力
hello from u1
# コマンド
echo "hello from u2" >> /app2/hello.txt
最後にu1でu2の変更が見れるかか確認してみます。
# コマンド
cat /app1/hello.txt
# 出力
hello from u1
hello from u2
このように1つのボリュームをそれぞれのコンテナ内から読み書きできることが分かります。
それぞれのオプションは、同じ効果になりますが、特徴として-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
今回は、基本的なボリュームの操作をまとめてみました。
次回の記事では、ボリュームをコンテナと連携させてより実際の動作に近い操作を行っていこうと思います