Docker イメージと Docker コンテナーには、遅い階層化されたファイル システムがあります。ディレクトリをデータ ボリュームとして定義することにより、docker にこれらのディレクトリを低速の階層化ファイル システムの外に出すように指示します。これは、次のような複数の結果として発生します。
- 高速ファイルシステム
- 複数のコンテナ間でボリュームを共有する機能
- 永続性 (そのボリュームを使用するコンテナーが少なくとも 1 つ存在する限り)
これが、ボリュームが商品であるだけでなく、良好な I/O パフォーマンスが期待されるディレクトリに必要な理由です。
私が見る限り、VOLUME /var/data は単に RUN mkdir /var/data と言っているのと何ら変わりはありません。
違いは、ボリュームの場合、ディレクトリ/var/data
が別の (より高速な) ファイル システム上のマウント ポイントになることです。コンテナーでコマンドを/var/data
実行することにより、単なる別のディレクトリではないことを確認できます。mount
$ docker run --rm -v /var/data busybox mount
rootfs on / type rootfs (rw)
none on / type aufs (rw,relatime,si=6c354c296f850c3c)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev type tmpfs (rw,nosuid,mode=755)
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
/dev/mapper/vg0-root on /etc/resolv.conf type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/mapper/vg0-root on /etc/hostname type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/mapper/vg0-root on /etc/hosts type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/mapper/vg0-root on /var/data type ext4 (rw,relatime,errors=remount-ro,data=ordered)
proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/irq type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/bus type proc (ro,nosuid,nodev,noexec,relatime)
tmpfs on /proc/kcore type tmpfs (rw,nosuid,mode=755)
/
aufs階層化された(そして遅い)ファイルシステム上にあります
/var/data
ext4 (および高速) ファイル システム上にある