序章

この記事では、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

これにより、という名前のコンテナが作成されました datacontainer に基づいて ubuntu 画像とディレクトリ内 /tmp.

ここで、新しいUbuntuコンテナを実行すると --volumes-from フラグを立てて実行する bash 繰り返しますが、以前と同じように、 /tmp ディレクトリはに保存されます /tmp 私たちのボリューム datacontainer 容器。

まず、開始します ubuntu 画像:

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

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

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

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

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

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

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

  1. cat /tmp/hi

君は見るべきだ:

Output of cat /tmp/hi
I'm not going anywhere

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

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

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

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

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

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

  1. mkdir ~/nginxlogs

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

  1. 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 コマンド。 これまで、すべてのコマンドの最後にコマンドを指定してきました 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!