はじめに
こちらはDockerにおけるデータ管理についての記事になります。情報が陳腐化している箇所もありますのでご了承ください。
以下は、私がDocker関連についてまとめている記事になります。もし興味がありましたらご覧になってください。
最初にDockerにおいて、コンテナ内のデータをPC(ホスト)のファイルシステムに紐付けることができるマウント
という用語について確認したいと思います。
マウントとは
ホストマシンのディレクトリやファイルシステムをDockerコンテナに接続して、利用可能な状態にすることを指します。
Dockerコンテナ内に格納されたデータは、コンテナを停止しても消えることはありませんが、コンテナを削除した場合にはデータも併せて消えてしまいます。
Dockerのマウント機能を利用すると、コンテナ内のデータをPC(ホスト)のファイルシステムに紐付けることができるようになるため、コンテナの作成・削除を繰り返すライフサイクルと切り離して、データを永続的に管理できるようになります。
Dockerに記憶領域をマウントする3つの方法
Dockerコンテナ内で生成されたデータを永続化するためには、ホストマシンとのデータの共有が必要です。Dockerにおけるデータの共有には以下3つの方法が挙げられます。
- ボリュームマウント
- バインドマウント
- tmpfs(一時メモリ)マウント
では最初にボリュームマウント
について解説していきます。
ボリュームマウント
Dockerによって管理されているホストファイルシステム上の一部に保管し、コンテナにマウントすることです。
ボリュームマウントのメリットには以下が挙げられます。
- Dockerが提供するデータ管理機能を利用するため、コンテナの移動やバックアップの際に便利です。
- データの永続性が保証され、コンテナの再作成や更新時にデータが保持されます。
- 複数のコンテナ間で同じボリュームを共有できるため、データの共有が容易です。
ボリュームの注意点について
それは、マウントしたデータの編集方法に制約がある点です。ボリュームマウントは、コンテナを経由せずに直接ボリュームにアクセスすることができません。そのため、マウントしたファイルを編集する場合、コンテナを経由して編集する前提となります。
コンテナ起動時のボリュームマウントの動作について
- まだ存在しないボリューム名を使用して、マウントした場合かつ、マウントポイントのディレクトリにファイルが存在しない場合は空のボリュームが作成され、マウントした時点で中身が空の状態になります。
- もう1つのパターンがまだ存在しないボリューム名を使用して、マウントした場合かつ、マウントポイントのディレクトリに既にディレクトリやファイルが存在する場合は、作成されたボリュームにコンテナ上に存在しているディレクトリやファイルがコピーされます。
以下に、ボリューム関連のコマンドについて説明していきます。
ボリューム作成
Dockerのボリュームを作成するコマンドはdocker volume create <ボリューム名>
になります。
$ docker volume create my-vol
ボリュームの一覧を表示
my-vol
というボリュームが作成されたかどうかを確認するにはdocker volume ls
コマンドを使います。
$ docker volume ls
DRIVER VOLUME NAME
local my-vol
ボリュームの詳細情報を表示
また、my-vol
がどこに存在するかを確認するにはdocker volume inspect <ボリューム名>
コマンドを使います。
$ docker volume inspect my-vol
[
{
"CreatedAt": "2023-06-26T04:54:52Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": null,
"Scope": "local"
}
]
上記を見ると、"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
と記載されており、my-vol
ボリュームが/var/lib/docker/volumes/my-vol/_data
に作成されていることが確認できました。
ボリュームをマウントする方法
ボリュームをマウントするには-v
オプションを使ってコンテナを起動する必要があります。
$ docker run -itd --name mount-c1 -v vol1:/app nginx:latest
$ docker inspect mount mount-c1
// 省略
"Mounts": [
{
"Type": "volume",
"Name": "vol1",
"Source": "/var/lib/docker/volumes/vol1/_data",
"Destination": "/app",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
// 省略
ボリュームの削除
ボリュームの削除にはdocker volume rm <ボリューム名>
コマンドを使用します。
$ docker volume rm my-vol
マウントされていないボリュームを全て削除
マウントしていないボリュームを一括削除する場合、以下のコマンドを実行します。
$ docker volume prune
バインドマウント
Docker Engineの管理下にない既存ディレクトリ(デスクトップやドキュメント等)をコンテナにマウントすることをバインドマウントと呼びます。
バインドマウントを使用すると、コンテナ内の変更はホストマシンのファイルシステムに直接反映され、同様にホストマシン側の変更もコンテナに反映されます。これにより、コンテナ内外でのデータの共有や永続化が可能になります。
バインドマウントを使用するには、-vオプションを使用してコンテナのディレクトリとホストマシンのディレクトリを指定します。
$ docker run -itd --name bind-test -v "$(pwd)"/source:/app nginx
tmpfs(一時メモリ)マウント
Linuxにおいて一時的なファイルシステムをメモリ上に作成するための仕組みです。tmpfsを使用すると、メモリ上にファイルシステムを作成し、データの読み書きを高速に行うことができます。
tmpfsは、一時ファイルや一時データを格納するために使用されることが一般的です。例えば、一時ファイル、一時的なキャッシュデータ、ログファイルなど、一時的なデータを効率的に処理する際に利用されます。
ただ、コンテナの再起動やホストの再起動によって、データが失われることにも注意する必要があります。
tmpfsオプションを使用してtmpfsをマウントすることができます。以下は、Dockerコマンドでtmpfsをマウントする例です。
$ docker run -d --name tempf-test --tmpfs /tmp -p 8080:80 nginx
終わりに
最後まで記事をご覧いただきありがとうございました。
間違い等ありましたらご指摘いただけると幸いです
参考