バインドマウント、ボリューム・COPYとの違い!
バインドマウントとは
このバインドマウントとは、ホストマシンの任意のディレクトリをコンテナにマウントする仕組みのことです。これによって、マウントされたディレクトリの変更は随時同期され、転送などの操作は不要になります。
これらの特徴から、ボリュームではなくバインドマウントを使用した方が恩恵が受けられるのが、ホストマシンとコンテナ双方がファイルの更新に関心があるソースコードなどのディレクトリをバインドマウントすることです。
ボリュームとの違い
ここでは、よく比較されるボリュームとバインドマウントの違いについて説明します。ボリュームとバインドマウントの最大の違いは、データやファイルをDockerが管理しているか、ホストマシンが管理しているかという点です。ボリュームの場合、docker volume create
コマンドでボリュームを作成し、データをDocker Desktop上のLinux OSに保存しています。これに対して、バインドマウントはマウントしたいホストマシン上のディレクトリ絶対パスを指定して直接マウントします。つまり、バインドマウントの場合、ディレクトリの削除などはホストマシンにも影響を及ぼします。
そのため選択基準としては、基本はボリュームで実装できないかを検討し、どうしても都合が悪い場合にバインドマウントを使用するようにしましょう。
COPYとの違い
ここでは、Dockerfileなどでよく目にするCOPYとバインドマウントの違いについて説明します。このCOPYとバインドマウントの最大の違いは変更が反映されるタイミングにあります。
COPYは、image builde
をするタイミングでイメージにファイルを含めるためコンテナが起動された時にはファイルが存在し、元のファイルを変更してもコンテナには反映されません(再buildeが必要)。これに対して、先ほども説明しましたが、バインドマウントはマウントしたディレクトリがホストマシンによって管理されるため、ファイルの変更は随時同期されていきます。
このような特徴から、COPYは「設定ファイルなどの変更が少ないもの」「本番デプロイ時のソースコード」などの場合に使用するのが望ましいでしょう。
バインドマウントの指定方法
バインドマウントの指定方法は、ボリュームと同様--volume
と--mount
の二つが存在する。
--volumeオプションによるマウント
→一つ目の:区切りをボリューム名ではなく、絶対パスにすることでバインドマウントと判断される。また、二つ目の:区切りはマウント先を指定する。
--mountオプションによるマウント
→typeをvolumeではなく、bindすることでバインドマウントと判断される。次に、sourceにはマウントしたいディレクトリの絶対パスを指定し、destinationにはマウント先を指定する。
Discussion