
Dockerは、企業のサービス拡張を可能にし、コンテナ化されたアプリケーションのデプロイを驚くほどシンプルにする、非常に強力なツールです。Dockerを使えば、コンテナの展開は実に簡単です。イメージをダウンロードしてコンテナをデプロイするだけです。しかし、コンテナはどのようにデータを保存するのでしょうか?また、そのデータをどのように操作し、コンテナ間で共有するのでしょうか?
Dockerコンテナの仕組みは、一連の読み取り専用レイヤーで構成され、その上に最終的な読み書き可能なレイヤーが配置されています。これは非常に複雑なシステム(ユニオンファイルシステムと呼ばれます)であり、標準的な方法ではデータを処理できません。
このファイルシステムは、データを保持する必要がない場合には非常に優れた機能を発揮します。しかし、コンテナを停止して再デプロイし、データを保持する必要がある場合はどうでしょうか?データを保存(またはコンテナ間でデータを共有)するには、ボリュームを活用する必要があります。Dockerボリュームとは、ホストファイルシステム上(Union File Systemの外部)に存在するディレクトリ(またはファイル)のことです。
これらのボリュームはどのように作成し、管理するのでしょうか?早速見ていきましょう。Ubuntu Server 16.04プラットフォームでDockerの最新リリースを使用します。ボリュームの使用手順は、ホストOSに関係なく同じです。
参照: 調査: クラウドとデータセンターの導入率、使用率、移行計画 (Tech Pro Research)
標準ボリュームの作成
volume1というボリュームを作成しましょう。これは以下のコマンドで実行できます。
docker volume create --name volume1
docker volume ls コマンドを実行すると、新しく作成されたボリュームがリストに表示されます (図 A )。
図A

ボリュームの詳細情報を取得するには、docker volume inspect volume1コマンドを実行します。このコマンドの出力(図B)には、ボリューム名、オプション、マウントポイントなどが表示されます。
図B

しかし、標準ボリュームはそれほど役に立ちません。Dockerコンテナをさらに柔軟にするために役立つボリュームを作成しましょう。
参照: クラウド コンピューティングは新たな標準: あらゆる用途にクラウド コンピューティングを使用する時期が来たか? (TechRepublic)
ホストデータボリュームの作成
これから、ホスト上のディレクトリにアタッチされたボリュームを含む新しいコンテナ(最新のUbuntuイメージベース)をデプロイします。これにより、コンテナ内で作業し、データをコンテナディレクトリに保存できるようになります。コンテナディレクトリはホストディレクトリと同期されます。まず、ホストディレクトリを作成してください。以下のコマンドで、container-dataというディレクトリを作成します。
mkdir ~/container-data
上記のディレクトリは、Dockerユーザーがアクセスできる場所に作成してください。実際には、このディレクトリはシステム上の任意の場所に作成できます(ユーザーに読み書き権限があれば)。このディレクトリを作成したら、コンテナをデプロイするコマンド(ホストディレクトリをコンテナ内の/dataディレクトリにあるコンテナボリュームにアタッチするコマンド)は以下のようになります。
docker run -d -P --name test-container -v /home/jack/container-data:/data ubuntu
コンテナIDが表示されるはずです。最初の4文字をメモしておいてください。それでは、これをテストしてみましょう。次のコマンドで、実行中のコンテナへのシェルアクセスを取得します。
docker attach ID
ここで、ID は実行中のコンテナの最初の 4 文字です。
実行中のコンテナのbashプロンプトが表示されます。ls /コマンドを実行すると、コンテナ実行時に追加したデータディレクトリが表示されます。touch /data/testコマンドでテストファイルを作成しましょう。ホストのターミナルに戻り、ls ~/container-data/コマンドを実行してください。テストファイルがリストされているはずです。同じターミナルで、 touch ~/container-data/test2コマンドを実行してください。コンテナシェルに戻り、ls /data コマンドを実行すると、 test と test2 の両方が表示されます。これで、実行中のコンテナはホストファイル上のデータを共有するようになりました。
その後、必要に応じて任意の数のコンテナをホストディレクトリに接続できます。各コンテナ(およびホスト)は同じデータにアクセスできます。ラリー・デイビッド氏なら「これは本当に、本当に、本当に便利です」と言うかもしれません。
Dockerをさらに便利にする
ボリュームは、Dockerコンテナをより便利にする優れた方法です。ボリュームは、データのバックアップ、コンテナ間のデータ共有、さらにはコンテナとホスト間のデータ共有にも役立ちます。ボリュームの詳細については、公式Dockerドックをご覧ください。