前書き
この記事では、Dockerデータボリュームの概念について説明します:Dockerデータボリュームとは何か、それらが有用である理由、さまざまなタイプのボリューム、ボリュームの使用方法、各ボリュームを使用するタイミング。 また、 `+ docker +`コマンドラインツールを使用してDockerボリュームを使用する方法の例を紹介します。
記事の終わりまでに、あらゆる種類のDockerデータボリュームを作成して使用することに慣れるはずです。
前提条件
このチュートリアルを実行するには、次のものが必要です。
-
Ubuntu 14.04ドロップレット
-
sudo特権を持つ非ルートユーザー(https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04[Ubuntu 14.04での初期サーバーセットアップ]は、このセットアップ方法を説明しています。 )
-
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-14-04 [インストール方法]の*ステップ1 *の手順でインストールされたDocker Ubuntu 14.04でのDocker Composeの使用]
Dockerコンテナの説明
Dockerを使用するには、Docker固有の概念をかなり理解する必要があります。ほとんどのドキュメントでは、Dockerのツールセットの使用方法を説明することに重点を置いています。 Dockerを初めて使用する場合、これは混乱を招く可能性があります。そのため、最初にいくつかの基本事項を確認してから、Dockerコンテナーの操作に進みます。 以前にDockerを使用したことがあり、データボリュームの使用方法を知りたい場合は、次のセクションに進んでください。
Dockerコンテナーは仮想マシンに似ています。 基本的に、事前にパッケージ化された「Linuxボックス」をコンテナ内で実行できます。 Dockerコンテナと一般的な仮想マシンの主な違いは、Dockerは通常の仮想マシンほど環境から隔離されていないことです。 DockerコンテナはLinuxカーネルをホストオペレーティングシステムと共有します。つまり、仮想マシンのように「ブート」する必要はありません。
非常に多くが共有されているため、Dockerコンテナーの起動は迅速かつ安価な操作です。ほとんどの場合、通常の実行にかかるのと同じ時間で完全なDockerコンテナー(通常の仮想マシンに相当)を起動できます。コマンドラインプログラム。 これは、複雑なシステムの展開がはるかに簡単でモジュール化されたプロセスになるため素晴らしいことですが、通常の仮想マシンアプローチとは異なるパラダイムであり、仮想化の世界からやってくる人々にとって予期しない副作用があります。
Dockerデータボリュームのタイプの学習
Dockerデータボリュームには、主に3つの使用例があります。
-
コンテナが削除されたときにデータを保持するには
-
ホストファイルシステムとDockerコンテナー間でデータを共有するには
-
他のDockerコンテナーとデータを共有するには
3番目のケースはもう少し高度なので、このチュートリアルでは説明しませんが、最初の2つは非常に一般的です。
最初の(そして最も単純な)ケースでは、コンテナを削除してもデータを持ち歩きたいので、データの保存場所をDockerに管理させるのが最も簡単です。
データの永続化
Dockerで「データボリューム」を直接作成する方法はないので、代わりにボリュームが接続された_data volume container_を作成します。 このデータボリュームコンテナに接続する他のコンテナについては、Dockerの「-volumes-from +」オプションを使用して、このコンテナからボリュームを取得し、現在のコンテナに適用します。 これは一見異常です。この方法を使用して、コンテナが削除された場合でも「 byebye +」ファイルを保持する方法の簡単な例を見てみましょう。
まず、ボリュームを保存する新しいデータボリュームコンテナを作成します。
docker create -v /tmp --name datacontainer ubuntu
これにより、「+ ubuntu 」イメージに基づいて、「 / tmp 」ディレクトリに「 datacontainer +」という名前のコンテナが作成されました。
さて、 `-volumes-from +`フラグを指定して新しいUbuntuコンテナを実行し、以前と同じように ` bash `を再度実行すると、 ` / tmp `ディレクトリに書き込んだものはすべて ` `+ datacontainer +`コンテナの/ tmp + `ボリューム。
まず、 `+ 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のログファイルの永続的なコピーを保持したいとします。 デフォルトでは、 + nginx +
Dockerイメージは `+ / var / log / nginx `ディレクトリにログを記録しますが、これはDocker Nginxコンテナー内の ` / var / log / nginx +`です。 通常、ホストファイルシステムからは到達できません。
ログを保存するフォルダーを作成してから、Nginxがコンテナー内の `+ / var / log / nginx +`の代わりにホストのファイルシステムにログを書き込むように、共有ボリュームでNginxイメージのコピーを実行します。
mkdir ~/nginxlogs
次に、コンテナを開始します。
docker run -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 -i nginx
この「+ run +」コマンドはこれまで使用していたコマンドとは少し異なるため、少しずつ分解してみましょう。
-
+ -v〜/ nginxlogs:/ var / log / nginx +
-Nginxコンテナ内の `+ / var / log / 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 +`ファイルで設定できます。 Ubuntu 14.04でDocker Composeをインストールして使用する方法をご覧ください。詳細。
幸運と幸せなドッカーリング!