Ubuntu14.04でDockerデータボリュームを操作する方法

提供:Dev Guides
移動先:案内検索

序章

この記事では、Dockerデータボリュームの概念、つまり、それらが何であるか、なぜそれらが役立つのか、さまざまなタイプのボリューム、それらの使用方法、およびそれぞれをいつ使用するかについて説明します。 また、dockerコマンドラインツールを使用してDockerボリュームを使用する方法の例もいくつか紹介します。

記事の最後に到達するまでに、あらゆる種類のDockerデータボリュームの作成と使用に慣れているはずです。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • Ubuntu14.04ドロップレット
  • sudo権限を持つroot以外のユーザー( Ubuntu 14.04 を使用した初期サーバーセットアップでは、これをセットアップする方法について説明しています。)
  • Ubuntu14.04にDockerComposeをインストールして使用する方法のステップ1の手順でインストールされたDocker

注:前提条件にUbuntu 14.04にDockerをインストールする手順が記載されていますが、この記事のDockerデータボリュームのdockerコマンドは、Dockerがインストールされている限り他のオペレーティングシステムでも機能します。


Dockerコンテナの説明

Dockerを使用するには、Docker固有の概念をかなり理解する必要があります。ほとんどのドキュメントでは、Dockerのツールセットの使用方法を説明することに重点を置いており、これらのツールを使用する理由についてはあまり説明していません。 Dockerを初めて使用する場合、これは混乱を招く可能性があるため、まずいくつかの基本事項を確認してから、Dockerコンテナーの操作に進みます。 以前にDockerを使用したことがあり、データボリュームの使用を開始する方法を知りたい場合は、次のセクションに進んでください。

Dockerコンテナーは、仮想マシンに似ています。 基本的に、コンテナ内で事前にパッケージ化された「Linuxボックス」を実行できます。 Dockerコンテナと一般的な仮想マシンの主な違いは、Dockerは通常の仮想マシンほど周囲の環境から分離されていないことです。 DockerコンテナはLinuxカーネルをホストオペレーティングシステムと共有します。つまり、仮想マシンのように「起動」する必要はありません。

多くが共有されているため、Dockerコンテナーの起動は迅速で安価な操作です。ほとんどの場合、通常の実行にかかる時間と同じ時間で、完全なDockerコンテナー(通常の仮想マシンに相当)を起動できます。コマンドラインプログラム。 これは、複雑なシステムの展開をはるかに簡単でモジュール化されたプロセスにするので素晴らしいですが、通常の仮想マシンのアプローチとは異なるパラダイムであり、仮想化の世界から来る人々に予期しない副作用があります。

Dockerデータボリュームの種類を学ぶ

Dockerデータボリュームの主なユースケースは3つあります。

  1. コンテナが削除されたときにデータを保持するため
  2. ホストファイルシステムとDockerコンテナ間でデータを共有するには
  3. 他のDockerコンテナとデータを共有するには

3番目のケースはもう少し高度なため、このチュートリアルでは取り上げませんが、最初の2つは非常に一般的です。

最初の(そして最も単純な)ケースでは、コンテナーを削除してもデータをそのままにしておきたいので、データの保存場所をDockerに管理させるのが最も簡単な場合がよくあります。

データを永続的に保つ

Dockerで「データボリューム」を直接作成する方法はないため、代わりに、ボリュームが接続されたデータボリュームコンテナを作成します。 このデータボリュームコンテナーに接続する他のコンテナーの場合は、Dockerの--volumes-fromオプションを使用して、このコンテナーからボリュームを取得し、現在のコンテナーに適用します。 これは一見少し珍しいので、このアプローチを使用して、コンテナが削除された場合でもbyebyeファイルを固定する方法の簡単な例を見てみましょう。

まず、ボリュームを保存するための新しいデータボリュームコンテナを作成します。

docker create -v /tmp --name datacontainer ubuntu

これにより、ubuntuイメージに基づいて、ディレクトリ/tmpdatacontainerという名前のコンテナが作成されました。

ここで、--volumes-fromフラグを指定して新しいUbuntuコンテナーを実行し、前と同じようにbashを再度実行すると、/tmpディレクトリに書き込んだものはすべて[ X172X]ボリュームのdatacontainerコンテナ。

まず、ubuntuイメージを開始します。

docker run -t -i --volumes-from datacontainer ubuntu /bin/bash

-tコマンドラインオプションは、コンテナ内から端末を呼び出します。 -iフラグは、接続をインタラクティブにします。

ubuntuコンテナのbashプロンプトで、/tmpにファイルを作成します。

echo "I'm not going anywhere" > /tmp/hi

先に進み、exitと入力して、ホストマシンのシェルに戻ります。 ここで、同じコマンドを再度実行します。

docker run -t -i --volumes-from datacontainer ubuntu /bin/bash

今回はhiファイルがすでにあります。

cat /tmp/hi

君は見るべきだ:

Output of cat /tmp/hiI'm not going anywhere

--volumes-fromフラグは、必要な数だけ追加できます(たとえば、複数のデータコンテナーからのデータを使用するコンテナーをアセンブルする場合)。 必要な数のデータボリュームコンテナを作成することもできます。

このアプローチの唯一の注意点は、データボリュームコンテナを作成するときに、コンテナ内のマウントパス(この例では/tmp)のみを選択できることです。

ホストとDockerコンテナ間でのデータの共有

Dockerコンテナーのその他の一般的な用途は、ホストマシンとDockerコンテナーの間でファイルを共有する手段です。 これは、前の例とは動作が異なります。 最初に「データのみ」のコンテナを作成する必要はありません。 Dockerイメージのコンテナーを実行し、そのディレクトリーの1つをホストシステム上のディレクトリーの内容でオーバーライドするだけです。

簡単な実例として、公式のDocker Nginxイメージを使用したいが、後で分析するためにNginxのログファイルの永続的なコピーを保持したいとします。 デフォルトでは、nginxDockerイメージは/var/log/nginxディレクトリに記録されますが、これはDockerNginxコンテナ内の/var/log/nginxです。 通常、ホストファイルシステムからは到達できません。

ログを保存するフォルダーを作成してから、共有ボリュームを使用してNginxイメージのコピーを実行し、Nginxがコンテナー内の/var/log/nginxではなくホストのファイルシステムにログを書き込むようにします。

mkdir ~/nginxlogs

次に、コンテナを起動します。

docker run -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 -i nginx

このrunコマンドは、これまで使用してきたコマンドとは少し異なるため、少しずつ分解してみましょう。

  • -v ~/nginxlogs:/var/log/nginx/var/log/nginxディレクトリをNginxコンテナ内からホストマシンの~/nginxlogsディレクトリにリンクするボリュームをセットアップしました。 Dockerは:を使用して、ホストのパスをコンテナーパスから分割し、ホストパスが常に最初に来ます。
  • -d —プロセスを切り離し、バックグラウンドで実行します。 そうしないと、空のNginxプロンプトを監視しているだけで、Nginxを強制終了するまでこの端末を使用できません。
  • -p 5000:80 —ポートフォワードを設定します。 Nginxコンテナはデフォルトでポート80をリッスンしており、これによりNginxコンテナのポート80がホストシステムのポート5000にマップされます。

細心の注意を払っていれば、以前のrunコマンドとのもう1つの違いに気付いたかもしれません。 これまで、すべてのrunステートメント(通常は/bin/bash)の最後にコマンドを指定して、コンテナー内で実行するコマンドをDockerに指示してきました。 Nginxイメージは公式のDockerイメージであるため、Dockerのベストプラクティスに従い、イメージの作成者は、Nginxを自動的に起動するコマンドを実行するようにイメージを設定します。 ここに通常の/bin/bashをドロップして、イメージの作成者にコンテナで実行するコマンドを選択させることができます。

これで、マシンのDockerコンテナ内でNginxのコピーが実行され、ホストマシンのポート5000がNginxのポート80のコピーに直接マップされます。 curlを使用して簡単なテストリクエストを実行してみましょう。

curl localhost:5000

Nginxから画面一杯のHTMLが返され、Nginxが稼働中であることが示されます。 しかし、さらに興味深いことに、ホストマシンの~/nginxlogsフォルダーを見て、access.logファイルを見ると、Nginxからの要求を示すログメッセージが表示されます。

cat ~/nginxlogs/access.log

次のようなものが表示されます。

Output of `cat ~/nginxlogs/access.log`172.17.42.1 - - [23/Oct/2015:05:22:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"

~/nginxlogsフォルダーに変更を加えると、Dockerコンテナー内からもリアルタイムで変更を確認できます。

結論

それはそれを要約することについてです! ここでは、他のコンテナーでデータを永続化する方法として使用できるボリュームを持つデータボリュームコンテナーを作成する方法と、ホストファイルシステムとDockerコンテナーの間でフォルダーを共有する方法について説明しました。 これは、Dockerデータボリュームに関して、最も高度なユースケースを除くすべてをカバーしています。

Docker Composeを使用している場合は、Dockerデータボリュームをdocker-compose.ymlファイルで構成できます。 詳細については、 Ubuntu14.04にDockerComposeをインストールして使用する方法を確認してください。

幸運と幸せなDockering!