docker : Data Volumeの作成から削除まで


Data Volumeとは

Dockerにおいてデータの永続化は気にしなかればならない問題です。
そこで使われるのが、Data Volumeです。Data VolumeはDockerコンテナ-ホスト間で直接ディレクトリを共有することで、データ永続化を実現する仕組みです。Data Volumeはコンテナを破棄してもホスト側に保持されることになります。

コンテナのデータ永続化手法としては、Data Volumeコンテナの手法が推奨されています。
こちらでは、コンテナ間でディレクトリを共有することになります。Data Volumeコンテナは、データのみを保持するためのコンテナで、ホスト側に保持された永続化データの一部をVolumeとして別のコンテナに共有できるようにしたものです。

Data VolumeコンテナのVolumeは、ホスト側の/var/lib/docker/volumes/(管理領域)以下に配置されます。

ボリューム作成

$ docker volume create --name <VOLUME NAME>

一覧表示

$ docker volume ls
DRIVER              VOLUME NAME
local               0a990e22051c0815c18cb10ae5eea84ce37db2e91e83c3e976d54646c466c249
...<omitted>...
local               mysql-data

マウント

$ docker run [options] -v {Host directory}:{Container directory} <Repository>[:tag] [Command] [Arguments]

# 例)
$ docker run -d --name mysql -p 3306:3306 -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password mysql

削除

$ docker volume rm <VOLUME NAME>

全て削除

$ docker volume rm $(docker volume ls -qf dangling=true)

リンク切れのみ削除

$ docker volume ls -qf dangling=true | xargs -r docker volume rm
  • [Command A] | xargs [Command B] : コマンドAの実行結果を引数にしてコマンドBを実行
  • -r option : 標準入力(引き数)が空の場合はコマンドBを実行しない

データのエクスポート

Data Volumeコンテナで利用しているデータを他のコンテナで利用したい場合、一度データをエクスポートしたいとなるはずです。
Volumeデータをホスト側にエクスポートする方法を記載します。

$ docker container run -v $PWD:/tmp \
  --volumes-from mysql-data \
  busybox \
  tar cvzf /tmp/mysql-backup.tar.gz /var/lib/mysql

上記例では、以下のようなイメージです。

  • mysql-data(Data volumeコンテナ)の/var/lib/mysqlの中身をtar圧縮
  • 圧縮したファイルをbusyboxコンテナの/tmp以下にmysql-backup.tar.gzとして保存
  • busyboxコンテナの/tmpをHost側のカレントディレクトリにマウント