質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

4888閲覧

dockerのボリュームマウントとバインドマウントの違い

pokeharry

総合スコア27

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

1グッド

0クリップ

投稿2021/06/10 03:36

dockerのマウントについて質問です。

マウントには、
・bind mount
・volume
の2つがあるかと思います。

例えば、
ホストのソースの変更を、コンテナ内に反映させたい。
といった場合に、

バインドマウントだと、ホスト側のソースのパスとコンテナ内のパスを設定することで、コンテナ側からホスト側のファイルの読み取りや操作が可能になり、目的が達成出来るのが理解できます。

ただ、ボリュームマウントの方だと、この目的には適していないでしょうか?
バインドマウントは非推奨という記事を見かけるので気になります。
ボリュームには、どのようなデータが入っているのでしょうか。

よろしくお願い致します。

yuji38kwmt👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2021/06/10 05:15 編集

「ホスト」が指しているものがおかしい気がするんで、何を意味しているのか明確に。 > バインドマウントは非推奨という記事を見かける その記事のURLなり出典なりを提示しましょう。
pokeharry

2021/06/10 11:10

目的として ホストのソースの変更を、コンテナ内に反映させたい。 であれば、バインドマウントが適切なのでしょうか。 ボリュームマウント使用時の目的は主に何になるのでしょうか。
hoshi-takanori

2021/06/10 11:42 編集

自分はそんなに詳しくありませんが、docker を開発環境として使う場合は、ホスト OS とファイル共有する必要があり、必然的に bind mount することになるのでしょう。一方、運用環境として使う場合、docker の中だけからアクセスできれば良い (むしろ、ホスト OS からアクセスできると脆弱性の元となる) と考えれば bind mount は非推奨で、volume を使うべきってことになるのだと思います。(誤字訂正しました。)
pokeharry

2021/06/10 11:40

なるほど。 とても分かりやすい説明ありがとうございます。  volumeを使うときは、 コンテナの変更をボリュームに外部保存しておく というのが主な目的となる感じで、開発環境のような使い方はしない。なので、ホストOSのソースの場所など関係なく、コンテナとボリュームさえマウントしておけば良いという認識ですかね。
guest

回答1

0

ベストアンサー

Docker のボリュームについて

まず、大きな概念として、Dockerには「ボリューム」(volume)という考え方があります。詳細は https://docs.docker.com/storage/volumes/ のドキュメントにあります。

Docker コンテナを動かす時には、

  • Docker コンテナ用のイメージレイヤ
  • Docker イメージ用のイメージレイヤ

という、何らかのプログラムを実行するための、ファイルやディレクトリ等のデータを保管する用途の場所として、これらのイメージレイヤ抽象的な概念があります。これらとは別に、データだけを保存する用途の場所として「ボリューム」が存在します。

そして、ボリュームは、利用の仕方によって、次の図のように3つに分けられます(前後の説明スライドなどはこちらから参照ください)。

docker volume

この図は Docker 19.03 の頃までの公式ドキュメントを参考して書いたものです。

この頃までは明確に「ホスト側をマウント」するボリュームと、単体としての「ボリューム」は明確に区別していませんでした。どちらも、広い意味での「ボリューム」と呼ばれていたものです。

現在のドキュメントでは、図の「ホストをマウント」にあたる部分を「バインドマウント」(bind mount)という表現に改められ、

  • ホスト上のファイルやディレクトリを直接バインドするボリューム
  • Docker から「抽象的にデータを保管できる、ホスト上の場所」としてのボリューム

が区別されるようになり、ドキュメントも別々に準備されるようになりました。

とはいえ、Docker で「ファイルシステム上から見えるボリューム」とは、

  • (Docker Engine を実行しているホスト上の)「バインドマウント」ボリューム
  • (docker volume createコマンドで作成したり、Dokerfile で VOLUME 命令がある場合、docker-compose.yaml で volumes: で定義している)「ボリューム」

いずれも Docker コンテナ内からは同じように見えます。

ですので、見た目としては、「バインドマウント」も「ボリューム」でも、入っているデータは同じの場合があります。

ボリュームの使い分けについて

バインドマウントだと、ホスト側のソースのパスとコンテナ内のパスを設定することで、コンテナ側からホスト側のファイルの読み取りや操作が可能になり、目的が達成出来るのが理解できます。

ただ、ボリュームマウントの方だと、この目的には適していないでしょうか?

バインドマウントは非推奨という記事を見かけるので気になります。

「バインドマウント」は非推奨という公式ドキュメントの記述はないと思うのですが、その記事には、何か前提条件があったりするのではないでしょうか。

たとえば、1つの Docker Engine ホスト上で、同じ設定のコンテナを複数実行する時、「バインドマウント」と「ボリューム」では注意点が変わってきます。

「バインドマウント」と「ボリューム」で共通する挙動として、

  • バインドマウントによって、複数のコンテナがホスト上のファイルやディレクトリを同時にアクセス場合
  • 同じ名前のボリュームを、複数のコンテナから同時にアクセスする場合

これらの場合、

  • 意図しない同時アクセスが発生(結果、ファイルが破損したり消失する)
  • ファイル内容の編集や操作をする可能性(結果、アプリケーションが動作しなくなったり、複数のコンテナを同時調査しなくてはならず、トラブル時の問題解決に時間がかかりがち)

などが予想されます。

一方、「ボリューム」を各コンテナごとに使い分ければ、先にあげたようなトラブル発生のリスクを軽減できるでしょう。

その他 Docker Desktop の場合は、

  • 実装上、Windows や macOS の OS 側ファイルシステムと一緒に見せるため、処理に時間がかかりがち
  • OS 側とコンテナ内では、所有者やグループ(UID・GID)が違う場合が多く、工夫が必要

といった理由によって、初学者にはお勧めしていない可能性もありそうです。

投稿2021/06/10 19:51

編集2021/06/10 19:53
zembutsu

総合スコア1584

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pokeharry

2021/06/11 12:28

非常に分かりやすい説明ありがとうございます! バインドマウントとボリュームマウントは 使う目的や用途が結構異なるものなのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問