Docker、volumeマウントを実感する


個人的な利用範囲でdockerを使っていると、ローカルでのデータ保存だけしておけば何ら苦労がなかったのですが、環境を移動することを想定してデータの保存を考えた時に、volumeマウントについて昔理解がなかなかできなかったので、volumeマウントを実感できるような方法を参考までに書いてみました。

volumeマウントを実感

volumeマウントを理解する時に個人的に良かった方法は、既存のコンテナを少しいじってそこから新たなイメージを作成するというやり方です。そしてこのコンテナを少しいじる方法を2つに分けることでvolumeマウントが理解できると思います。
今回はデフォルトで"Hello World"と出力されるコンテナを"あいうえお"と出力されるコンテナに変えていくという流れで説明をします。

方法

①volumeマウントをしてオリジナルイメージ作成
【流れ】

事前にindex.html("あいうえお")などを用意する。

用意したindex.html("あいうえお")を起動中のコンテナにvolumeマウントする。

volumeマウントされたコンテナから新規イメージを作成する。

②volumeマウントをしないで(直接上書き)オリジナルイメージ作成
【流れ】

起動中のコンテナにdocker execコマンドで入る。

既存のコンテナ内にあるindex.html("hello world")を見つけ、それをechoコマンドで直接("あいうえお")に上書きをする。

上書きをしたコンテナから新規イメージを作成する。

結果

①、②で作成された新規イメージは両方とも"あいうえお"と表示される予定です。しかし結果として、"あいうえお"と表示されるコンテナは②で作成されたコンテナであり、①ではデフォルトの"Hello World"が表示されてしまいます。

volumeマウントの注意点

なぜvolumeマウントをした①の新規のコンテナでは、"あいうえお"とでないのでしょうか。
それは、
【volumeマウントとは、あくまでマウントをされているのであり、コピーがなされているわけではない。つまりコンテナ内の変更は、コンテナ内に保存されるのでなくホスト側に保存がされている】
ということです。
そのため、【コンテナ内に変更を保存するためには、volumeマウントをするのではなく、直接コンテナ内にて上書きを行う】ということです。

※ちなみにコンテナ内のデータ保持の方法はたくさんありますが、今回はvolumeマウントを理解するためにこの比較方法を取りました。