Dockerとコンテナ技術 その14:バインドマウント

過去の記事でコンテナのデータ永続化について簡単にまとめました。

キョウタコの技術日記

コンテナは作成し利用した後は都度削除するのが一般的です。しかし、コンテナを削除するとその中のデータも削除されてしまいます…

その中のバインドマウントについてより詳しくまとめていきます。

バインドマウントとは

バインドマウントとはホストマシン上の任意のフォルダと同期させる方法です。
ホストマシン上のフォルダと同期するため、コンテナ上のデータと違いホストマシン上にも存在するデータのためコンテナ削除後もデータを残すことができます。
また、同期されているためホスト、コンテナ両方から頻繁に編集するファイルなどを扱うのに適しています。

バインドマウントのコマンド操作

バインドマウントのコマンド操作をまとめていきます。

バインドマウントしながらコンテナ起動

バインドマウントはホスト側のフォルダを利用するため、ボリュームのようにDockerから新たに領域を作成するなどの操作は必要ありません。
コンテナ起動時のオプションでバインドマウントを指定することでバインドマウントをしてコンテナ起動することができます。

docker container run -v ホスト絶対パス:コンテナ内の絶対パス イメージ
または
docker container run --mount type=bind src=ホスト絶対パス,dst=コンテナ内の絶対パス イメージ

上記コマンドはボリュームをマウントするコマンドとほぼ同じですが、ボリューム名を指定していた部分がホスト絶対パス、typeがbindになっています。

コンテナにバインドマウントを実施する

では実際にコンテナにバインドマウントを実施してみましょう。

バインドマウントするフォルダ作成

まずは、マウントするためのフォルダを任意の場所に作成してください。
その中にテキストファイルを1つ作成しましょう。
バインドマウント後にこのファイルを編集して同期されていることを確認していきます。

bindmount/app
└── mount.txt

ファイルの中も少し編集しておきましょう。
内容はなんでも構いません。

コンテナをバインドマウントをして起動する

では、dockerコマンドを実行して先ほどのフォルダをバインドマウントしていきましょう。
以下のコマンドをホスト絶対パスの情報などをご自身の環境に合わせて修正し実行してください。

docker container run -it -v ホスト絶対パス:/app ubuntu:20.04
または
docker container run -it --mount type=bind src=ホスト絶対パス,dst=/app ubuntu:20.04 

実行すると以下のように/app内にmount.txtファイルを持つコンテナが作成されます。

ホストマシンからmount.txtを編集

では、バインドマウントされたフォルダがホストとコンテナ間で同期されていることを確認しましょう。
ホストマシン上でmount.txtを編集してください。

編集後、コンテナ上からmount.txtを確認しましょう。

ホスト上での変更が反映されているのが確認できます。

コンテナ上からmount.txtを編集

次に、コンテナ上からmount.txtを編集していきましょう。
コンテナ上で以下のコマンドを実行し、mount.txtを編集しましょう。

echo 'Edited in container' > /app/mount.txt

実行後、ホストマシンからファイルを確認すると以下のようになります。

まとめ

バインドマウントはホストマシン上の任意のフォルダをコンテナ内のフォルダと同期させることができます。
バインドマウントを使うことで、ホスト上のVScodeなどのエディタで編集しそれをすぐさまコンテナ上にも反映させることなどが可能になります。
編集を頻繁に行うファイルを扱う際には有効に活用していきましょう。
ここまで読んでいただきありがとうございました。
それでは、また。