こんにちは、まゆみです。
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^)/