Dockerストレージドライバーの詳細な紹介
私は最近プロジェクトに取り組みましたが、この期間中にDockerストレージドライバーの使用方法がわからなかったので、オンラインで情報を探して解決しました。ここに録音します。
目的
Dockerは、主にLinuxカーネルネームスペースを使用してSandbox Isolationを実現し、Cgroupを使用してリソース制限を実現するオープンソースアプリケーションコンテナエンジンです。 Dockerは、統一された開発と展開に使用される軽量のLinuxコンテナであり、「依存関係の地獄」の問題を解決しようとし、船舶が使用するコンテナと同様の従属サービスとコンポーネントを組み合わせ、迅速な設置と展開を実現します。
1。Dockerの基本的なアーキテクチャ - クライアントとデーモン
まず、Dockerの基本的なアーキテクチャとスタートアッププロセスを理解しましょう。実際、Dockerはクライアントやサーバーを含むC/Sアーキテクチャを採用しています。 Docker Daemonは、顧客からのリクエストをサーバーとして受け入れ、これらのリクエストを処理します(作成、実行、コンテナの送信)。クライアントとサーバーは、RESTFUL APIを介して同じマシンで通信します。特定の使用プロセスでは、Service Docker Startを実行した後、Docker Deamon Daemonプロセスがホストで生成され、バックグラウンドで実行され、クライアントからのメッセージの受信を待ちます(つまり、Docker Pull XXX、Docker Run…、Docker Commit XXXなどの入力Dockerコマンドなど)。 Dockerサービスを開始した後、Dockerプロセスを確認できます。
デフォルト
[root@localhost〜] #ps -aux | Grep DockerRoot 11701 0.0 0.4 359208 16624? SSL 21:05 0:00/usr/bin/docker -d -h fd:// - selinux -enabled- insecure -registry 186.100.8.216:5000root 11861 0.0 113004 2256 PTS/0 S+ 23:01 0:00 GREP -COLOR = ATO DOCKER
これは主に、後でファイルシステムを指定するときに、/etc/sysconfig/docker(これにより特別なブログを書きます)で特定のストレージドライバーを構成し、Dockerデーモンを起動し、実行コマンドのパラメーターを介して動作できないためです。 Docker dを介してホストコマンドラインから直接設定することもできます。
2。Dockerストレージ方法 - ストレージドライバー
Dockerモデルの中核部分は、階層ミラーリングメカニズムを効果的に利用することです。ミラーは階層を通して継承できます。基本的な画像(親画像なし)に基づいて、さまざまな特定のアプリケーション画像を作成できます。さまざまなDockerコンテナがいくつかの基本的なファイルシステムレイヤーを共有できます。同時に、独自の変更レイヤーと相まって、ストレージ効率を大幅に改善できます。主なメカニズムは、異なるディレクトリを同じ仮想ファイルシステムに階層モデルとマウントすることです(この記事から、いくつかのディレクトリを単一の仮想ファイルシステムに統合します)。 Mirror Storage Dockerには、AUFS、DeviceMapper、BTRFS、Overlay(公式Webサイトから)など、いくつかの異なるストレージドライバーが使用されています。以下は、さまざまなストレージドライバーの簡単な紹介です。
aufs
AUFS(AnotherUnionFS)は共同ファイルシステムです。 AUFSは、各メンバーディレクトリ(GITと同様)のReadonly、ReadWrite、およびWhiteOut許可の設定をサポートします。同時に、AUFSには同様の概念があります。この概念では、読み取り専用の権限を持つ分岐を論理的に段階的に変更できます(読み取り専用部分に影響しません)。 AUFSの唯一のストレージドライバーは、コンテナ間の実行可能なランタイムライブラリの共有を実現できます。そのため、同じプログラムコードまたはランタイムライブラリを使用して何百ものランタイムを実行すると、AUFSは非常に良い選択です。
デバイスマッパー
デバイスマッパーは、論理デバイスからLinux 2.6カーネルで提供される物理デバイスまで、マッピングフレームワークメカニズムです。このメカニズムでは、ユーザーはニーズに応じてストレージリソースを実装するための管理戦略を簡単に策定できます(詳細を参照)。デバイスマッパードライバーは、画像とコンテナを含む100gのシンプルなファイルを作成します。各コンテナは10gサイズのボリュームに制限されています(注:これは、Loopback、特にデータとメタデータを使用して自動的に作成されたスパースファイルです。特定の参照のために、Dockerコンテナのサイズを調整できます)。パラメーター-Sを使用して、Dockerデーモンを起動するときにドライバーを指定できます。つまり、Docker -D -S DeviceMapperによってDockerストレージドライバーを設定できます。最初にDockerサービスを閉じて、コマンドを実行します。
デフォルト
[root@localhost〜]#docker -d -s devicemapperinfo [0000] +job serveapi(unix:///var/run/docker.sock)info [0000] = ok(0)情報[0000]コンテナの読み込み:開始。 ....情報[0000]コンテナの読み込み:完了。情報[0000] Docker Daemon:1.4.0 4595D4F/1.4.0; execdriver:ネイティブ-0.2; GraphDriver:devicemapper info [0000] +job acceptconnections()info [0000] -job acceptconnections()= ok(0)
さらに、Dockerはコンテナを起動するときにストレージ-OPTパラメーターを指定できますが、DeviceMapperのみがパラメーター設定を受け入れることができます。後でターゲットを絞ったブログディスプレイがあります。
btrfs
BTRFSドライバーは、Dockerビルドで非常に効率的です。ただし、DeviceMapperと同様に、デバイス間の共有ストレージをサポートしていません(公式Webサイトに参加します)。 BTRFSはスナップショットとクローンをサポートし、複数の物理デバイスを簡単に管理できます。 (詳細については、IBMのBTRFSの紹介を参照してください)
かぶせる
オーバーレイはAUFSに非常に似ていますが、そのパフォーマンスはAUFSよりも優れており、メモリの利用が良好です。現在、Linuxカーネル3.18に統合されています。特定の使用コマンド:Docker DSオーバーレイ
公式Webサイトへの注意:現在、BTRFまたはWrite Files -Systemのコピーにサポートされておらず、Ext4パーティションでのみ使用する必要があります。
3 Dockerディレクトリ構造
Dockerの2つの最も重要な概念は、ミラーとコンテナです。では、格納された画像はどこにありますか?ミラーランコンテナが開始された後、操作の内容はどこから変更されますか?特定のドライバーが異なるため、最終的な実装効果は異なります。例として、デバイスマッパーストレージドライバーを使用して、Dockerのストレージ構造を分析しましょう。
1./var/lib/dockerディレクトリを入力し、内容をリストします。
デフォルト
[root@localhost〜]#cd/var/lib/docker/[root@localhost docker]
ディレクトリのコンテンツによると、DeviceMapperドライバーが使用されていることは明らかです。
注:以下に示すフォルダーはすべて/var/lib/dockerです。
2。画像ファイルを引くフォルダーはどのフォルダーに存在しますか? (参照)
プルの画像情報はグラフフォルダーに保存され、画像の内容はdevicemapper/ devicemapper/ dataの下に存在します。
3.開始コンテナはどこで実行されますか?
開始されたコンテナ構成情報はコンテナに保存され、execdriver/ native/も表示されます。
コンテナ内の操作の内容は、devicemapper/devicemapper/dataの下で保存されます。
4。グラフの役割
Dockerアーキテクチャでは、ダウンロードされたコンテナ画像のカストディアンと、ダウンロードされたコンテナ画像間の関係のレコーダーを再生します。グラフのローカルディレクトリでは、各コンテナイメージに保存されている特定の情報は、コンテナ画像のメタデータ(JSON)、コンテナ画像のレイヤーサイズ(レイヤー化)情報、およびコンテナ画像で表される特定のrootFです。
5。実験テスト:
- 最初はコンテナが有効になっていません:
デフォルト
[root@localhost docker]#llコンテナ/合計0
- コンテナを起動します:
デフォルト
[root@localhost docker] #docker run -i -t - rm centos:7 /bin /bash [root@187a8f9d2865 /]#
開始コンテナのUUID = 187A8F9D2865
- コンテナを起動する前に、/var/lib/docker/devicemapper/devicemapperの下のファイルの実際のサイズを確認します
デフォルト
[root@bhdocker216 docker]
- ホストの表示
デフォルト
[root@bhdocker216 docker]#ls containers/187a8f9d2865c2ac *** 91b981
UUIDフォルダーの下の開始コンテナの内容を確認します。
デフォルト
[root@bhdocker216コンテナ]#ll 187a8f9d2865c2ac *** 91b981total 24-rw -----。 1ルートルート273 3月5日23:59 187A8F9D2865 *** -JSON.LOG-RW-R--。 1ルートルート1683 3月5日23:58 config.json-rw-r--。 1ルートルート334 3月5日23:58 HOSTCONFIG.JSON-RW-R--。 1ルートルート13 3月5日23:58 HOSTNAME-RW-R--。 1ルートルート174 3月5日23:58 HOSTS-RW-R--。 1ルートルート69 3月5日23:58 Resolv.Conf-スタートアップコンテナにファイルを追加して表示します。
最初に実行中のコンテナにファイルを作成します。
デフォルト
[root@8a1e3ad05d9e/]#dd if =/dev/zero of = floppy.img bs = 512 count = 57605760+0レコードin5760+0レコードOut2949120バイト(2.9 mb)コピー、0.0126794 S、233 MB/s
次に、/var/lib/docker/devicemapper/devicemapperの下のファイルを表示します。
デフォルト
[root@bhdocker216 docker]
この場所のサイズは、#DDを最初に実行したため、少し異なります。if=/dev/zero of = test.txt bs = 1m count = 8000 8gサイズのファイルを作成します。遅すぎたために終了しましたが、実行中のコンテナで操作するときに両方のフォルダーが変更された(追加)されていることが明確にわかります。
- グラフを確認してください。 1つの画像(ubuntu14.10)のみが引っ張られると、7つの長いuuidという名前のディレクトリが表示されます。これはどのようにして生まれましたか?
Docker Images Treeを使用してミラーツリーの構造をリストすると、ミラーの階層ストレージ構造が表示されます。最終的なUbuntu(レイヤー7)は、レイヤー6の変化に基づいています。つまり、この論理ツリーのn番目の層はN-1の変化に基づいており、N層はN-1画像に依存します。 0番目のレイヤー、サイズは0で、ベースイメージと呼ばれます。
- グラフ/UUIDディレクトリのコンテンツは何ですか?
デフォルト
[root@localhostグラフ]#ll 01BF15A18638145EB *** -HTOTAL 8.0K-RW -----。 1ルートルート1.6k 3月5日18:02 JSON-RW -----。 1ルートルート9 3月5日18:02レイヤーズサイズ
層状の内容を表示:デジタル表現層のサイズ(ユニット:b)。 Josn:この画像のメタデータを保存します(サイズ、アーキテクチャ、構成、コンテナ、**親のuuid **など)。
-DeviceMapper/DeviceMapperフォルダーを表示します
データとメタデータの2つのフォルダーがあります。実際、デバイスマッパードライバーは、** data **ファイルにミラーファイルとコンテナファイルの両方を保存します。 Docker情報を使用して、データとメタデータのサイズを表示できます。さらに、DU H(上記で使用)を使用して、これら2つのスパースファイルの実際のサイズを表示できます。
-decdriver
デフォルト
[root@bhdocker216 docker]
- ボリューム
-vパラメーターのないボリュームは空です。テスト後、コンテナが開始された場合、-vパラメーターを追加すると、UUIDがボリュームフォルダーに表示されます。ホストではグローバル検索が実行され、ボリュームでのみ見つかります。それは、容器の画像とuuidとは何の関係もありません。
デフォルト
[root@bhdocker216 docker]#find/-name 86eb77f9f5e25676f100 *** d5a/var/lib/docker/volumes/86eb77f9f5e25676f100 *** d5a //内部の内容を見る:[root@bhdocker216 volumes] 86EB77F9F5E25676F100 *** D5ACONFIG.JSON [root@bhdocker216ボリューム] {"id": "86EB77F9F5E25676F100A89BA727BC15185303236AAE0DCF4C17223E37651D5A"、 "PATH": "/home/data"、 "isbindmount":true ":true}フォルダー関数の表説明
概要を作成し、テーブルを整理し、/var/lib/dockerの下のさまざまなフォルダーの機能を説明します。
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!