コンテナ内でのテータ管理 - Docker User Guide


# コンテナ内でのデータ管理

Managing data in containers - Docker Documentation
http://docs.docker.com/userguide/dockervolumes/

これまでに基本的な Docker の概念の紹介や、Docker イメージがどのようにネットワークでつながるかや、コンテナ間のリンクされているかを見て来ました。このセクションでは、どのように Docker コンテナ間やコンテナ内のデータを管理するかを学んでいきましょう。

Docker 上のデータを管理するためには、２つの方法があります。

* データボリュームと、
* データボリュームコンテナです。

## データボリューム(Data volume)

データボリュームは、特別に指定されたディレクトリであり、一つまたは複数のディレクトリ内で、[ユニオンファイルシステム](http://docs.docker.com/terms/layer/#ufs-def)が、永続的ないし共有データに対して便利な機能を提供するものです。

* データボリュームは、コンテナ間で共有や再利用することができる
* データボリュームへの変更を直接行う事が出来る
* イメージの更新を行っても、データボリュームが変更されることはない
* コンテナにボリュームが利用されない間も、データは持続されます

### データボリュームの追加

コンテナにデータボリュームを追加するには `docker run` コマンドに `-v` フラグを使う事で可能になります。`-v` は1回の `docker run` で複数回指定し、データボリュームを複数マウントすることができます。それではウェブアプリケーションのコンテナに、１つのボリュームを追加してみましょう。

```
$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
```

これはコンテナ内部に `/webapp` という新しいボリュームを作成するものです

注：このほかにも `Dockerfile` の中で `VOLUME` 命令を使い、イメージから作成することができる様々な種類のコンテナに対して、１つまたは複数の新しいボリュームを追加することができます。

### ホストディレクトリをデータディレクトリとしてマウントする

ボリュームを追加するときに `-v` フラグを使う事で、自分自身のホスト上にあるディレクトリを、コンテナ内にマウントさせることができます。

```
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
```

ここでは `/src/webapp` というローカルのディレクトリを、コンテナ内の `/opt/webapp` ディレクトリとしてマウントします。これはテストにとても役立ちます。たとえば、自分たちのソースコードに変更を加えたとき、コンテナの中でコンテナをマウントさせることによって、アプリケーションがコンテナ内部で、どのように動作するのか見る事が出来ます。ホスト上のディレクトリは、絶対パスで記述しておく必要があり、もしもディレクトリが存在しない場合は、Docker が自動的に作成します。

注：`Dockerfile` からポータビリティや共有性については指定することができません。ホストディレクトリとは、もともとホストに依存するものであり、全てのホストでは（Dockerfile で指定した内容が）動かないかもしれません。

Docker は標準は read-write ボリュームとなりますが、read-only のディレクトリとしてもマウントも可能です。

```
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
```

ここでは、同じ `src/webapp` ディレクトリをマウントしましたが、`ro` オプションで read-only としてマウントすべきと指定しています。

## データボリュームコンテナの作成とマウント

もしもコンテナ間で永続データの共有を行いたかったり、あるいは非永続的なコンテナで使いたい場合は、データボリュームコンテナを作成し、データをそこにマウントする方法があります。

それでは共有するために新しい名前のコンテナを作成してみましょう。

```
$ sudo docker run -d -v /dbdata --name dbdata training/postgres
```

`--volumes-from` フラグを使って `/dbdata` ボリュームに他のコンテナをマウントすることができます。

```
$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
```

そして、もう一方は、

```
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres
```

複数のコンテナで複数のデータボリュームを同時に使うには `--volumes-from` を複数回使用します。

```
$ sudo docker run -d --name db3 --volumes-from db1 training/postgres
```

マウントしたボリューム、初期の `dbdata` や `db1` `db2` コンテナを削除する場合は、ボリュームが１つでも参照されている間は、削除することが出来ません。つまり、これによってコンテナ間におけるアップグレードや、効率的なデータボリュームの移行が可能となります。

## ボリュームのバックアップ、修復、移行

ボリュームに関する他の便利な事としては、ボリュームをバックアップやレストア、マイグレーションのために使う事です。使うためには `--volumes-from` フラグを使って、新しいコンテナを使ってボリュームをマウントします。使うには、次のようにします。

```
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
```

ここでは私たちは新しいコンテナを起動し、 `dbdata` コンテナにボリュームをマウントすることが出来ます。
ここではローカルホストのディレクトリを `/backup` としてマウントしました。最後に、コマンド `tar` を通して `dbdata` ボリュームを `/backup` ディレクトリの `backup.tar` ファイルに、バックアップします。コマンドの処理が完了しコンテナを停止すると、`dbdata` ボリュームのバックアップが完了します。

次からは、同じコンテナだけでなく、他のコンテナからでもどこでもリストアが可能です。新しくコンテナを作る時に、

```
$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
```

あるいは新しいコンテナのデータボリュームに、バックアップファイルを展開することが出来ます。

```
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
```

この仕組みを使う事で自動バックアップやマイグレーションや修復テストを、自分の好きなツールをつかって行えます。

## 次のステップ

これまでは、どのように Docker を使うかを学んできました。それでは [Docker Hub](https://hub.docker.com/) のサービスを使って、自動構築やプライベートリポジトリについて見ていきましょう。


Go to [Working with Docker Hub](http://docs.docker.com/userguide/dockerrepos).