近年、Docker はテクノロジー界で人気が高まっています。多くの実践者は、さまざまな程度でこれを使用しており、Dockerfile を介してイメージをビルドする方法、リモート イメージ リポジトリから必要なイメージをプルする方法、ビルドしたイメージをリモート リポジトリにプッシュする方法、イメージに基づいてコンテナーを実行する方法などを理解しています。このプロセスは非常に簡単です。 docker build、docker pull、docker push、docker run などの操作を実行するだけで済みます。しかし、画像がローカルにどのように保存されるかについて考えたことはありますか?イメージに基づいてコンテナはどのように起動されますか?画像がリモート画像リポジトリにプッシュされると、サーバー上でどのように保存されますか?これについて簡単にお話ししましょう。 Docker イメージのローカル ストレージ メカニズムとコンテナの起動原理 Docker イメージは単一のファイルではなく、複数のレイヤーで構成されます。 docker images を使用してローカル イメージ リストと対応するメタ情報を取得し、docker history <imageId> を使用して特定のイメージの各レイヤーの内容と対応するサイズを表示できます。各レイヤーは Dockerfile 内の命令に対応します。 Docker イメージはデフォルトで /var/lib/docker/<storage-driver> に保存され、docker デーモンの実行時に DOCKER_OPTS または --graph= または -g を介して指定できます。 Docker はストレージ ドライバーを使用して、イメージの各レイヤーと読み取りおよび書き込み可能なコンテナー レイヤーのコンテンツを管理します。ストレージ ドライバーには、DeviceMapper、AUFS、Overlay、Overlay2、Btrfs、ZFS などがあります。ストレージ ドライバーによって実装方法が異なり、イメージの構成形式も若干異なる場合がありますが、いずれもスタック ストレージと Copy-on-Write (CoW) 戦略を使用します。ストレージ ドライブはホットスワップ可能なアーキテクチャを採用しており、動的に調整できます。では、ストレージ ドライバーが多数ある場合、適切なものをどのように選択すればよいのでしょうか?次の点を考慮することができます。
Docker コンテナは実際にはイメージの上に読み取り/書き込みレイヤーを追加します。これは一般にコンテナ レイヤーとも呼ばれます。新しいファイルの書き込み、既存のファイルの変更、ファイルの削除など、実行中のコンテナで行われたすべての変更は、実際にはコンテナ レイヤーに書き込まれます。コンテナ層が削除され、最上位の読み取り/書き込み層も削除され、変更内容は当然失われます。これらの変更を永続化するには、 docker commit <containerId> [repository[:tag]] を使用して、現在のコンテナを新しいイメージとして保存する必要があります。データを永続化したり、複数のコンテナ間でデータを共有したりする場合は、データを Docker ボリュームに保存し、そのボリュームを対応するコンテナにマウントする必要があります。 ストレージ ドライバーは、イメージとコンテナーがファイル システムにどのように保存され、整理されるかを決定します。以下は、一般的な AUFS と Overlay の簡単な紹介です。 オーストラリア AUFSの紹介 AUFS は、Debian (Stretch より前のバージョン。Stretch はデフォルトで Overlay2 を使用します) または Ubuntu システム上の Docker のデフォルトのストレージ ドライバーであり、すべての Docker ストレージ ドライバーの中で最も成熟しています。起動が速く、メモリやストレージを効率的に使用できるという特徴があります。 Linux カーネル バージョン 4.0 以上を使用しており、Docker CE を使用している場合は、Overlay2 (AUFS よりもパフォーマンスが優れています) の使用を検討してください。 AUFS ストレージ ドライバーの設定 ①カーネルがAUFSをサポートしているか確認する
②カーネルがサポートしている場合は、docker起動時にパラメータ--storage-driver=aufsを指定してAUFSを選択できます。 AUFSストレージドライバの仕組み AUFS ストレージ ドライバーを使用する場合、イメージとコンテナに関するすべてのレイヤー情報は、3 つのサブディレクトリを持つ /var/lib/docker/aufs/ ディレクトリに保存されます。
AUFS を使用した後、コンテナはどのようにファイルを読み書きするのでしょうか? ファイルの読み取り
コンテナレイヤーとイメージレイヤーは同時に存在します。コンテナレイヤーファイルを読み取ります。 ファイルまたはディレクトリを変更する コンテナ内のファイルを変更するシナリオも 3 つあります。
ディレクトリ名の変更: 現在、AUFS はディレクトリ名の変更をサポートしていません。 オーバーレイFS OverlayFS の紹介 OverlayFS は、AUFS に似た最新のユニオン ファイル システムですが、実装がよりシンプルでパフォーマンスが優れています。厳密に言えば、OverlayFS は Linux カーネルのファイルシステムです。対応する Docker ストレージ ドライバーは Overlay または Overlay2 です。 Overlay2 には Linux カーネル 4.0 以上が必要であり、Overlay にはカーネル 3.18 以上が必要です。現在、Docker Community Edition のみがこれをサポートしています。条件が許せば、Overlay よりも inode 使用率が高い Overlay2 を使用するようにしてください。 Overlay/Overlay2 を使用してコンテナ内のファイルを読み書きする方法 ファイルの読み取り ファイルの読み取りには 3 つのシナリオがあります。
ファイルまたはディレクトリを変更する ファイルの書き込みには 3 つのシナリオがあります。
リモート イメージ リポジトリはどのようにイメージを保存しますか? Dockerをよく使う人も多いと思いますが、リモートイメージリポジトリにプッシュされたときにイメージをどのように保存するか考えたことはありますか? Docker クライアントはリモート イメージ リポジトリとどのように対話しますか? 通常ローカルにインストールする Docker は、実際には Docker クライアントと Docker エンジンの 2 つの部分で構成されています。 Docker クライアントと Docker エンジンは API を介して通信します。 Docker エンジンが提供する API には、一般的に、認証、コンテナ、イメージ、ネットワーク、ボリューム、スウォームなどが含まれます。具体的な呼び出し形式については、Docker エンジン API (https://docs.docker.com/engine/api/v1.27/#) を参照してください。 Docker エンジンとレジストリ (つまり、リモート イメージ リポジトリ) 間の通信にも完全な API セットがあり、認証、承認、イメージの保存、およびイメージのプルとプッシュに関連するその他の関連プロセスを大まかにカバーします。詳細については、レジストリ API (https://github.com/docker/distribution/blob/master/docs/spec/api.md) を参照してください。一般的に使用されているレジストリ バージョンは v2 で、ブレークポイントの再開や複数レイヤーのイメージの同時プルなどの機能があります。複数のレイヤーを同時にプルできる理由は、イメージのメタデータがイメージ レイヤー データとは別に保存されるためです。イメージをプルするときは、まず認証してトークンを取得し、承認に合格してから、イメージ マニフェスト ファイルを取得して署名検証を実行します。検証が完了すると、マニフェスト内のレイヤー情報に従って各レイヤーが同時にプルされます。マニフェストには、リポジトリ名、タグ、イメージ レイヤー ダイジェストなどの情報が含まれます。詳細については、マニフェスト形式のドキュメント (https://github.com/docker/distribution/blob/master/docs/spec/manifest-v2-1.md) を参照してください。 各レイヤーがプルダウンされた後、最初にローカルで検証され、検証アルゴリズムでは sha256 が使用されます。プッシュ プロセスでは、まずイメージの各レイヤーがレジストリに同時にプッシュされます。プッシュが完了すると、イメージのマニフェストがレジストリにプッシュされます。実際のところ、レジストリは具体的な保管作業については責任を負いません。具体的な記憶媒体はユーザーが決定します。レジストリは標準のストレージ ドライバー インターフェイスのセットのみを提供し、特定のストレージ ドライバーの実装はユーザーによって実装されます。 現在、公式レジストリによってデフォルトで提供されるストレージ ドライバーには、Microsoft Azure、Google gcs、Amazon s3、OpenStack swift、Alibaba Cloud OSS、ローカル ストレージなどがあります。独自のオブジェクト ストレージ サービスを使用する必要がある場合は、レジストリ ストレージ ドライバーを自分で実装する必要があります。 NetEase Cloud は現在、独自のオブジェクト ストレージ サービス nos にイメージを保存しているため、nos 専用のストレージ ドライバーが実装されています。また、認証サービスもNetEase Cloud認証サービスに接続されており、独自の業務と組み合わせて一連の認証および認可ロジックを実装し、倉庫のクォータを効果的に制限します。 レジストリの動作は実は非常に単純で、大まかに分けると次のようになります。① 構成の読み取り。 ②ハンドラを登録する。 ③ 聞く。本質的に、レジストリは HTTP サービスです。起動後、設定ファイルに設定されたポートをリッスンします。 http リクエストが到着すると、以前に登録されたハンドラーがトリガーされます。ハンドラーには、マニフェスト、タグ、BLOB、BLOB アップロード、BLOB アップロード チャンク、カタログなどの 6 つのカテゴリが含まれます。詳細については、レジストリ ソース コード (/registry/handlers/app.go:92) を参照してください。構成ファイルには、リスニング ポート、認証アドレス、ストレージ ドライバー情報、コールバック通知などが含まれています。 |
>>: プライベートクラウドとハイブリッドクラウドを成功させる4つの鍵
近年、国内のクラウドコンピューティング市場は、複数の業界での徹底的な応用の傾向を示しています。特に、...
dedipath Asia Optimized Network の VPS は、夏の特別プロモーショ...
先ほど A5 で見た SEO は死んだという記事に関して、私はそうは思いません。私の5つのステーショ...
過去数年間でクラウドの導入が加速しており、多くの組織が従来のデータセンターをクラウドホスト型インフラ...
ネットワーク技術の発展により、モバイルインターネットユーザーが急増しました。モバイルソーシャルメディ...
テンセントテクノロジーは5月9日、改訂を発表し、「今後、テンセントテクノロジーは『ニュース報道』のマ...
クラウド ネイティブ アプローチにより、開発者はアプリケーションの機能を中断することなく、製品をより...
サーバーがKになったという記事でBaiduに取り上げられた2つのウェブサイトのランキングが回復し、少...
最近、Feng Cai Yi Yangは、ウェブサイトにトラフィックをもたらすだけでは十分ではないこ...
2020年上半期の疫病の影響と株式市場の変動を経験し、多くの人が生活、財務管理、安全保障について新た...
360 は検索エンジンですか? 8 月 16 日に、新製品「360 Comprehensive Se...
疫病の継続的な影響と消費者のライフスタイルの変化により、3C海外ブランドのインフルエンサーマーケティ...
メールマーケティングはQQメールマーケティングに限定されず、163メールボックス、126メールボック...
corgitech、5年間運営しているこのVPSビジネスは、長い間私のブログに登場していませんでした...
記者の張仙安が北京からレポートします6月には北京の望金宝と深センの客訊が再び逃亡したと報じられ、中央...