コンテナ内でのデータ管理
Managing data in containers - Docker Documentation
http://docs.docker.com/userguide/dockervolumes/
これまでに基本的な Docker の概念の紹介や、Docker イメージがどのようにネットワークでつながるかや、コンテナ間のリンクされているかを見て来ました。このセクションでは、どのように Docker コンテナ間やコンテナ内のデータを管理するかを学んでいきましょう。
Docker 上のデータを管理するためには、2つの方法があります。
- データボリュームと、
- データボリュームコンテナです。
データボリューム(Data volume)
データボリュームは、特別に指定されたディレクトリであり、一つまたは複数のディレクトリ内で、ユニオンファイルシステムが、永続的ないし共有データに対して便利な機能を提供するものです。
- データボリュームは、コンテナ間で共有や再利用することができる
- データボリュームへの変更を直接行う事が出来る
- イメージの更新を行っても、データボリュームが変更されることはない
- コンテナにボリュームが利用されない間も、データは持続されます
データボリュームの追加
コンテナにデータボリュームを追加するには docker run
コマンドに -v
フラグを使う事で可能になります。-v
は1回の docker run
で複数回指定し、データボリュームを複数マウントすることができます。それではウェブアプリケーションのコンテナに、1つのボリュームを追加してみましょう。
$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
これはコンテナ内部に /webapp
という新しいボリュームを作成するものです
注:このほかにも Dockerfile
の中で VOLUME
命令を使い、イメージから作成することができる様々な種類のコンテナに対して、1つまたは複数の新しいボリュームを追加することができます。
ホストディレクトリをデータディレクトリとしてマウントする
ボリュームを追加するときに -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
コンテナを削除する場合は、ボリュームが1つでも参照されている間は、削除することが出来ません。つまり、これによってコンテナ間におけるアップグレードや、効率的なデータボリュームの移行が可能となります。
ボリュームのバックアップ、修復、移行
ボリュームに関する他の便利な事としては、ボリュームをバックアップやレストア、マイグレーションのために使う事です。使うためには --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 のサービスを使って、自動構築やプライベートリポジトリについて見ていきましょう。
Go to Working with Docker Hub.