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 empfehlen

Einführung in die Installationsmethode in Vue

Inhaltsverzeichnis 1. Weltweit registrierte Kompo...

Detaillierte Erklärung des Middleman-Modus von Angular-Komponenten

Inhaltsverzeichnis 1. Mittelsmann-Modell 2. Beisp...

Zusammenfassung der Überlegungen zum Schreiben von Web-Frontend-Code

1. Am besten fügen Sie vor dem HTML-Tag einen Satz...

Docker- und Portainer-Konfigurationsmethoden unter Linux

1. Installieren und verwenden Sie Docer CE Dieser...

Was sind die Dateiattribute von crw, brw, lrw usw. in Linux?

Was ist eine Datei? Eigentlich sind alle Dateien ...

So entschlüsseln Sie Linux-Versionsinformationen

Das Anzeigen und Interpretieren von Informationen...

So installieren Sie Android x86 in einer virtuellen VMware-Maschine

Manchmal möchten Sie eine App testen, aber nicht ...

Eine einfache Methode zum Zusammenführen und Entfernen doppelter MySQL-Tabellen

Szenario: Die gecrawlten Daten erzeugen eine Date...