Chapter 08

コンポーネント - volume

ここだけは理解しよう

  • データの永続化には Volume を使用
  • コンテナ間で Volume の共有は可能
  • Docker はエフェメラルになるような設計を求められるため、
    基本的に Volume は使用しないことが好ましい

Dcokerの特徴

Docker はエフェメラルです。
(短命などの意味で、プロセスが終了したらコンテナは使い捨てるため)
そのため、データの永続化をどうするかといった問題が生じます。

そこで Volume という考えを利用することで、
データ保持・永続化をコンテナのライフサイクルとは独立して管理できます。

Volumeの種類

  • Data Volume
    • Docker Container のライフサイクルの外で管理されるファイル/ディレクトリの設定
    • 下記のどちらかのオプションを利用する
      • -v <CONTAINER PATH>のオプションを設定する
    • -v <HOST PATH>:<CONTAINER PATH>のオプションを設定する
  • Data Volume Container
    • 他の Docker Container で指定されている Volume を参照するための機能

Data Volumeを試してみる

# /tmp/textのディレクトリをマウントしています。
docker run \
  -v /tmp/text  \
  alpine touch /tmp/text/hogefugapiyo

# volumeを確認します。
docker volume ls

無事にコマンドが実行できれば下記を確認できます。
volume.png

host 側にコンテナで作成したファイルが存在することを確認できました。

# volumeをinspectしましょう!!
# Mountpointを確認しましょう。
docker volume inspect <Volume Name>

# Mountpointの中身をみてみましょう。
ls -l <Mountpointのpath>

volume2.png

-v <HOST PATH>:<CONTAINER PATH>と記載できる。

host 側の指定している volume にファイルが作成していることを確認できます。

mkdir test
cd ./test

# alpineを起動して、hogefugapiyoを作成します
docker run \
  -v /root/test:/tmp/text  \
  alpine touch /tmp/text/hogefugapiyo

# 中身の確認
ls

volume3.png

Data Volume Containerを試してみる

下記の図のようなことをやろうとしています! !
image.png

# volume-testコンテナにファイルを3つ作成します。
docker run \
  --name volume-test \
  -v /tmp/test \
  alpine touch /tmp/test/{hoge,fuga,piyo}

# 指定ディレクトがないことを確認します
docker run alpine ls -l /tmp/test

# volumes-fromの利用
docker run \
  --volumes-from volume-test \
  alpine ls -l /tmp/test

赤枠を確認しましょう。--volumes-fromがない方はディレクトリがないと出力されています。
volume4.png

では、ここで少しお遊びとしていろいろな Linux(軽量)を利用してみましょう。

対象の Linux は以下となります。

# amazonlinuxでの実行
docker run \
  --volumes-from volume-test \
  amazonlinux ls -l /tmp/test

# clearlinuxでの実行
docker run \
  --volumes-from volume-test \
  clearlinux ls -l /tmp/test

# photonでの実行
docker run \
  --volumes-from volume-test \
  photon ls -l /tmp/test

全て volume 元のディレクトリをみることができました。
volume5.png