概要
ここでは、ボリュームを利用したデータの永続化についてを記載する。
コンテナは、ファイルの作成・更新・削除ができるが、コンテナを削除するとそれらの変更が消失する。
ボリュームは、コンテナ内のデータを永続化するために利用する。
ボリュームマウント
ボリュームとは?
ボリュームは、コンテナ内で指定したファイルシステムのパスをホストOS上に接続できる機能を持つ。
ボリュームは、Docker CLIコマンドやDocker APIから管理することができる。
# Dockerボリュームを作成する。
$ docker volume create my-vol
ボリュームマウント
ボリュームマウントとは、コンテナ内のファイルシステムにホストOS上のボリュームをマウントすること。
ボリュームマウントは、以下を可能とする。
- コンテナ内のデータの永続化
- コンテナとホストOSもしくは、その他のコンテナとの間でのデータ共有
ボリュームマウントを設定する
まずは、コンテナ内のディレクトリをマウントするボリュームを作成する必要がある。
docker volume createコマンドからボリュームを作成できる。
$ docker volume create todo-db
ボリュームマウントは、以下の二つの指定方法がある。
-
--mountフラグ(推奨)$ docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started- オプション説明
-
type: マウントの形式を指定する。(volume,bind,tmpfs) -
src: マウント元のボリュームを指定する。今回の場合は、sample-volumeにマウントするため、これを指定している。 -
target: コンテナ内のファイルシステム上のマウント先のディレクトリを指定する。
-
- オプション説明
-
--volumeフラグ$ docker run -dp 127.0.0.1:3000:3000 -v todo-db:/etc/todos-
オプション説明
—-volumeもしくは、-vフラグの場合には、:で区切られた3つのフィールドで構成される。-
field1: ボリューム名を指定する。(無名ボリュームの場合には省略する。) -
field2: コンテナ内のファイルシステム上のマウント先のディレクトリを指定する。 -
field3:roのようなオプションを指定する。
-
-
上に示した方法で、コンテナを起動することで、コンテナのファイルシステムとボリュームとのマウントを設定できる。
コンテナを生成し直しても、アプリケーションで生成されたデータは保持されたままとなる。
ボリュームの位置を確認する
実際にボリュームが保存されている場所は、docker volume inspectコマンドで調べることができる。
$ docker volume inspect todo-db
[
{
"CreatedAt": "2023-12-29T06:12:40Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
"Name": "todo-db",
"Options": {},
"Scope": "local"
}
]
ホストOS上のMountpointに保存されている。
マウント元のボリュームを確認する
コンテナ名からマウント元のボリュームを確認することができる。
$ docker inspect db_container
... # 長すぎるので省略
"Mounts": [
{
"Type": "volume",
"Name": "todo-db",
"Source": "/var/lib/docker/volumes/todo-db/_data",
"Destination": "/etc/todos",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
...
名前付きボリューム
コンテナの起動時にボリュームを生成することができる。
通常は、ボリュームを作成し、作成したボリュームを指定してコンテナを起動することでボリュームマウントが行われる。
docker runコマンドで名前付きボリュームを指定すると、コンテナ起動時にボリュームが生成され、自動的にマウントされる。
-
-vフラグ:で区切られた3つのフィールドを指定する。-
myvol- ボリューム名を指定する。
- 無名のボリュームにする場合は省略する。
-
/app- コンテナ内のマウントするファイルシステムを指定する。
-
$ docker run -d \
-v myvol2:/app \
nginx:latest
-
**--mountフラグ**複数のキーとバリューのペアで構成される。
-
source- ボリューム名を指定する。
- 無名のボリュームにする場合は省略する。
-
target- コンテナ内のマウントするファイルシステムを指定する。
-
$ docker run -d \
--mount source=myvol2,target=/app \
nginx:latest