背景
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両フォルダの結果を確認。
コメント欄