Ein Docker-Image von Grund auf erstellen

Creating Docker Image From Scratch



Der Hauptvorteil von Docker gegenüber jeder anderen Containerisierungstechnologie besteht darin, dass Docker auf Entwickler und ihre Upstack-Anwendungen ausgerichtet ist. Während die richtigen Containerisierungstechnologien wie LXC , Zonen und Gefängnisse sind aus betrieblicher Sicht zielgerichtet, oder vereinfacht gesagt, diese Plattformen sind ein Ersatz für virtuelle Maschinen, die in der Cloud ausgeführt werden. Docker ist ein Ersatz für Pakete und ausführbare Binärdateien.

Grob gesagt wird Docker immer mehr zu einem universellen Paketmanager, der auf allen möglichen Linux-Plattformen funktioniert. Es nimmt Container und verwendet sie, um ein völlig anderes Problem zu lösen, mit dem Entwickler konfrontiert sind. Das Problem ist, dass Entwickler ihr Desktop-Betriebssystem (wie Windows, macOS oder Linux mit einer Menge Desktop-bezogener Pakete) verwenden, um Anwendungen zu schreiben. Die Anwendung, die sie schreiben, läuft oft auf einem völlig anderen Betriebssystem auf einem Server irgendwo mit einer Linux-Distribution, die sich ganz von der des Laptops des Entwicklers unterscheidet.







Bei Docker ist die Idee, dass Ihre Anwendung als Docker-Image verpackt wird. Es ist die Aufgabe von Docker, dieses Image zu übernehmen und als containerisierte Anwendung für Sie auszuführen. Containerisierung bedeutet, dass die Anwendung und ihre Abhängigkeiten in einer isolierten Umgebung ausgeführt werden, die sich möglicherweise vollständig vom Laptop des Entwicklers und sogar vom Produktionsserver unterscheidet. Solange beide Docker unterstützen, können beide dieselbe Anwendung auf genau die gleiche Weise ausführen.



Anatomie eines Docker-Images

Wie bereits erwähnt, wird eine Docker-App in einer vereinbarten Umgebung ausgeführt. Die Frage ist nun, wie schaffen wir diese Umgebung? Die meisten Anwendungsimages würden ein Docker-Basisimage importieren und ihre Anwendung darauf aufbauen.



Anwendungen werden aus Softwareschichten erstellt. Ein WordPress-Container-Image wird mit einem httpd-Container-Image erstellt, das wiederum auf einem Ubuntu-Image aufgebaut ist. Das Image, auf dem ein neueres Image erstellt wird, wird in der Docker-Terminologie als PARENT IMAGE bezeichnet. In Dockerfile (wir werden etwas später darauf eingehen, was ein Dockerfile bedeutet) wird dieses übergeordnete Image oben in der Datei erwähnt, wie unten gezeigt:





VON Ubuntu: 18.04
## Rest des Dockerfiles

Dieses Dockerfile wandelt Ihre Anwendung bei der Ausführung in ein Docker-Image (eine Art Binärdatei) um, das Sie dann in eine Registry verschieben können, von wo aus es gezogen werden kann, um an anderer Stelle neue Container zu erstellen. Sie alle haben jedoch Ubuntu:18.04 als Basis-Image und laufen, als ob es sich um ein Ubuntu-System handelt, in dem sie ausgeführt werden.

Sie haben dies vielleicht bemerkt, als Sie versucht haben, ein neues Docker-Image zu ziehen.



Docker-Image von Grund auf erstellen

Dies zeigt, wie viele Ebenen gezogen werden, bevor die eigentliche Anwendung (die möglicherweise nur wenige Megabyte groß ist) eingeführt wird.

Aus diesem Grund möchten wir ein sogenanntes Basis-Image erstellen. Was nicht auf etwas anderem aufgebaut ist. Das Schlüsselwort scratch wird verwendet, um anzuzeigen, dass diese Ebene nicht auf etwas anderem aufgebaut ist. Wie so:

Von Grund auf neu
## Rest des DCokerfiles

Wir werden zuerst eine einfache Hello-World-Anwendung erstellen und dann herausfinden, was der Rest des Dockerfiles sein wird. Das Hostsystem ist Ubuntu:18.04 LTS und wir verwenden Docker Version 17.12.1-ce für das Experiment.

Erstellen einer statischen Binärdatei

Docker-Container sind eine Sammlung von Prozessen, die vom Rest des Betriebssystems isoliert ausgeführt werden. Das einzige, womit der Prozess in Kontakt steht, ist der Kernel. Kernel ist verantwortlich für die Planung dieser Prozesse auf der CPU, die Speicherverwaltung und einige andere grundlegende Buchungsaufgaben.

Aber die meisten High-Level-Anwendungen hängen von vielen Systembibliotheken ab (wie glibc, musl, klibc usw. ) und viele Laufzeitabhängigkeiten wie Python oder Node.js oder Java Runtime. Die Anwendungsbinärdatei enthält nicht alle verfügbaren Bibliotheken, aber wenn sie mit der Ausführung beginnt, ruft sie diese Bibliotheken vom Host-Betriebssystem auf.

Da wir versuchen, ein Image von Grund auf neu zu erstellen, würden wir diese Feinheiten nicht bekommen. Daher muss unsere Anwendung eine statische Datei oder eine eigenständige ausführbare Datei sein.

Beginnen wir damit, einen Ordner namens MyDockerImage zu erstellen und darin eine Datei hello.cc zu erstellen.

$mkdirMeinDockerImage
$CDMeinDockerImage
$berührenhallo.cc

Öffnen Sie hello.cc mit Ihrem bevorzugten Texteditor und fügen Sie die folgenden Zeilen hinzu.

#enthalten
mit namespace std;
inthauptsächlich(){
Kosten<< 'Hallo! Diese Nachricht kommt aus einem Container ';
Rückkehr 0;

}

Dies ist ein einfaches C++-Programm, das Hello! Diese Nachricht …

Aus den oben besprochenen Gründen werden wir dies mit dem statischen Flag kompilieren. Der verwendete Compiler ist g++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

Um das Programm zu kompilieren, führen Sie im selben Verzeichnis den folgenden Befehl aus:

$ g++ -oh hallo-statischHallo.DC

Dadurch wird eine binäre ausführbare Datei hallo im selben Verzeichnis erstellt. Das ist unsere statische Datei. Testen Sie, ob es wie beabsichtigt läuft, indem Sie den Dateinamen im Terminal angeben.

$./Hallo

Jetzt sind wir bereit, dieses einfache Programm zu containerisieren.

Dockerfile

Das Dockerfile besteht aus einer Reihe von Regeln, die Ihre Anwendungsdateien (wie Binärdateien, Quelldateien usw.) zusammen mit verschiedenen Konfigurationsparametern wie Dateisystemlayout, exponierten Ports usw. in eine Docker-Image-Datei umwandeln. Sie können die Bilddatei dann für jeden freigeben, der diese Anwendung ausführen möchte.

Wir werden nicht jede für Dockerfile verfügbare Option untersuchen, sondern ein sehr minimalistisches Dockerfile schreiben. Erstellen Sie im selben Verzeichnis, in dem sich Ihre ausführbare hello-Datei befindet, eine leere Datei namens Docker-Datei.

$berührenDockerfile

Öffnen Sie es mit Ihrem bevorzugten Texteditor und schreiben Sie die folgenden Zeilen hinein:

Von Grund auf neu
Hallo HINZUFÜGEN/
CMD['/Hallo']

kratzen ist kein übergeordnetes Bild. Vielmehr zeigt es Docker an, dass das Image nicht auf einem anderen Image aufgebaut ist. Es ist von Grund auf neu gebaut. Der ADD-Befehl würde die statische Binärdatei mit dem Namen |_+_|aus dem aktuellen Verzeichnis nehmen und sie zum Stammverzeichnis der Bilddatei hinzufügen. Wenn wir endlich einen Container basierend auf diesem Image ausführen würden, wird die ausführbare hello-Datei im Root-Verzeichnis selbst unter |_+_| . angezeigt

Schließlich hat die CMD-Zeile eine Zeichenfolge /Hallo Diese Zeichenfolge wird als Shell-Befehl ausgeführt, wenn aus diesem Image ein Container erstellt wird, also die Binärdatei, die wir unserem Container hinzugefügt haben und die Nachricht ausgeben, die wir in unserer App geschrieben haben.

Lassen Sie uns das Bild erstellen, indem wir die aufrufen Docker-Build Befehl, der den Inhalt des Dockerfiles durchläuft und das Image generiert. Führen Sie den folgenden Befehl im selben Verzeichnis wie das Dockerfile und die ausführbare Binärdatei aus.

$Docker-Build--SchildHallo .

Die –Tag hallo Flag setzt den Bildnamen auf Hallo und der Punkt ( . ) am ende erzählt Docker-Build um im aktuellen Verzeichnis nach Dockerfile und verwandten Inhalten zu suchen.

Ausführen des Docker-Containers

Um zu überprüfen, ob das gerade erstellte Bild in der Liste der Bilder angezeigt wird, führen Sie Folgendes aus:

$Docker-Bilder

Beachten Sie, wie klein das Hallo-Bild im Vergleich zu anderen Bildern ist. In jedem Fall ist es bereit, als Container ausgeführt zu werden,

$docker run hallo

Das ist es! Sie haben Ihren ersten minimalistischen Container von Grund auf neu erstellt.

Andere Optionen

Während es immer eine Option ist, Images von Grund auf neu zu erstellen, neigen Leute oft dazu, Images von anderen leichten Linux-Distributionen zu erstellen. Zum Beispiel sind Bilder wie alpine und busybox wirklich leichtgewichtige Umgebungen mit kleineren Bibliotheken wie musl anstelle von glibc.

Verwenden Sie sie als Ihr übergeordnetes Bild, indem Sie verwenden VON alpin:neueste würde auch zu kleineren Bildern führen. Da die Basis-Images nur 2-5 MB groß sind. Lassen Sie uns wissen, ob es ein Docker-bezogenes Thema gibt, das wir als nächstes behandeln möchten. Sie erreichen uns unter Twitter , Facebook oder abonnieren Sie uns per E-Mail.