LoginSignup
2
1

More than 1 year has passed since last update.

【Docker】-v オプションを使ってデータをホストに保存する no.15

Last updated at Posted at 2021-06-19

パンプキン カフェ (5).png

こんにちは、まゆみです。

Dockerについての記事をシリーズで書いています。

前回の記事では『-v』オプションについて書かせていただきました。

-v オプションは、Dockerの中で私が理解に一番苦労した部分であり、それゆえ、周辺知識も含め、たくさん調べながら勉強してきました。

その結果、Qiitaの記事にまとめたい量が膨大になってしまいました。

今回は前回の記事の続きというか補足的な記事にしています。

ではさっそく始めていきますね。

-v オプションを使う場面は主に2つある。

-v オプションを付けてコマンドを実行する場面は、大きく分けて2つあります。

下記に説明してきます。

1)build context 内にあるファイルの更新をオンタイムでContainerに反映させる

前回の記事の内容のおさらいになります。

Build Context.png

Dockerfileの入っているディレクトリーのことをbuild context (ビルドコンテキスト)と言います。

例えば、今、簡単なWebアプリを作っていて、build context内に、Dockerfileとapp.jsファイルがあるとします。

app.jsに何か変更が加えられた時、『-vオプション』を使わなければ、Dockerfileをrebuildして、イメージを作り直して、そのイメージからContainerを実行させて。。。というプロセスを踏まなければなりません。

ただそのような時に-v を使えば、Containerに『あたかもbuild contextがあるかのように』マウントさせることができ、app.jsの変更がオンタイムでContainerに反映されるのです。(Webアプリなら、ブラウザーをリロードするだけでapp.jsの変更が反映されます。)

このような場面で、-vオプションを使いたい時は下記のようなシンタックスになります。

-v <build contextまでの絶対パス> : container側のディレクトリー

build context までの絶対パスを指定することで、build context内のすべてのファイルをContainerからマウント(参照)していることになります。

Container (5).png

上記のイラストのような感じです。

2)containerにデータを置きたくない時

では次に、-v オプションが使われる主な理由の2つ目を書いていきます。

例えば、あなたの作っているアプリに、ユーザーのログイン情報などを入力させる項目を作りたいとします

ユーザーログイン情報のようなデータは、

Container をストップしたり、削除しても保ち続けたいデータ

ですよね。

そのような場合、Containerにデータを保存するのではなく、Host側にデータを置きContainerからマウントできるようにすると便利です。

2.png
上のイラストのように、ホスト側にあなたの好きな名前の付けたディレクトリーを作り、それをContainer側からマウントして見ているというイメージになります。

そして、その時のシンタックスは以下のようになります。

-v <Host側のディレクトリ> :<Container側のディレクトリ>

Host側のディレクトリーと書いている部分に、『あなたの好きな名前』を付けてください。

お客さんからのフィードバックを集計するアプリを作っているなら『feedback』とかなんでも可能です。(後でみて、どのデータを保持しているvolumeなのか分かる名前にしましょう。\(^o^)/)

このように名前をつけてvolumeを作る方法を『Named Volume』と言います。

名前を付けてvolumeを作っているため、そのvolumeを他のcontainerと共有することもできますし、Containerを削除してもvolume は別で生き残り続けます。

docker volume --help

でvolumeを操作したい時のコマンドを表示させることができます(下のスクショ参考)

2021-06-19_9-01-31.png

では

docker volume ls

で、今あるvolumeのリストを表示させてみましょう

2021-06-19_9-00-27.png

VOLUME NAMEの項目に、名前がついているのがNamed Volumeであり、Containerを削除した後でも生き残りますから、名前を指定して、新しいContainerで再利用することができます。

数字の羅列のvolume はNamed Volume に対して『Anonymous Volume』と呼ばれます。

Anonymous (匿名)という言葉が示しているように、Containerを削除したらそれと同時に消されてしまうデータになります。

もちろん他のContainerと共有する事はできません。

Anonymousの使い方に関しては、また別の記事で取り上げますね。

Bind Mount と Named Volumeの違いに関するドキュメントの資料

最後に、前回の記事で取り上げたBind Mount (ファイルシステム全体をマウントする事)と、今回の記事のメインテーマNamed Volume の違いに関して、docker docs の引用を貼っておきます。

2021-06-19_9-33-26.png

まとめ

今回の記事はここらあたりで締めくくらせていただきます。

お役に立てたなら幸いです。\(^o^)/

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1