背景
Dockerは、コンテナ内でデータを永続化するために、3つの異なるマウントタイプを提供しています:ボリューム(Volumes)、バインドマウンテン(Bind mount)、tmpfs mount。
以前はよくbind mountsを使うが、VolumesとTMPFSにはよくわからないため、調べました。
👇公式ドキュメント
https://docs.docker.com/storage/
1.Volumes、Bind mount、tmpfsについて
-
Volumes:Volumesはホストマシンのパスです。デフォルトでは、
/var/lib/docker/volumes。Dockerプロセスまたrootユーザでない限り、このパスの下のファイルを変更できないため、データ永続化の一番安全なタイプと言われている。 -
Bind mounts:Bind mountsはホストマシンの任意のパスにデータを保存でき、Dockerプロセスでなくても変更できるため、セキュリティリスクがあると言われている。
-
tmpfs:ホストマシンのメモリにのみ保存され、コンテナが停止するとメモリ上から削除されてしまう。
2.共通点
Volumes、Bind mount、tmpfsのどちらでも、コンテナのデータをホストマシンに保存できる。
3.相違点
3-1. 保存場所
| タイプ | 保存場所 |
|---|---|
| Volumes | /var/lib/docker/volumes |
| Bind mounts | ユーザ指定 |
| tmpfs | メモリ |
3-2. データ安全性
| タイプ | 保存場所 |
|---|---|
| Volumes | Docker管理のため、安全性高い |
| Bind mounts | 便利だけど、任意の指定& Docker管理されていないため、安全性の懸念がある |
| tmpfs | コンテナが停止すると、データがなくなる。要注意! |
3-2. コンテナ新規の際、VolumesとBind の違い
| タイプ | ホスト側のディレクトリ | コンテナ側のディレクトリ | コンテナ側の結果 |
|---|---|---|---|
| Volumes | 空白 | 空白 | 空白 |
| Volumes | 非空 | 空白 | ホストの内容を取り込んで非空になる |
| Volumes | 空白 | 非空 | 上書きされないで非空のまま |
| Volumes | 非空 | 非空 | 異なる部分は上書きされ、異なる部分はホストから取り込む |
| Bind mounts | 空白 | 空白 | 空白 |
| Bind mounts | 非空 | 空白 | ホストの内容を取り込んで非空になる |
| Bind mounts | 空白 | 非空 | 上書きされて空白になる ★ |
| Bind mounts | 非空 | 非空 | ホストの内容で上書きされて非空 ★ |
3-2. コマンド
Volumes:2種類ある
例1:-v nginx-vol1:/usr/share/nginx/html:ro
| コマンド | 説明 | 備考 |
|---|---|---|
| -v | 固定文字 | - |
| nginx-vol1 | volumes名、自由に決める | docker volume createで事前作成しない場合、コンテナを新規する際、自動で作成される。 |
| /usr/share/nginx/html | コンテナ側のディレクトリを指定 | 絶対パス |
| ro | コンテナ側readonly読み取り専用 | 省略する場合はデフォルト値rw |
例2:--mount type=volume,source=nginx-vol1,destination=/usr/share/nginx/html,readonly
例1の説明を参考
Bind mount:2種類ある
例1:-v /home/test/html:/usr/share/nginx/html:ro
| コマンド | 説明 | 備考 |
|---|---|---|
| -v | 固定文字 | - |
| /home/test/html | ホスト側のディレクトリを指定 | 絶対パス |
| /usr/share/nginx/html | コンテナ側のディレクトリを指定 | 絶対パス |
| ro | コンテナ側readonly読み取り専用 | 省略する場合はデフォルト値rw |
例2:--mount type=bind,source=/home/test/html,destination=/usr/share/nginx/html,readonly
例1の説明を参考
TMPFS:2種類ある
例1:--tmpfs /app
| コマンド | 説明 | 備考 |
|---|---|---|
| –tmpfs | 固定文字 | - |
| /app | ホスト側のディレクトリを指定 | 絶対パス |
例2:--mount type=tmpfs,destination=/app,tmpfs-size=1024,tmpfs-mode=1770
| コマンド | 説明 | 備考 |
|---|---|---|
| –mount type=tmpfs | 固定文字 | - |
| destination=/app | コンテナ側のディレクトリを指定 | 絶対パス |
| tmpfs-size | サイズ指定 | 単位はbytes |
| tmpfs-mode | ファイルのモードを指定 | - |
4.デモ
デモ概要:
今回はnginxを例として、
まず、なにもmountしない場合、nginxコンテナの初期状態を確認。
nginxコンテナの初期状態には:
/usr/share/nginx/htmlデータあり、
/usr/local/share/fontsデータなし。
そして、VolumesとBind のタイプを使って別々でコンテナを新規して、
htmlとfont両フォルダの結果を確認。
4-1. nginxコンテナの初期状態を確認

4-2. Volumesタイプ(データなし)2個を用意してコンテナを新規

4-3. Volumesタイプ(データあり)2個を用意してコンテナを新規

4-4. Bind タイプ(データなし)2個を用意してコンテナを新規

4-5. Bind タイプ(データあり)2個を用意してコンテナを新規

コメント欄