👏

【学習メモ】Dockerを本気で理解しにかかる〜#1-3 Dockerのストレージ共有(Volume)〜

2024/01/27に公開

概要

こちらの記事の#1-3 です。(#1-2
今回は ストレージの共有、ボリュームのマウントについてまとめていこうと思います。

Docker のストレージ共有について

前回のコマンドの中でストレージについても軽く触れていきましたが、もう少し深く掘っていこうかなと思います。

VM 型仮想化と Docker のストレージについて

#1-1で簡単に VM と Docker の違いが何かを見てきましたが、これらはデータの保存方法についても違いがあります。

  • VM:ディスク上に存在するため、書き込まれたデータは永続化する
  • Docker:メモリ上に存在するため、データは一時的

コンテナは作って壊してを繰り返すことが想定されているので、VM とは違いデータは永続化されません。
でも、そうなるとコンテナが削除されると DB のデータが消えてしまい困りますよね...
もう2度と削除できないコンテナの完成となってしまっては、Docker を使う意味がなくなってしまうので、データを永続化したい場合にはストレージ共有をする必要があります。

ストレージ共有のコマンド

--volume or -v

こちらも以前の Docker コマンドの記事で記載しておりましたが、オプション--volume もしくは-v でボリュームのマウント先を決めることができます。

docker run --volume {ホスト側ディレクトリ}:{コンテナ側のディレクトリ} イメージ名

前回の復習ですが、上記がコマンドの例になります。

よくある使用例

では、よくある使用例として nginx のコンテナを起動して、ホスト側のファイルを反映させてみようと思います。

一旦、コンテナを起動して nginx のルートディレクトリがどこに設定されているのか確認します。
割愛しますが、以下がルートディレクトリになっていました。

/usr/share/nginx/html

そのため、nginx のコンテナを起動し、localhost:80/にアクセスすると

/usr/share/nginx/html/index.html

が表示されるということです。

デフォルトのルートファイル

デフォルトのnginxルートファイル

nginx の設定になるので、割愛しますが、ルートディレクトリなどの設定は

/etc/nginx/conf.d/default.conf

で確認できます。

ではまず、hmtl ディレクトリを作成し、以下のように index.html を記述します。

cat ./html/index.html
<h1>Create File From Host</h1>

この./html ディレクトリで nginx コンテナのルートディレクトリ/usr/share/nginx/htmlをマウントする。
結果、localhost:80にアクセスした際にこのファイルが表示されれば OK となります。

docker run -d -v ./html:/usr/share/nginx/html -p 80:80 --name nginx nginx

マウントテスト

きちんとマウントできてますね!
ホスト側のファイルを変更しても反映されるようになっているので OK です!

このように特定のディレクトリをマウントし、ホスト側のファイルを変更をリアルタイムで反映するものをバインドマウントと言います!
それとは対照的に、基本的にホスト側からファイルを変更することがないようなデータを共有する場合は、ボリュームマウントを使用します。
ボリュームマウントの場合、Docker 管理下のディレクトリにデータが保存されます。詳しくはのちの docker-compose のところで触れようと思います。

まとめ

今回はストレージ共有、ボリュームのマウントの中でもバインドマウントに絞って具体的に見ていきました。
次はついに Dockerfile についてまとめていこうと思います。

GitHubで編集を提案

Discussion