Docker におけるマウントについて学んだので、自分なりにまとめてみました。
そもそもなぜマウントが必要なのか?
A. コンテナはホスト環境から独立したシステムを持ち、一度破棄すると内部のデータやファイルなどが失われるからです。
コンテナの外部にマウントすることで、コンテナの一時的な破棄が問題ではなくなります。
そのため、コンテナ自体のアップデートが容易になったり、コンテナ間のデータ共有が可能になったりと様々なメリットがあります。
コンテナでは、「実行するシステム」と「扱うデータ」は別に管理することが推奨されます。
要するに、コンテナの外(Dockerホスト もしくは Docker Engine ※後述)でデータを保存しましょう、ということです。
バインドマウントとボリュームマウント
マウントには大きく2つ種類があります。
1. バインドマウント
Docker ホストにあらかじめディレクトリを作っておき、それをマウントする方法です。
メリット
- Docker ホスト上にあるファイルをコンテナから扱える
- 作業ディレクトリでの変更を即座に Docker コンテナから参照できるため、開発に便利
2. ボリュームマウント
Docker ホストのディレクトリではなく、Docker Engine上で確保された領域をマウントする方法です。
メリット
-
Docker Engine上で管理されるため、ボリュームの保存場所の物理的な位置を気にしなくていい
- チームメンバーごとにDocker ホストのディレクトリ構成に差異があっても問題ない
-
Docker コンテナが扱うデータをブラックボックスとして扱える
- データベースのデータなど、Dcoker ホストから不用意にデータを書き換えたくない場面などに有効
他に、tmpfs マウントも存在しますが、今回は割愛します。
気になる人はDocker 公式ドキュメントを参照してください。
ボリュームの作成とマウントの実行
まずボリュームを作成します。
docker volume create --name ボリューム名
作成したボリュームをマウントします。2種類のオプションがあります。
- -v オプション
-v マウント元:マウント先
- --mount オプション
--mount type=マウントの種類(bind or volume),src=マウント元,dst=マウント先
mount オプションが推奨される理由
--mount オプションは Docker バージョン17.06からサポートされました。
どちらを使っても結果は同じですが、以下の理由から --mount の方が推奨されています。
1. マウントの種類(バインド or マウント)が明示されている
- -v オプションでは、マウント元が 「/」 から始まるとバインドマウント、そうでないときはボリュームマウントとしてマウントされます。これは非常に分かりにくく、間違える可能性が高いです
2. ボリュームが存在しないときに新規作成されない
- -v オプションではその場でボリュームを作成することもできるが、タイプミスしたとき致命的な問題になりうる
- --mount オプションではボリュームが存在しないときは新規作成せず、エラーが発生する
参考
- さわって学ぶクラウドインフラ docker基礎からのコンテナ構築
- Docker&仮想サーバー完全入門 Webクリエイター&エンジニアの作業がはかどる開発環境構築ガイド
- Docker 公式ドキュメント