こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
- 「ボリュームマウント」「バインドマウント」「tmpfsマウント」の概要・違いを知りたい
- 上記マウントを実行できるコマンド操作方法が知りたい
【Docker】マウントとは?
マウントとは、PCに接続している周辺機器・外部記憶装置等をOSに認識させ、利用可能な状態にすることです。
例えば、USBメモリをPCに接続すると、USBメモリ内のフォルダが開けるようになりますね。これはUSBメモリをPCにマウントしたことを指します。
Dockerコンテナ内に格納されたデータは、コンテナを停止しても消えることはありませんが、コンテナを削除した場合にはデータも併せて消えてしまいます。
コンテナは、ソフトウェアのバージョンアップに伴い削除するのが一般的です。頻繁に作成と削除を繰り返し行うため、コンテナ内にあるデータは、コンテナ外部で管理するのが好ましいと言えます。
Dockerのマウント機能を利用すると、コンテナ内のデータをPC(ホスト)のファイルシステムに紐付けることができるようになるため、コンテナの作成・削除を繰り返すライフサイクルとは切り離して、データを永続的に管理できるようになります。
【Docker】ボリューム・バインド・tmpfsマウントの仕組み・違い
Dockerに記憶領域をマウントするには、3種類の方法があります。以下、1つずつ確認していきましょう。
- ボリュームマウント
- バインドマウント
- 一時メモリ(tmpfs)マウント
ボリュームマウント(Volume Mount)
Docker Engine管理下にボリュームを作成し、ディスクとしてコンテナにマウントすることをボリュームマウントと呼びます。
ボリュームマウントの場合、Docker Engine管理下にあるため、ユーザーがファイルの場所を意識する必要がありません。そのため、PCでの操作のように、ファイルを誤って消すようなミスが起こりづらいと言えます。
また、Windows、Mac、LinuxにおけるOSによる異なるコマンド操作の影響を受けないというメリットがあります。例えば、MacとWindowsのコマンド操作方法を見ると、ディレクトリの指定方法が異なる等があります。後述するバインドマウントの場合、Windowsユーザーが作成したコンテナをMacユーザーに配る場合、ディレクトリ指定コマンドを修正する必要がありますが、ボリュームマウントの場合はそれが不要になります。
このようにボリュームマウントは手軽な一方で、注意が必要な点が1点あります。それは、マウントしたデータの編集方法に制約がある点です。ボリュームマウントは、コンテナを経由せずに直接ボリュームにアクセスすることができません。そのため、マウントしたファイルを編集する場合、コンテナを経由して編集する前提となります。
上記のような制約のもと、更新頻度の少ないデータをマウントする場合において、ボリュームマウントは有効であると言えます。
バインドマウント(Bind Mount)
DockerをインストールしたPC内のように、Docker Engineの管理下にない既存ディレクトリ(デスクトップやドキュメント等)をコンテナにマウントすることをバインドマウントと呼びます。
バインドマウントは、ホスト側の領域にマウントするため、マウント先のファイルを直接開いたり編集することが可能です。そのため、頻繁に更新するデータの場合、バインドマウントを適用することが推奨されます。
一時メモリマウント(Tmpfs Mount)
メモリをマウント先に指定する方法を一時メモリ(tmpfs)マウントと呼びます。
ディスクではなく、メモリをマウント先に指定するため、ファイルの読み書きが高速に実行できるというメリットがあります。
一方で、一時的なメモリ領域を活用してデータを保存することになるため、ここに保存したデータは、コンテナ停止やホストを再起動した際に消滅してしまうことに注意が必要です。
【コマンド操作実践】ボリュームマウント
ボリュームマウントに関連するコマンド操作について言及します。
ボリューム作成
Docker Engine管理下にボリュームを作成する場合、以下のコマンドを実行します。
docker volume create <ボリューム名>
ボリューム一覧を表示
ボリュームを一覧表示する場合、以下のコマンドを実行します。
docker volume ls
ボリュームの詳細情報を確認
指定のボリュームの詳細情報を表示する場合、以下のコマンドを実行します。
コマンド
docker volume inspect <ボリューム名>
出力イメージ
[
{
"CreatedAt": "2024-12-31T22:43:03Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/test/_data",
"Name": "test",
"Options": {},
"Scope": "local"
}
]
ボリュームを削除
指定したボリュームを削除する場合、以下のコマンドを実行します。
docker volume rm <ボリューム名>
マウントされていないボリュームを全て削除
マウントしていないボリュームを一括削除する場合、以下のコマンドを実行します。
docker volume prune
【コマンド操作実践】バインドマウント
以下の設定情報のもとバインドマウントを実践する方法について示します。マウント先のディレクトリは事前に作成した上で実行するようにしましょう。
マウント設定
設定項目 | 値 |
---|---|
コンテナ内のパス | /usr/local/abc/folder |
ホスト側のパス | /User/Desktop/TestFolder |
コンテナ名 | container_name |
イメージ名 | image_name |
ポート番号 | 8090 |
コマンド(ひな型)
docker run --name <コンテナ名> -d -p <ポート番号> -v <ホスト側のパス>:<コンテナ内のパス> <イメージ名>
コマンド(実例)
docker run --name container_name -d -p 8090:80 -v /User/Desktop/TestFolder:/usr/local/abc/folder image_name
【参考】Docker関連記事・おすすめ学習法
【厳選】Dockerの学習におすすめの教材
Dockerについて詳しく学習したいという方向けにおすすめの教材をご紹介します。厳選した教材をこちらにまとめていますため併せてご覧下さい。
Docker・Kubernetesの学習におすすめ入門本・動画教材7選|マイクロサービス基盤「コンテナ」の理解促進
次世代のアプリケーションアーキテクチャとして注目度の高いマイクロサービスの基盤であるコンテナ技術Dockerおよびコンテナオーケストレーション技術のKubernetesについて詳しく学びたい方向けに、厳選したおすすめ教材を紹介します。
Docker関連記事一覧
当サイトではDockerに関する記事を多数投稿しています。是非ご覧ください。
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら