Analyse des Docker-Image-Erstellungsprinzips (Sie können ein Image erstellen, ohne Docker zu installieren)

Analyse des Docker-Image-Erstellungsprinzips (Sie können ein Image erstellen, ohne Docker zu installieren)

Das Erstellen eines Images ist ein sehr wichtiger Prozess im DevOps-Prozess. Im Allgemeinen bedeutet das Erstellen eines Images, eine Dockerfile-Datei zu schreiben und das Image dann über den Docker-Client zu erstellen.

Der Docker-Client prüft zunächst, ob lokal ein Image vorhanden ist. Wenn nicht, ruft er es für Sie aus dem Image-Repository ab.

Analysieren Sie dann die von Ihnen geschriebene Docker-Datei, um ein neues Image zu erstellen.

Dieser Artikel wird Ihnen helfen zu verstehen

  • Was macht der Pull-Befehl hinter den Kulissen?
  • Was macht der Build-Befehl hinter den Kulissen?

Der nächste Artikel erklärt:

Wie erstelle ich ein Image, wenn ich Docker nicht verwende?

Wir nehmen Microsofts aspnet2.2 als Grundlage, um als Beispiel ein Image des aspnetcore-Projekts zu erstellen

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

Holen Sie sich Mainfest-Informationen gemäß dem Basis-Image REGISTRY

https://mcr.microsoft.com/v2/dotnet/core/aspnet/manifests/2.2
Akzeptieren:
Anwendung/vnd.oci.image.manifest.v1+json, Anwendung/vnd.docker.distribution.manifest.v2+json, Anwendung/vnd.docker.distribution.manifest.v1+json

Der erhaltene Inhalt ist wie folgt:

{
  "schemaVersion": 2,
  "Medientyp": "Anwendung/vnd.docker.distribution.manifest.v2+json",
  "Konfiguration": {
    "Medientyp": "Anwendung/vnd.docker.container.image.v1+json",
    "Größe": 4039,
    "Digest": "sha256:e7e3b238011ce0f2b9350153535fe273caa01f0e7188d0b91f965b3802ddc600"
  },
  "Ebenen": [
    {
      "Medientyp": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "Größe": 22524609,
      "Digest": "sha256:804555ee037604c40de144f9f8da0d826d38db82f15d74cded32790fe279a8f6"
    },
    {
      "Medientyp": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "Größe": 17692725,
      "Digest": "sha256:970251047358aea56ba6db6975b14ff12470b75de0c2477f4445240ddd727fd4"
    },
    {
      "Medientyp": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "Größe": 2978257,
      "Digest": "sha256:f3d4c41a4fd13f35c0b46f19a4e27845f4695163cc7174d908ff84836bbc2f5a"
    },
    {
      "Medientyp": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "Größe": 62145592,
      "Digest": "sha256:bd391c46585f9f8d84992bbaa9087189148c1601968eaaf097d5b3ed60840e5e"
    }
  ]
}

Die Mainfest-Datei enthält Digest-Datensätze

  • Zusammenfassung der Konfigurationsinformationen
  • Eine Zusammenfassung der einzelnen Ebenen (4 im obigen Beispiel)

Erhalten Sie Konfigurationsdetails basierend auf der obigen Zusammenfassung der Konfigurationsinformationen

Erhalten Sie: https://mcr.microsoft.com/v2/dotnet/core/aspnet/blobs/sha256:e7e3b238011ce0f2b9350153535fe273caa01f0e7188d0b91f965b3802ddc600
{
  "Architektur": "amd64",
  "Konfiguration": {
    "Hostname": "",
    "Domänenname": "",
    "Benutzer": "",
    "AttachStdin": falsch,
    "AttachStdout": falsch,
    "AttachStderr": false,
    "Tty": falsch,
    "OpenStdin": falsch,
    "StdinOnce": falsch,
    "Umgebung": [
      „PFAD=/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“
    ],
    "Befehl": [
      "schlagen"
    ],
    "ArgsEscaped": wahr,
    "Bild": "sha256:5ecfe4016ac8e911a94aa601a675f7204e9ccab00cbb08e7067c184ad40f34e9",
    "Volumes": null,
    "Arbeitsverzeichnis": "",
    "Einstiegspunkt": null,
    "OnBuild": null,
    "Labels": null
  },
  "Container": "14196c2f9c327d41e26682d32c7c89c4e7c78aa32f8b7501a23192035a9f4844",
  "Containerkonfiguration": {
    "Hostname": "",
    "Domänenname": "",
    "Benutzer": "",
    "AttachStdin": falsch,
    "AttachStdout": falsch,
    "AttachStderr": false,
    "Tty": falsch,
    "OpenStdin": falsch,
    "StdinOnce": falsch,
    "Umgebung": [
      „PFAD=/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“
    ],
    "Befehl": [
      "/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.gzz && asspNetcore_Sha512 77DF2C243F931E10529DEF21DCBF9CE277609B30D462126BF8B8B3CAB36476BEC3D63A927B8E4E4E59E4D4CADE23EEF456FBA12FBA12FBA121212FBA1121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212. tar.gz \ "| SHA512SUM -c -&& mkdir -p/usr/Share/dotnet && tar -Zxf Aspnetcore.tar.gz -c/usr/shary/dotnet && rm Aspnetcore.tar.gz && ln -S/usr/sharn/sharn/dotnet/dotnet/dotnet/us/us.
    ],
    "Bild": "sha256:5ecfe4016ac8e911a94aa601a675f7204e9ccab00cbb08e7067c184ad40f34e9",
    "Volumes": null,
    "Arbeitsverzeichnis": "",
    "Einstiegspunkt": null,
    "OnBuild": null,
    "Labels": null
  },
  "erstellt": "2019-12-28T08:12:05.676492579Z",
  "docker_version": "3.0.8",
  "Geschichte": [
    {
      "erstellt": "2019-12-28T04:23:47.4966447Z",
      "created_by": "/bin/sh -c #(nop) ADD file:90a2c81769a336bed3f731f44a385f2a65b0916f517a0b77c06c224579bf9a9a in / "
    },
    {
      "erstellt": "2019-12-28T04:23:47.719507596Z",
      "erstellt von": "/bin/sh -c #(nop) CMD [\"bash\"]",
      "empty_layer": wahr
    },
    {
      "erstellt": "2019-12-28T08:11:05.607009582Z",
      "erstellt von": "/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/*"
    },
    {
      "erstellt": "2019-12-28T08:11:07.64336022Z",
      "erstellt von": "/bin/sh -c #(nop) ENV ASPNETCORE_URLS=http://+:80 DOTNET_RUNNING_IN_CONTAINER=true",
      "empty_layer": wahr
    },
    {
      "erstellt": "2019-12-28T08:11:16.475068844Z",
      "erstellt von": "/bin/sh -c apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/*"
    },
    {
      "erstellt": "2019-12-28T08:11:43.814078508Z",
      "erstellt von": "/bin/sh -c #(nop) ENV ASPNETCORE_VERSION=2.2.8",
      "empty_layer": wahr
    },
    {
      "erstellt": "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",
  "rootfs": {
    "Typ": "Ebenen",
    "diff_ids": [
      "sha256:814c70fdae62bc26c603bfae861f00fb1c77fc0b1ee8d565717846f4df24ae5d",
      „sha256:0cf75cb98eb2e0a82631d4aff71b40ba79ff7f83e0361f696875e592a1a4cefc“,
      "sha256:15e45d99c92686fb1fd61a41431d8400d7a0e8381595d09d666b0809c4f5d993",
      "sha256:579a8f1d6a123f98095c0b1a1395079f7504391fd2a8bc529dede305a2072a36"
    ]
  }
}

Laden Sie die entsprechenden Ebenen gemäß diff_ids herunter

Vergleichen Sie nach dem Herunterladen die Zusammenfassung, um die Rechtmäßigkeit der Bilddatei sicherzustellen.

Pfadregeln:

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

Aufbau unseres Images

Fügen Sie unsere benutzerdefinierte Konfiguration basierend auf der Konfiguration des Basisabbilds hinzu

  • Einstiegspunkt
  • Cmd
  • Häfen
  • Umfeld
  • BildArbeitsverzeichnis
  • Bände
  • Labels

In allen Ebenen des Basisbildes erstellen wir auch eine Ebene zum Verpacken des Bildes

Entpacken Sie das generierte Image-Tarball

Es gibt eine zusätzliche tar.gz-Datei. Nach der Dekomprimierung enthält diese die von uns gepackten Dateien.

  • Das ursprüngliche Basisbild hat 4 Ebenen, plus unsere, insgesamt 5
  • config.json
  • manifest.json

config.json-Vergleich mit Basis-Image

Lassen Sie uns den Vorgang zum Erstellen eines Images überprüfen und das Mainfest entsprechend dem Image-Namen abrufen.

  • Pull-Konfiguration gemäß Mainfest
  • Ebenen gemäß Konfiguration ziehen
  • Laden Sie jede Ebene herunter
  • Ändern Sie die Konfiguration des Basisimages (config.json und mainfest.json).
  • Fügen Sie die Dateiebene hinzu, die wir hinzufügen möchten

Nachdem wir das Prinzip kennen, können wir ein Tool schreiben, um den gesamten Prozess zu implementieren

Mit meinem Open-Source-Docker-Image-Build können Sie schnell Container-Images erstellen, ohne Docker installieren zu müssen

Unterstützt die folgenden Image-Repositorys als grundlegende Image-Erstellung

  • Docker-Hub
  • Abonnieren
  • Tencent Cloud

Damit ist dieser Artikel zur Analyse der Prinzipien der Docker-Image-Erstellung abgeschlossen (Sie können Images erstellen, ohne Docker zu installieren). Weitere Informationen zur Docker-Image-Erstellung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Detaillierte Schritte zur Verwendung von Jib für die Docker-Bereitstellung in Spring Cloud
  • Verwenden von Jib zum Verpacken von Docker-Images
  • Detaillierte Schritte zum Erstellen, Ausführen, Veröffentlichen und erstmaligen Abrufen eines Docker-Images
  • Analyse zweier Methoden zum Erstellen von Docker-Images
  • Verwenden Sie GoogleContainerTools, um Jib in einen Container zu packen und ein Docker-Image zu erstellen.

<<:  Detaillierte Erklärung zum Anpassen des Stils von CSS-Bildlaufleisten

>>:  MySQL Online-Übung zur Deadlock-Analyse

Artikel    

Artikel empfehlen

Detaillierte Erklärung zur Verwendung von Vue-Resource-Interceptors

Vorwort Abfangjäger In einigen modernen Front-End...

Lösung, wenn der Docker-Container nicht auf den Host-Port zugreifen kann

Ich bin kürzlich bei der Arbeit auf ein Problem g...

Erfahren Sie, wie Sie Vue3 Reactivity implementieren

Inhaltsverzeichnis Vorwort Start Ein kleiner Geda...

Schritte zum Übertragen des neuen Kernels auf das Linux-System

1. Laden Sie das Ubuntu16.04-Image und den entspr...

So stellen Sie Redis in Docker bereit und starten es

Redis im Docker bereitstellen Installieren Sie zu...

Verwendung des Vuex-Namespace

Inhaltsverzeichnis Da Vuex einen einzelnen Zustan...

Praxis der Vue Global Custom-Anweisung Modal Drag

Inhaltsverzeichnis Hintergrund Umsetzungsideen Er...

Methoden und Techniken zur Gestaltung einer interessanten Website (Bild)

Haben Sie schon einmal eine Situation erlebt, in d...

Müssen Designer das Programmieren lernen?

Oftmals wird nach der Fertigstellung eines Webdes...

Centos8.3, Docker-Bereitstellung, Springboot-Projekt, tatsächliche Fallanalyse

Einführung Derzeit ist k8s sehr beliebt und ich h...

So verwenden Sie Javascript zum Erstellen einfacher Algorithmen

Inhaltsverzeichnis 1 Frage 2 Methoden 3 Experimen...

Detaillierte Analyse des React Native-Startvorgangs

Einführung: Dieser Artikel verwendet das von reac...