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


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

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

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

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

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

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

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

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

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

下記に説明してきます。

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

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

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からマウント(参照)していることになります。

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

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

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

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

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

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

ですよね。

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


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

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

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

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

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

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

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

docker volume --help

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

では

docker volume ls

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

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 の引用を貼っておきます。

まとめ

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

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