概要
ここでは、ボリュームを利用したデータの永続化についてを記載する。
コンテナは、ファイルの作成・更新・削除ができるが、コンテナを削除するとそれらの変更が消失する。
ボリューム
は、コンテナ内のデータを永続化するために利用する。
ボリュームマウント
ボリュームとは?
ボリュームは、コンテナ内で指定したファイルシステムのパスをホスト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