🐾

【Docker】ボリュームとバインドマウント

2022/12/28に公開

ホストマシンとコンテナでファイルを共有する方法

ボリューム

ボリュームとは

ボリュームはコンテナ内のファイルをホストマシン上で Docker が管理してくれる仕組み です。
ホストマシン側のどこに保存されているかは関心がなくとにかくデータを永続化したい という場合に有用で、たとえばデータベースのデータの永続化に活用できます。

構築

1. ボリュームの作成
docker volume create [option]
option 用途
--name 名前で扱えるようにする
2. ボリュームの確認
docker volume ls
3. ボリュームのマウント
  • 作成したボリュームは、コンテナ起動時にマウントして使う
  • container runには--volume--mountオプションがあるが、--mountオプションの方が読みやすくDocker Composeとの読み換えもしやすい
4. 作成したボリュームの詳細確認
volume inspect <volume>

バインドマウント

バインドマウントとは

バインドマウントは ホストマシンの任意のディレクトリをコンテナにマウントする 仕組みです。
ホストマシンとコンテナ双方がファイルの変更に関心がある という場合に有用で、たとえばソースコードの共有などに活用できます。

構築

1.マウント
  • ボリュームと違い既存のディレクトリをそのまま使うので事前準備は不要
  • バインドマウントも--volume--mountオプションのどちらでも行えるが、--mountオプションを使う方が良い
2. マウントできたことの確認
  • コンテナに接続してマウントしたディレクトリが確認できればOK

注意点

バインドマウントの実体は そのままホストマシンのファイルシステム です。
つまりバインドマウントはボリュームと比べると 実体の面倒を見ているのが Docker ではなく自分 であり、それが ホストマシン上 であるという違いがあります。
「仮想環境だから」と安易に rm -rf * でもして、もしそこにバインドマウントしたディレクトリが含まれていたら、削除はホストマシンに波及します。
Git を使っていれば事故があってもなんとかなりますし、そもそも / を / にマウントするような極端なことをしなければ危険は全然ありませんが、違いは正しく把握しておくと良いでしょう。
Docker の公式も まずはボリュームを検討し、どうしてもだめならバインドマウントを使え と言っています。

COPYとの使い分け

COPY
  • 設定ファイルなど、コンテナによって変えないかつ滅多に変更しないものを配置する場合
  • 本番デプロイ時のソースコードなど、即起動できる配布物を作る場合
バインドマウント
  • 開発時のソースコードなど、ホストマシンで変更したいがコンテナに随時反映したいものがある場合
  • 初期化クエリなど、イメージを配布する時点では用意できないものがある場合

マウント方法

--mountオプションによるマウント

  • key=valueの形式で設定を列挙して指定する
  • 主なキーはtypesourcedestination
  • typevolumeを指定するとボリューム、bindを指定するとバインドマウントになる
--mount type=(volume or bind),
  src=<マウント元>,dst=<マウント先>, [option]

--volumeオプションによるマウント

  • 設定を定められた順番で:区切りで列挙して指定する
  • 1つ目にボリューム名を設定するとボリューム、絶対パスを指定するとバインドマウントになる
  • 2つ目はマウント先、3つ目は任意のオプションとなる
--volume <volume名 or 絶対パス> :
  <マウント先> : [option]

参考記事

https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59

Discussion