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

Docker fügt eine Brücke hinzu und legt den IP-Adressbereich fest

Ich weiß nicht, ob es daran liegt, dass die Binär...

Allgemeine Funktionen der MySQL-Grundlagen

Inhaltsverzeichnis 1. Allgemeine Funktionsklassif...

Detaillierte Bereitstellung von Docker+Gitlab+Gitlab-Runner

Umfeld Server: centos7 Kunde: Fenster Stellen Sie...

Die 10 klassischen Optimierungsfälle und -szenarien von MySQL

Inhaltsverzeichnis 1. Allgemeine Schritte zur SQL...

Analyse des MySQL-Sperrmechanismus und der Verwendung

Dieser Artikel veranschaulicht anhand von Beispie...

Natives js zur Realisierung der Bild-Upload-Steuerung

In diesem Artikelbeispiel wird der spezifische Co...

Über das Problem der dynamischen Spleißen der SRC-Bildadresse von img in Vue

Werfen wir einen Blick auf das dynamische Spleiße...

Ausführliche Erläuterung der gespeicherten MySQL-Prozeduren (in, out, inout)

1. Einleitung Es wird seit Version 5.0 unterstütz...

CSS Flex mehrere mehrspaltige Layouts

Grundlegendes dreispaltiges Layout .Container{ An...

Implementierung einer nicht geheimen SSH-Kommunikation in Linux

Was ist SSH? Administratoren können sich remote a...

Fallstricke bei der neueren Version des IDEA2021 Tomcat10-Servlets

Da die Version, die ich beim Lernen verwendet hab...