Ein Beginner Guide zum Verstehen und Erstellen von Docker-Images


Edward Kisller
2020-06-29

Einleitung

Ein Docker-Image ist eine schreibgeschützte Vorlage, die eine Reihe von Anweisungen zum Erstellen eines Containers enthält, der auf der Docker-Plattform ausgeführt werden kann. Es bietet eine bequeme Möglichkeit, Anwendungen und vorkonfigurierte Serverumgebungen zu verpacken, die Sie für Ihre eigene private Nutzung verwenden oder öffentlich mit anderen Docker-Benutzern teilen können.
Docker-Images sind auch der Startpunkt für jeden, der Docker zum ersten Mal verwendet.

In diesem Guide führen wir Sie also nicht nur durch die Grundlagen von Docker-Images, sondern zeigen Ihnen auch, wo Sie „fertige Images von der Stange“ finden, die Ihnen einen Vorsprung bei der Erstellung Ihrer eigenen containerisierten Anwendungen, Tools und Dienste verschaffen.

Als neuer Docker-Benutzer müssen Sie auch verstehen, wie Sie Ihre eigenen benutzerdefinierten Images erstellen können. Wir werden daher kurz darauf eingehen, wie Sie Docker-Images für die Bereitstellung Ihres Codes und die Zusammenstellung von Container-basierten Diensten erstellen.
Dieser Guide enthält:

  1. Anatomie eines Docker images
  2. Container Registries
  3. Container Repositories
  4. Wie erstellt man ein Docker image
  5. Erfahren Sie mehr über Docker
  6. Machen Sie bei der Docker Challenge mit (falls nicht schon geschehen)

 

 

Schauen wir uns zunächst die Zusammensetzung eines Docker-Images genauer an.

1. Anatomie eines Docker Image

Ein Docker-Image besteht aus einer Sammlung von Dateien, die alle wesentlichen Elemente wie Installationen, Anwendungscode und Abhängigkeiten bündeln, die zur Konfiguration einer voll funktionsfähigen Container-Umgebung erforderlich sind. Sie können ein Docker-Image auf eine von zwei Arten erstellen:

  • Interaktive Methode: Durch Ausführen eines Containers aus einem vorhandenen Docker-Image, manuelles Ändern dieser Container-Umgebung durch eine Reihe von Live-Schritten und Speichern des resultierenden Zustands als neues Image.
  • Dockerfile-Methode: Durch Erstellen einer Klartextdatei, die als Dockerfile bezeichnet wird und die Spezifikationen für die Erstellung eines Docker-Images enthält.
    Wir werden jede dieser beiden Methoden später in diesem Handbuch ausführlicher behandeln. Konzentrieren wir uns aber erst einmal auf die wichtigsten Docker-Image-Konzepte.

Image Ebenen

Jede der Dateien, aus denen ein Docker Image besteht, wird als Schicht bezeichnet. Diese Schichten bilden eine Reihe von Zwischen-Images, die schrittweise übereinander aufgebaut werden, wobei jede Schicht von der unmittelbar darunter liegenden Schicht abhängig ist.

Die Hierarchie der Schichten ist der Schlüssel für ein effizientes Lebenszyklus-Management Ihrer Docker-Images, wobei Sie die Schichten, die sich am häufigsten ändern, so weit oben „im Stack“ wie möglich organisieren sollten.

Docker erstellt bei Änderungen an einer Schicht in Ihrem Image nicht nur diese bestimmte Schicht neu, sondern alle Schichten, die aus ihr aufgebaut sind. Daher ist eine Änderung an einer Schicht am oberen Ende des Stacks mit dem geringsten Rechenaufwand verbunden, um das gesamte Image neu zu erstellen.

Container Layers

Jedes Mal, wenn Docker einen Container aus einem Image startet, fügt es eine dünne, beschreibbare Schicht hinzu, die als Container-Schicht bezeichnet wird und die alle Änderungen am Container während seiner Laufzeit speichert.

Da diese Schicht der einzige Unterschied zwischen einem im Betrieb befindlichen Container und dem Quell-Docker-Image selbst ist, kann eine beliebige Anzahl von gleichartigen Containern potenziell gemeinsam auf das gleiche zugrunde liegende Image zugreifen, während sie ihren eigenen individuellen Zustand beibehalten.

Docker Containers & Docker ImagesContainer, die auf demselben Image basieren, teilen sich dieses Image,

was den Ressourcen-Overhead reduziert.

Übergeordnetes Image

In den meisten Fällen wird die erste Schicht eines Docker Images als übergeordnetes Image bezeichnet. Es ist die Grundlage, auf der alle anderen Schichten aufgebaut werden, und liefert die grundlegenden Bausteine für Ihre Container-Umgebungen.

Auf der öffentlichen Container-Registry Docker Hub finden Sie eine Vielzahl von vorgefertigten Images, die Sie als übergeordnetes Image verwenden können. Sie finden sie auch bei einigen wenigen Diensten von Drittanbietern, z. B. bei Google Container Registry. Alternativ können Sie auch eines Ihrer eigenen vorhandenen Images als Grundlage für die Erstellung neuer Images verwenden.

Ein typisches Parent-Image kann eine abgespeckte Linux-Distribution sein oder einen vorinstallierten Dienst enthalten, wie z. B. ein Datenbankmanagementsystem (DBMS) oder ein Content-Management-System (CMS).

Base Image

Einfach ausgedrückt ist ein Basis-Image eine leere erste Schicht, mit der Sie Ihre Docker-Images von Grund auf neu erstellen können. Basis-Images geben Ihnen die volle Kontrolle über den Inhalt der Images, sind aber im Allgemeinen für fortgeschrittene Docker-Benutzer gedacht.

Docker Manifest

Zusammen mit einer Reihe von einzelnen Schichtdateien enthält ein Docker-Image auch eine zusätzliche Datei, die als Manifest bezeichnet wird. Dabei handelt es sich im Wesentlichen um eine Beschreibung des Images im JSON-Format, die Informationen wie Image-Tags, eine digitale Signatur und Details zur Konfiguration des Containers für verschiedene Arten von Host-Plattformen enthält.
User-added image

2. Container Registries

Container-Registries sind Kataloge von Speicherorten, so genannte Repositories, in die Sie Container-Images schieben und ziehen können. Die drei Haupttypen von Registries sind wie folgt:

  • Docker Hub: Docker’s eigene offizielle Image-Ressource, in der Sie auf mehr als 100.000 Container-Images zugreifen können, die von Software-Anbietern, Open-Source-Projekten und der Docker-Community zur Verfügung gestellt werden. Sie können den Dienst auch nutzen, um Ihre eigenen privaten Images zu hosten und zu verwalten.

 

  • Registries von Drittanbietern: Vollständig verwaltete Registries, die als zentraler Zugriffspunkt auf Ihre eigenen Container-Images dienen und eine Möglichkeit bieten, diese zu speichern, zu verwalten und zu sichern, ohne dass Sie Ihre eigene Registry vor Ort betreiben müssen. Beispiele für Registry-Angebote von Drittanbietern, die Docker-Images unterstützen, sind Red Hat Quay, Amazon ECR , Azure Container Registry , Google Container Registry und die Container-Registry von JFrog .

 

  • Selbst gehostete Registries: Ein Registry-Modell, das von Unternehmen bevorzugt wird die Container-Images auf ihrer eigenen Infrastruktur vor Ort zu hosten – typischerweise aufgrund von Sicherheits-, Compliance- oder geringeren Latenzanforderungen.
    Um Ihre eigene, selbst gehostete Registry zu betreiben, müssen Sie einen Registry-Server einrichten.
    Sie können auch Ihre eigene private, entfernte und virtuelle Docker-Registry einrichten.

3. Container Repositories

Container Repositories sind die spezifischen physischen Orte, an denen Ihre Docker-Images tatsächlich gespeichert sind, wobei jedes Repository eine Sammlung zusammengehöriger Images mit demselben Namen umfasst.

Jedes dieser Images innerhalb eines Repositorys wird individuell durch ein anderes Tag referenziert und repräsentiert eine andere Version von grundsätzlich demselben Container-Einsatz.

Auf Docker Hub ist mysql zum Beispiel der Name des Repositorys, das verschiedene Versionen des Docker-Images für das beliebte Open-Source-DBMS MySQL enthält.

4. So erstellen Sie ein Docker-Image

In diesem Abschnitt behandeln wir die beiden verschiedenen Methoden zur Erstellung von Docker-Images etwas ausführlicher, damit Sie Ihr Wissen in die Praxis umsetzen können.

Interaktive Methode

User-added image

Vorteile: Schnellste und einfachste Möglichkeit, Docker-Images zu erstellen. Ideal zum Testen, zur Fehlersuche, zur Ermittlung von Abhängigkeiten und zur Validierung von Prozessen.

User-added image

Nachteile: Schwieriges Lifecycle-Management, das eine fehleranfällige manuelle Neukonfiguration von interaktiven Live-Prozessen erfordert. Leichteres Erstellen von nicht optimierten Bildern mit unnötigen Ebenen.

Im Folgenden finden Sie eine Reihe von vereinfachten Schritten zur interaktiven Erstellung eines Bildes:

  • Installieren Sie Docker und starten Sie die Docker-Engine.
  • Öffnen Sie eine Terminal Session.
  • Verwenden Sie den folgenden Docker-Ausführungsbefehl, um eine interaktive Shell-Session mit einem Container zu starten, der von dem durch image_name:tag_name angegebenen Abbild gestartet wurde.

 $ docker run -it image_name:tag_name bash

Wenn Sie den Tag-Namen weglassen, zieht Docker automatisch die neueste Image-Version, die durch das neueste Tag gekennzeichnet ist. Wenn Docker dasImage nicht lokal finden kann, zieht es die für die Erstellung des Containers erforderlichen Daten aus dem entsprechenden Repository auf Docker Hub.

In unserem Beispiel starten wir eine Container-Umgebung, die auf der neuesten Version von Ubuntu basiert.

 $ docker run -it ubuntu bash

  • Konfigurieren Sie nun Ihre Container-Umgebung, indem Sie z. B. alle benötigten Frameworks, Abhängigkeiten, Bibliotheken, Updates und den Anwendungscode installieren. Das folgende einfache Beispiel fügt einen NGINX-Server hinzu.

 # apt-get update && apt-get install -y nginx

Als nächstes müssen Sie den Namen oder die ID Ihrer laufenden Container-Instanz kennen.
  • Öffnen Sie eine weitere Bash-Shell und geben Sie den folgenden Befehl docker ps ein, um aktive Containerprozesse aufzulisten.

 $ docker ps

Die folgende Beispielausgabe zeigt unseren laufenden Container mit der ID e61e8081866d und dem Namen keen_gauss.
CONTAINER ID    IMAGE    COMMAND    CREATED          STATUS        PORTS    NAMES
e61e8081866d    ubuntu    "bash"  2 minutes ago     Up 2 minutes         keen_gauss
Dieser Name wird vom Docker-Daemon zufällig generiert. Sie können Ihren Container aber auch mit etwas Sinnvollerem identifizieren, indem Sie mit dem Operator -name im Docker-Ausführungsbefehl einen eigenen Namen vergeben.
  • Speichern Sie Ihr Image mit dem Docker-Befehl commit und geben Sie dabei entweder die ID oder den Namen des Containers an, aus dem Sie es erstellen möchten.

 $ docker commit keen_gauss ubuntu_testbed

Im obigen Beispiel haben wir den Namen unseres Containers angegeben und das resultierende Image ubuntu_testbed genannt.
  • Verwenden Sie nun den Befehl “Docker images”, um das soeben erstellte Image anzuzeigen.

 $ docker images

Sie sollten Ihr neues Bild in den Ergebnissen aufgelistet sehen.
REPOSITORY     TAG        IMAGE ID          CREATED            SIZE
ubuntu        latest      775349758637      5 minutes ago      64.2MB
  • Kehren Sie dann zu Ihrer interaktiven Container-Shell zurück und geben Sie exit ein, um sie herunterzufahren.

 # exit

Dockerfile Methode

User-added image

Vorteile: Saubere, kompakte und wiederholbare rezeptbasierte Images. Einfachere Verwaltung des Lebenszyklus und einfachere Integration in kontinuierliche Integrations- (CI) und kontinuierliche Bereitstellungsprozesse (CD). Klare, selbstdokumentierte Aufzeichnung der Schritte, die zum Zusammenstellen des Images unternommen wurden.

User-added image

Nachteile: Schwieriger für Anfänger und zeitaufwändiger in der Erstellung von Grund auf.

Der Dockerfile-Ansatz ist die Methode der Wahl für reale, unternehmenstaugliche Container-Implementierungen.

Es ist eine systematischere, flexiblere und effizientere Art, Docker-Images zu erstellen und der Schlüssel zu kompakten, zuverlässigen und sicheren Container-Umgebungen.

Kurz gesagt, die Dockerfile-Methode ist ein dreistufiger Prozess, bei dem Sie:

Das Dockerfile erstellen und die Befehle hinzufügen, die Sie zum Zusammenstellen des Abbilds benötigen.

Die folgende Tabelle zeigt Ihnen die Dockerfile-Anweisungen, die Sie am ehesten Verwenden werden:

Command

Zweck

FROM

So geben Sie das übergeordnete Bild an.

WORKDIR

So legen Sie das Arbeitsverzeichnis für alle folgenden Befehle in der Dockerdatei fest.

RUN

So installieren Sie alle Anwendungen und Pakete, die für Ihren Container erforderlich sind.

COPY

Zum Kopieren von Dateien oder Verzeichnissen von einem bestimmten Speicherort.

ADD

Wie COPY, aber zusätzlich in der Lage, Remote-URLs zu verarbeiten und komprimierte Dateien zu entpacken.

ENTRYPOINT

Befehl, der immer ausgeführt wird, wenn der Container startet. Wenn nicht angegeben, ist die Vorgabe /bin/sh -c

CMD

Argumente, die an den Einstiegspunkt übergeben werden. Wenn ENTRYPOINT nicht gesetzt ist (Standardwert ist /bin/sh -c), sind die CMD die Befehle, die der Container ausführt.

EXPOSE

So legen Sie fest, über welchen Port auf Ihre Container-Anwendung zugegriffen werden soll.

LABEL

So fügen Sie dem Bild Metadaten hinzu.

Beispiel Dockerfile

# Use the official Ubuntu 18.04 as base
FROM ubuntu:18.04
# Install nginx and curl
RUN apt-get update &&
apt-get upgrade -y &&
apt-get install -y nginx curl &&
rm -rf /var/lib/apt/lists/*

Ein Beispiel-Dockerfile zum Erstellen eines Images auf Basis des offiziellen Ubuntu 18.04 mit der Installation von Nginx.

Als Nächstes richten Sie eine .dockerignore-Datei ein, um alle Dateien aufzulisten, die sonst während des Docker-Build-Prozesses erstellt werden würden und die Sie vom endgültigen Build ausschließen möchten.

.dockerignore-Dateien spielen eine wichtige Rolle bei der Erstellung von kompakteren, schnellen laufenden Containern, indem sie eine Möglichkeit bieten, sensible oder unnötige Dateien und Verzeichnisse daran zu hindern, ihren Weg in Ihre Image-Builds zu finden.

Ihre .dockerignore-Datei sollte sich in dem Stammverzeichnis befinden, das als Build-Kontext bezeichnet wird und aus dem Sie Ihr Abbild erstellen möchten. Dies ist entweder Ihr aktuelles Arbeitsverzeichnis oder der Pfad, den Sie im Docker-Build-Befehl angeben, den wir weiter unten besprechen.

User-added image
Der Docker Build Kontext

Verwenden Sie nun den Befehl “Docker build”, um Ihr Docker-Image zu erstellen. Verwenden Sie das Flag -t, um einen Image-Namen und ein Tag festzulegen

$ docker build -t my-nginx:0.1 .

Im obigen Beispiel haben wir das Abbild aus demselben Verzeichnis wie die Dockerdatei und den Kontext erstellt, da das . Argument dem Docker-Dämon lediglich mitteilt, das Image aus den Dateien und Ordnern im aktuellen Arbeitsverzeichnis zu erstellen.

Schließlich können Sie, wie wir bei der interaktiven Methode gesehen haben, den Befehl “Docker images” verwenden, um das gerade erstellte Abbild zu sehen.

 

 $ docker images

REPOSITORY     TAG IMAGE ID        CREATED SIZE

my-nginx       0.1 f95ae2e1344b    10 seconds ago 138MB

ubuntu         18.04 ccc6e87d482b  12 days ago 64.2MB

Auch hier sollten Sie Ihr neues Bild in den Ergebnissen sehen.

5. Erfahren Sie mehr über Docker

User-added image

Docker-Image-Sicherheit: 6 Tipps, die man wissen muss  Link zum Artikel >

User-added image

Docker Hub und Docker Registries: Ein Leitfaden für Einsteiger Link zum Artikel >

null

Drei wesentliche Schritte zur Absicherung Ihrer Docker-Container-Einsätze Link zum Artikel >

null

 Wie Sie Ihre eigene private, remote und virtuelle Docker-Registry einrichten. Link zum Artikel >

6. Machen Sie bei der Docker Challenge mit >