Dockerイメージ構築原理の分析(Dockerをインストールしなくてもイメージを構築できる)

Dockerイメージ構築原理の分析(Dockerをインストールしなくてもイメージを構築できる)

イメージの構築は、DevOps プロセスにおいて非常に重要なプロセスです。一般的に、イメージの構築とは、dockerfile ファイルを作成し、docker クライアントを通じてイメージを構築することを意味します。

Docker クライアントは、まずローカルにイメージがあるかどうかを確認し、ない場合はイメージ リポジトリからイメージを取得します。

次に、作成した Dockerfile を解析して新しいイメージを構築します。

この記事は理解するのに役立ちます

  • pull コマンドは舞台裏で何を実行しますか?
  • ビルド コマンドはバックグラウンドで何を実行しますか?

次の記事では以下について説明します。

Docker を使用しない場合、イメージを構築するにはどうすればよいでしょうか?

例として、Microsoftのaspnet2.2をベースとしてaspnetcoreプロジェクトのイメージを構築します。

mcr.microsoft.com/dotnet/core/aspnet:2.2

ベースイメージREGISTRYに従ってメインフェスト情報を取得します

https://mcr.microsoft.com/v2/dotnet/core/aspnet/manifests/2.2
受け入れる:
アプリケーション/vnd.oci.image.manifest.v1+json、アプリケーション/vnd.docker.distribution.manifest.v2+json、アプリケーション/vnd.docker.distribution.manifest.v1+json

取得した内容は以下のとおりです。

{
  "スキーマバージョン": 2,
  "メディアタイプ": "application/vnd.docker.distribution.manifest.v2+json",
  「設定」: {
    "メディアタイプ": "application/vnd.docker.container.image.v1+json",
    「サイズ」: 4039,
    「ダイジェスト」: 「sha256:e7e3b238011ce0f2b9350153535fe273caa01f0e7188d0b91f965b3802ddc600」
  },
  「レイヤー」: [
    {
      "メディアタイプ": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      「サイズ」: 22524609,
      「ダイジェスト」: 「sha256:804555ee037604c40de144f9f8da0d826d38db82f15d74cded32790fe279a8f6」
    },
    {
      "メディアタイプ": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      「サイズ」: 17692725,
      「ダイジェスト」: 「sha256:970251047358aea56ba6db6975b14ff12470b75de0c2477f4445240ddd727fd4」
    },
    {
      "メディアタイプ": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      「サイズ」: 2978257,
      「ダイジェスト」: 「sha256:f3d4c41a4fd13f35c0b46f19a4e27845f4695163cc7174d908ff84836bbc2f5a」
    },
    {
      "メディアタイプ": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      「サイズ」: 62145592,
      「ダイジェスト」: 「sha256:bd391c46585f9f8d84992bbaa9087189148c1601968eaaf097d5b3ed60840e5e」
    }
  ]
}

mainfestファイルにはダイジェストレコードが含まれています

  • 設定情報の概要
  • 各レイヤーの概要(上記の例では 4)

上記の構成情報の概要に基づいて構成の詳細を取得します

取得:https://mcr.microsoft.com/v2/dotnet/core/aspnet/blobs/sha256:e7e3b238011ce0f2b9350153535fe273caa01f0e7188d0b91f965b3802ddc600
{
  "アーキテクチャ": "amd64",
  「設定」: {
    "ホスト名": "",
    "ドメイン名": "",
    "ユーザー": "",
    "AttachStdin": false、
    "AttachStdout": false、
    "AttachStderr": false、
    「端末」: 偽、
    "OpenStdin": 偽、
    "StdinOnce": 偽、
    「環境」: [
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
      "ASPNETCORE_URLS=http://+:80",
      "DOTNET_RUNNING_IN_CONTAINER=true",
      "ASPNETCORE_VERSION=2.2.8"
    ]、
    「コマンド」: [
      「バッシュ」
    ]、
    "ArgsEscaped": true、
    「画像」: 「sha256:5ecfe4016ac8e911a94aa601a675f7204e9ccab00cbb08e7067c184ad40f34e9」、
    「ボリューム」: null、
    "作業ディレクトリ": "",
    「エントリポイント」: null、
    "OnBuild": null、
    「ラベル」: null
  },
  「コンテナ」: 「14196c2f9c327d41e26682d32c7c89c4e7c78aa32f8b7501a23192035a9f4844」、
  "コンテナ構成": {
    "ホスト名": "",
    "ドメイン名": "",
    "ユーザー": "",
    "AttachStdin": false、
    "AttachStdout": false、
    "AttachStderr": false、
    「端末」: 偽、
    "OpenStdin": 偽、
    "StdinOnce": false、
    「環境」: [
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
      "ASPNETCORE_URLS=http://+:80",
      "DOTNET_RUNNING_IN_CONTAINER=true",
      "ASPNETCORE_VERSION=2.2.8"
    ]、
    「コマンド」: [
      "/bin/sh",
      "-c",
      "aspnetcore.tar.gz https://dotnetcli.azureedge.net/aspnetcore/runtime/ $aspnetcore_version BE69ACB7E277DF2C243F931E10529DEF21DCBF9CE277609B30D462126BF8B8B3CAB36476BEC3D63A927B8E44E59E4D4D4CADE23EEF4596FBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDET 12 aspnetcore.tar.gz \ "| sha512sum -c  -  && mkdir -p/usr/share/dotnet && tar -zxf aspnetcore.tar.gz -c/usr/share/dotnet && rm aspnetcore.tar.tar.&&ln -s/usr/usr/dotnet/dotnet
    ]、
    「画像」: 「sha256:5ecfe4016ac8e911a94aa601a675f7204e9ccab00cbb08e7067c184ad40f34e9」、
    「ボリューム」: null、
    "作業ディレクトリ": "",
    「エントリポイント」: null、
    "OnBuild": null、
    「ラベル」: null
  },
  "作成日": "2019-12-28T08:12:05.676492579Z",
  "docker_version": "3.0.8",
  "歴史": [
    {
      "作成日": "2019-12-28T04:23:47.4966447Z",
      "created_by": "/bin/sh -c #(nop) / にファイル:90a2c81769a336bed3f731f44a385f2a65b0916f517a0b77c06c224579bf9a9a を追加します"
    },
    {
      "作成日": "2019-12-28T04:23:47.719507596Z",
      "created_by": "/bin/sh -c #(nop) CMD [\"bash\"]",
      "空のレイヤー": true
    },
    {
      "作成日": "2019-12-28T08:11:05.607009582Z",
      "created_by": "/bin/sh -c apt-get update && apt-get install -y --no-install-recommends ca-certificates libc6 libgcc1 libgssapi-krb5-2 libicu57 liblttng-ust0 libssl1.0.2 libstdc++6 zlib1g && rm -rf /var/lib/apt/lists/*"
    },
    {
      "作成日": "2019-12-28T08:11:07.64336022Z",
      "created_by": "/bin/sh -c #(nop) ENV ASPNETCORE_URLS=http://+:80 DOTNET_RUNNING_IN_CONTAINER=true",
      "空のレイヤー": true
    },
    {
      "作成日": "2019-12-28T08:11:16.475068844Z",
      "created_by": "/bin/sh -c apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/*"
    },
    {
      "作成日": "2019-12-28T08:11:43.814078508Z",
      "created_by": "/bin/sh -c #(nop) ENV ASPNETCORE_VERSION=2.2.8",
      "空のレイヤー": true
    },
    {
      "作成日": "2019-12-28T08:12:05.676492579Z",
      "created_by": "/bin/sh -c curl -SL --output aspnetcore.tar.gz https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNETCORE_VERSION/aspnetcore-runtime-$ASPNETCORE_VERSION-linux-x64.tar.gz && aspnetcore_sha512='954072376698be69acb7e277df2c243f931e10529def21dcbf9ce277609b30d462126bf8b8b3cab36476bec3d63a927b8e44e59e4d4cade23eef45956fba1ffd' && echo \"$aspnetcore_sha512 aspnetcore.tar.gz\" | sha512sum -c - && mkdir -p /usr/share/dotnet && tar -zxf aspnetcore.tar.gz -C /usr/share/dotnet && rm aspnetcore.tar.gz && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet"
    }
  ]、
  "OS": "Linux",
  "ルートファイル": {
    "タイプ": "レイヤー",
    "diff_ids": [
      "sha256:814c70fdae62bc26c603bfae861f00fb1c77fc0b1ee8d565717846f4df24ae5d",
      "sha256:0cf75cb98eb2e0a82631d4aff71b40ba79ff7f83e0361f696875e592a1a4cefc",
      "sha256:15e45d99c92686fb1fd61a41431d8400d7a0e8381595d09d666b0809c4f5d993",
      「sha256:579a8f1d6a123f98095c0b1a1395079f7504391fd2a8bc529dede305a2072a36」
    ]
  }
}

diff_idsに応じて対応するレイヤーをダウンロードします

ダウンロード後、概要を比較して画像ファイルの正当性を確認します。

パスルール:

https://mcr.microsoft.com/v2/dotnet/core/aspnet/blobs/sha256:XXXXXX

イメージの構築

ベースイメージの構成に基づいてカスタム構成を追加します

  • エントリーポイント
  • コマンド
  • ポート
  • 環境
  • イメージ作業ディレクトリ
  • ボリューム
  • ラベル

ベースイメージのすべてのレイヤーに、イメージをパッケージ化するレイヤーも作成します。

生成されたイメージtarballを解凍する

追加の tar.gz ファイルがあります。解凍すると、パックしたファイルが含まれます。

  • 元のベース画像には4つのレイヤーがあり、私たちのものも含めると合計5つのレイヤーがあります。
  • config.json
  • マニフェスト

config.json とベースイメージの比較

イメージをビルドするプロセスを確認し、イメージ名に応じて mainfest をプルしてみましょう。

  • メインフェストに従って構成をプルする
  • 設定に従ってレイヤーをプルする
  • 各レイヤーをダウンロード
  • ベースイメージの構成を変更する (config.json および mainfest.json)
  • 追加したいファイルレイヤーを追加します

原理を理解したら、プロセス全体を実装するツールを書くことができます。

私のオープンソースのDockerイメージビルドを使用すると、Dockerをインストールせずにコンテナイメージをすばやく構築できます。

基本的なイメージ構築として以下のイメージリポジトリをサポートします

  • ドッカーハブ
  • アリユン
  • テンセントクラウド

以上で、Docker イメージ構築の原理分析(Docker をインストールしなくてもイメージ構築は可能)の記事は終了です。Docker イメージ構築の詳細については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Spring Cloud での Docker デプロイメントに jib を使用する詳細な手順
  • jib を使用して Docker イメージをパッケージ化する
  • 初めてDockerイメージを構築、実行、公開、取得するための詳細な手順
  • Dockerイメージを構築する2つの方法の分析
  • GoogleContainerTools を使用して jib をコンテナ化し、Docker イメージを構築する

<<:  CSSスクロールバーのスタイルをカスタマイズする方法の詳細な説明

>>:  MySQLオンラインデッドロック分析練習

推薦する

JavaScript ジグソーパズルゲーム

この記事の例では、ジグソーパズルゲームを実装するためのJavaScriptの具体的なコードを参考まで...

ウェブページ制作と饅頭の関係(体験の共有)

昨日は遅くまで寝ていて、一日中起きていました。私の年齢では、夜更かしして本を書くのはもう無理のようで...

mysqlのkey_lenの計算方法についての簡単な説明

MySQL の explain コマンドは SQL のパフォーマンスを分析できます。その 1 つが ...

nodejs で worker_threads を使用して新しいスレッドを作成する方法

導入前の記事で述べたように、NodeJS には 2 種類のスレッドがあります。1 つは、ユーザー リ...

MySQLのマスタースレーブレプリケーションと読み取り書き込み分離を理解するための記事

目次導入1. MySQL マスタースレーブレプリケーション1. MySQLレプリケーションタイプ2....

テンプレートタグの使用方法の詳細な説明(Vue での使用方法の概要を含む)

目次1. HTML5のテンプレートタグ2. テンプレートタグ操作のプロパティとメソッド3. Vueの...

axios を使用してプロジェクト内の複数の繰り返しリクエストをフィルタリングする方法

目次1. はじめに:この場合、通常は 2 つのアプローチがあります。 2. CancelToken ...

CSS フレックスベースのテキストオーバーフロー問題の解決方法

重要でないflex-basisテキストオーバーフローに省略記号を追加するという小さな機能に多くの問題...

Nodejs で WeChat アカウント分割を実装するためのサンプルコード

会社のビジネスシナリオでは、WeChat アカウント分割機能を使用する必要があります。公式 Web ...

Windows 7 で MySQL 8.0.16 をインストールして使用する場合、パスワードの変更と Navicat への接続に関する問題が発生する

MySQL のインストール時にいくつかの問題が発生しました。オンラインで見つけた回答は似たようなもの...

VUE ユニアプリの条件付きコーディングとページレイアウトに関する簡単な説明

目次条件付きコンパイルページレイアウト要約する条件付きコンパイル条件付きコンパイルでは、特別なコメン...

Ubuntu 20.04 に MySql5.7 をインストールして構成するための詳細なチュートリアル

目次1. Ubuntuソースの変更2. MySQLをインストールする3. 新しいユーザーを作成し、権...

MySQLのストレージエンジンの詳細な説明

MySQL ストレージ エンジンの概要ストレージ エンジンとは何ですか? MySQL のデータは、さ...

レスポンシブなアコーディオン効果を実現するための CSS3 の詳細な説明

最近、外国人が CSS3 を使用してアコーディオン効果を実現しているビデオを見たので、自分で学習した...