bind mountを使用したデータ管理
volumeとは違い、ホストのユーザーが管理しているファイルやディレクトリをコンテナ上にマウントするもの。こちらも同一のファイルやディレクトリを複数のコンテナにマウントすることができる。ユーザーが管理している領域なので、基本的にはマウント元のファイルやディレクトリは事前に用意しておき、そのパスを指定してコンテナにマウントする。プロジェクトのソースコードや設定ファイルなどをホストに置いておき、それをマウントすることにより、ホスト側でファイルを編集しながら動作を確認することができる。
-vを使用し、カレントディレクトリ上のディレクトリをコンテナにbind mountする
-# "$(pwd)"でカレントディレクトリ上のsourceディレクトリ(存在しない)をマウントしている。
$ docker run -itd --name bind-test1 -v “$(pwd)”/source:/app nginx
$ ls
source
-v を使用した場合はディレクトリが存在しない場合に、自動的にホスト上にディレクトリが作成される。
--mountを使用した場合
-# “$(pwd)”/source2で存在しないディレクトリをマウントしている。
$ docker run -itd —-name bind-test2 —mount type=bind,source=“$(pwd)”/source2,target=/app nginx
Typeをbindに指定。カレントディレクトにはsource2というディレクトリは存在しない状態で実行する。この場合エラーが発生する。--mountの場合はsourceのディレクトリが存在しない場合はエラーになる。これによって誤って、空のディレクトリをマウントしてしまうことを避けることができる。bind mountの状態はvolumeと同様に、コンテナの詳細情報を表示することで確認できる。
コンテナのMountの確認
-# bind-test1の詳細確認
$ docker inspect bind-test1
"Mounts": [
{
"Type": "bind",
"Source": "/home/docker/source",
"Destination": "/app",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
Type,Source,Destinationでそれぞれ確認することができる。デフォルトで読み書き可能な状態でマウントされる。bind mountではbindするディレクトリで、マウント先のディレクトリやファイルが隠れてしまうことに注意する。重要なファイルやディレクトリをbindで覆ってしまった場合、コンテナが正常に動作しなくなる恐れがある。bind mountでも読み取り専用でマウントすることができる。
tmpfsを使用したデータ管理
ホストのメモリの領域をコンテナにファイルシステムとしてマウントする。メモリ上にデータが置かれるためdockerホストがシャットダウンされたり、コンテナが停止した場合はデータが消えてしまう。用途としては永続的なデータを置くのではなく一時的に保持しておくようなデータの置き場所に使用し、消えてしまっても問題ないデータを置く。キャッシュや、ワンタイムパスワードなど。オプションでマウントサイズを制限することもできる。
--mountを使用した場合
-# 例
$ docker run -itd --name tmptest --mount type=tmpfs,destination=/app nginx
tmpfsを使う場合、typeにtmpfsを指定する。デフォルトではマウントサイズは無制限でメモリが足りなくなった場合は、swapが使われることになる。マウントサイズはオプションの指定で制限することができる。
-# 例
$ docker run -itd --name tmptest2 --mount type=tmpfs,destination=/app,tmpfs-size=500000000,tmpfs-mode=700 nginx
マウントサイズを500MBに設定して、ファイルモードを700に設定した。