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オンラインデッドロック分析練習

推薦する

Tomcat が IDEA のコンソールで文字化けを起こし、IDEA エンコーディングを UTF-8 に設定する方法

1. まず、TomcatログのエンコーディングとIdeaログ表示コンソールのエンコーディングを区別す...

Docker Composeを使用してDOCleverをインストールする詳細なプロセスを説明します

目次1. Docker Composeとは何か、インストールして使用する方法2. DOCleverと...

JavaScript はモーダルボックスのドラッグ効果を実現します

これはモーダル ボックスのドラッグのケースです。ここで実装する関数は次のとおりです。 1. ポップア...

mysql のインデックスと FROM_UNIXTIME に関する問題

ゼロ、背景今週の木曜日にたくさんのアラートを受け取りました。DBA に確認を依頼したところ、遅いクエ...

Windows 10 で MySql の解凍バージョンをインストールして構成する方法のチュートリアル

Windows 10 で MySql データベースの解凍バージョンをインストールするステップ 1: ...

MySQL ストアド プロシージャの作成、呼び出し、管理の詳細な説明

目次ストアドプロシージャの概要ストアド プロシージャを使用する理由は何ですか?ストアドプロシージャの...

1行のコードでLinuxのプロセスを隠す方法を学ぶ

友人たちはいつも、Linux のプロセスを隠す方法を私に尋ねます。私は、どの程度隠したいのか、カーネ...

openlayers6のマップオーバーレイの詳細な説明

1. オーバーレイの概要オーバーレイとは、その名の通り、別の形で地図上に表示される、覆うことを指しま...

Vue3 で状態管理を実装するために provide を使用する方法

目次序文provide/inject を通じて Vuex 関数を実装する方法このプラグインをアプリケ...

nginx 用の zabbix 5.0 をインストールして展開する方法

目次実験環境インストールと展開データベースをインストールして設定します (ここでは mariadb ...

aタグに下線を付け、クリック前後で色を変える方法

コードをコピーコードは次のとおりです。リンクフォントサイズ: 12px;色: #000000;テキス...

MySQL ビューの原則と使用例の概要

この記事では、MySQL ビューの原理と使用法についてまとめます。ご参考までに、詳細は以下の通りです...

プロトタイプとプロトタイプチェーン プロトタイプとプロトタイプの詳細

目次1. プロトタイプ2. プロトタイプチェーン2.1 コンストラクタ2.2 電話をかける/申し込む...

Zabbix カスタム監視 nginx ステータス実装プロセス

目次Zabbix カスタム監視 nginx ステータス1. ステータスインターフェースを開く2. 監...

MySQL 実験: explain を使用してインデックスの傾向を分析する

概要インデックス作成は、MySQL で習得しなければならないスキルであり、MySQL クエリの効率を...