[Docker] Docker Storageについて知ろう: Volume vs Bind Mount
Docker Storage
今回はDocker Storageについて説明します。
Storageはその名の通り単純に保存領域を意味しますが、コンテナを使用する場合、従来のものよりやや複雑に感じるかもしれません。
これは開発においてStorageが非常に重要な部分であり、多くの人がコンテナベースの開発環境よりもHost OSベースのlocal
開発環境を採用する理由でもあります。
一部の人は実際のデプロイサーバーでだけ
dockerize
するのが良いと言いますが、私はlocal
開発環境にもDockerを適用した方がその真価を見られると考えます。
上記はDockerで使用するStorageを図で説明したものです。
Bind Mount
bind mount
はHost OS
のファイルシステム(以下FS)と、Container
のFSをlinking
することで、コンテナ内部にあたかもHost OS
のファイルがあるかのように動作させることができます。
実際にはそのように動作し、Linuxコマンドのln
コマンドに似ていると言えるでしょう。
このコマンドを通じて、単にHost OSのFSを接続する用途だけでなく、コンテナ間で同じ作業空間を指す作業を進めることも可能です。
しかし、該当方式には問題点があります。
当然のことながら、Host OS
の影響を大きく受けるということです。
特にWindowsのファイルシステムの場合、
C:\
、D:\
のように始まることが一般的で、設定時にUnixやLinux系のパスとは異なる設定が必要という面倒さがあります。
開発時のWindowsは常に厄介です。
-v, --volume
前章ではcreate, run, exec
など、docker
で使用可能な有用なコマンドと合わせてオプションを確認しました。
その中でbind mount
を行うことができるオプションがこのオプションです。
$ docker [create|run|exec...] ... -v [HOST_PATH]:[CONTAINER_PATH] ...
上記のように使用でき、このコマンドを通じてHOST_OS
のStorage
とCONTAINER
のStorage
を接続できます。
--mount
使い方と用途が似たコマンドで、ほぼ同様に動作しますが、違いがあるとすれば、[HOST_PATH]
がない場合には実行されず、例外を返すという点です。
-v
オプションの場合はエンドポイントパスを自動で生成します。
# Example
# $(pwd): 現在の作業ディレクトリパスを表します。
# -- mount 使用時
$ docker run -d \
-it \
--name devtest \
--mount type=bind,source="$(pwd)"/target,target=/app \
nginx:latest
# -v 使用時
$ docker run -d \
-it \
--name devtest \
-v "$(pwd)"/target:/app \
nginx:latest
Parameter
--mount
オプションで使用するパラメータは次の通りです。
Param | Description |
---|---|
type | [volume |bind ] volume を使用するか、bind mount を使用するかの選択 |
source | HOST_PATH |
target | CONTAINER_PATH |
Docker Volume
Docker公式ドキュメントによると、Docker Volumeはコンテナで生成し使用するデータを維持するための基本メカニズムと定義されています。
類似の概念として前述のbind mount
があります。
ただし、この概念はHost OS
のFSを直接使用するのではなく、Docker
が管理するStorage
という点で違いがあります。
つまりOSに関係なく保存領域をコンテナ間で共有できます。
ただし、正確な用途としてはHost OS
と接続するより、複数のコンテナでそのVolumeのファイルを共有する必要がある場合に利用するといったのがより適しています。
例えば、特定の設定ファイルなどが該当します。変更時にリアルタイムで反映される必要がないものに対して有用です。
長所
Docker公式ドキュメントでは、Docker Volumeは前述のbind mountより以下のような長所があると説明されています。
- ボリュームはバインドマウントよりバックアップまたはマイグレーションが簡単です。
- Docker CLIコマンドまたはDocker APIを使用してボリュームを管理することができます。
- ボリュームはLinuxおよびWindowsコンテナで動作します。
- 複数のコンテナ間でボリュームをより安全に共有できます。
- ボリュームドライバーを使用すると、リモートホストまたはクラウドプロバイダーにボリュームを保存し、ボリュームの内容を暗号化したり他の機能を追加することができます。
- 新しいボリュームのコンテンツはコンテナによって事前に埋め込むことができます。
- Docker Desktopのボリュームは、MacおよびWindowsホストのバインドマウントに比べてはるかに高いパフォーマンスを持っています。
作成
では、Docker Volumeを作ってみましょう。
$ docker volume create my-vol
上記コマンドで簡単にVolumeを作ることができます。
$ docker volume inspect my-vol
[
{
"CreatedAt": "2022-07-18T23:53:04Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
docker volume inspect [VOL_NAME]
コマンドは、存在するボリュームの詳細を確認します。
削除
$ docker volume rm my-vol
簡単なコマンドで作成したVolumeを削除することができます。
Reference