105
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Organization

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

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

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

マウントしたボリューム、初期の dbdatadb1 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.

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
105
Help us understand the problem. What are the problem?