Erstellen eines Docker -Bildes von Grund auf neu

Erstellen eines Docker -Bildes von Grund auf neu
Der Hauptvorteil von Docker gegenüber jeder anderen Containerisierungstechnologie besteht darin. Während die richtigen Containerisierungstechnologien wie LXC, Zonen und Gefängnis. Wo AS, Docker ist ein Ersatz für Pakete und ausführbare Binärdateien.

Docker ist locker gesagt, dass Docker immer mehr zu einem universellen Paketmanager wird, der auf allen möglichen Linux -Plattformen funktioniert. Es dauert 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 Tonne Desktop -bezogenen Pakete) verwenden, um Anwendungen zu schreiben. Die Anwendung, die sie schreiben, wird häufig auf einem völlig anderen Betriebssystem auf einem Server ausgeführt, mit einer Linux -Verteilung, die sich völlig anders als die des Entwicklerlaptops hat.

Mit Docker ist die Idee, dass Ihre Bewerbung als Docker -Bild gepackt wird. Es ist die Aufgabe von Docker, dieses Bild aufzunehmen und es als Container -Anwendung für Sie auszuführen. Containerisierte bedeutet, dass die Anwendung und ihre Abhängigkeiten in einer isolierten Umgebung ausgeführt werden, die sich vollständig vom Laptop des Entwicklers und sogar vom Produktionsserver unterscheiden kann. Solange beide Docker unterstützen, können beide genau die gleiche Anwendung auf die gleiche Weise ausführen.

Anatomie eines Dockerbildes

Wie bereits erwähnt, wird eine Docker -App auf einer vereinbarten Umgebung ausgeführt. Nun ist die Frage, wie wir diese Umgebung schaffen? Die meisten Anwendungsbilder würden ein Docker -Basisbild importieren und ihre Anwendung darüber erstellen.

Anwendungen werden aus Softwareschichten gestellt. Ein WordPress -Containerbild wird unter Verwendung eines HTTPD -Containerbildes erstellt, das wiederum auf einem Ubuntu -Bild erstellt wurde. Das Bild, auf dem ein neueres Bild erstellt wird, wird als übergeordnetes Bild in der Docker -Terminologie bezeichnet. In DockerFile (wir werden etwas später für eine Dockerfile erreichen) wird dieses übergeordnete Bild oben in der Datei wie unten gezeigt erwähnt:

Von Ubuntu: 18.04
## Rest der Dockerfile

Diese Dockerfile, wenn ausgeführt wird, wandelt Ihre Bewerbung in ein Docker -Bild (eine binäre Art) um. Sie werden jedoch alle Ubuntu haben: 18.04 als Basisbild und laufen, als wäre es ein Ubuntu -System, in dem sie laufen.

Sie haben dies vielleicht bemerkt, wenn Sie versuchen, ein neues Docker -Bild zu ziehen.

Dadurch wird zeigt.

Aus diesem Grund möchten wir das so genannte Basisbild erstellen. Das ist auf nichts anderem gebaut. Das Schlüsselwort „Scratch“ wird verwendet, um anzuzeigen, dass diese Ebene auf nichts anderem aufgebaut ist. Like SO:

Von Grund auf neu
## Rest der DCOKERFILE

Wir werden zuerst eine einfache Antrag auf Hallo-Welt erstellen und dann herausfinden, was der Rest der Dockerfile 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äranlage

Docker -Container sind eine Sammlung von Prozessen, die aus dem Rest des Betriebssystems isoliert werden. Das einzige, mit dem dieser Prozess in Kontakt ist, ist der Kernel. Kernel ist dafür verantwortlich, diese Prozesse auf der CPU zu planen, Speicherverwaltung und einige andere grundlegende Buchung aufzubewahren.

Aber die meisten Anwendungen auf hoher Ebene hängen von vielen Systembibliotheken ab (wie wie Glibc, Musl, KLIBC usw) und viele Laufzeitabhängigkeiten wie Python oder Knoten.JS- oder Java -Laufzeit. Die Anwendung Binary hat nicht alle Bibliotheken darin, aber wenn sie mit der Ausführung beginnt, ruft sie diese Bibliotheken aus dem Host -Betriebssystem auf.

Weil wir versuchen, ein Bild von Grund auf neu zu erstellen, würden wir diese Feinheiten nicht bekommen. Unsere Anwendung muss also eine statische Datei oder eine eigenständige ausführbare Datei sein.

Beginnen wir zunächst einen Ordner namens MyDockerimage erstellen und eine Datei Hallo erstellen.CC darin.

$ mkdir mydockerimage
$ cd mydockerimage
$ touch Hallo.CC

Öffne Hallo.CC mit Ihrem bevorzugten Texteditor und fügen Sie die folgenden Zeilen hinzu.

#enthalten
Verwenden von Namespace STD;
int main ()
Cout << "Hello! This message is coming from a container \n ";
Rückkehr 0;

Dies ist ein einfaches C ++ - Programm, das „Hallo ausdruckt! Diese Nachricht… "

Aus zuvor besprochenen Gründen werden wir dies mit der statischen Flagge zusammenstellen. 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 ++ -o Hallo -static Hallo.CC

Dadurch wird eine binäre ausführbare Datei „Hallo“ im selben Verzeichnis erstellt. Das ist unsere statische Datei. Testen Sie, ob es wie beabsichtigt wird, indem der Dateiname im Terminal erwähnt wird.

$ ./Hallo

Jetzt sind wir bereit, dieses einfache Programm zu containieren.

Dockerfile

Die DockerFile besteht aus einer Reihe von Regeln, die Ihre Anwendungsdateien (wie Binärdateien, Quelldateien usw.) zusammen mit verschiedenen Konfigurationsparametern wie Dateisystemlayout, exponierten Ports usw. aufnehmen und sie in eine Docker -Bilddatei verwandeln. Sie können dann die Bilddatei mit jedem freigeben, der diese Anwendung ausführen möchte.

Wir werden nicht jede Option für Dockerfile ausgraben, stattdessen werden wir eine sehr minimalistische Dockerfile schreiben. Erstellen Sie im selben Verzeichnis, in dem sich Ihre Hallo ausführbare Datei befindet, eine leere Datei mit dem Namen Dockerfile.

$ touch dockerfile

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

Von Grund auf neu
Hallo / hinzufügen /
CMD ["/Hallo"]

kratzen ist kein übergeordnetes Bild. Vielmehr zeigt Docker an, dass das Bild nicht auf einem anderen Bild aufgebaut ist. Es ist von Grund auf neu gebaut. Der Befehl add würde den statischen Binärer namens nehmen HalloAus dem aktuellen Verzeichnis und fügen Sie es dem Stammverzeichnis der Bilddatei hinzu. Wenn wir endlich einen Container basierend auf diesem Bild ausführen, wird die Hallo ausführbare Datei im Root -Verzeichnis selbst bei sehen /Hallo.

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

Erstellen wir das Bild, indem wir die anrufen Docker Build Befehl, der den Inhalt der Dockerfile durchläuft und das Bild generieren würde. Führen Sie den folgenden Befehl im selben Verzeichnis wie die Dockerfile und die ausführbare Binärin aus.

$ docker Build -Tag Hallo .

Der -Tag Hallo Flag legt den Bildnamen auf Hallo und der Punkt ( “.”)) am Ende erzählt Docker Build Um das aktuelle Verzeichnis für Dockerfile und verwandte Inhalte zu untersuchen.

Ausführen des Docker -Containers

Um zu überprüfen, ob das Bild, das wir gerade erstellt haben, in der Liste der Bilder angezeigt werden, rennen Sie:

$ Docker Bilder

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

$ docker rennen Hallo

Das ist es! Sie haben Ihren ersten minimalistischen Behälter von Grund auf neu erstellt.

Andere Optionen

Während das Erstellen von Bildern von Grund auf immer eine Option ist, neigen die Menschen häufig dazu, Bilder aus anderen leichten Linux -Distribos zu erstellen. Zum Beispiel sind Bilder wie Alpine und Busybox wirklich leichte Umgebungen mit kleineren Bibliotheken wie Musl anstelle von GLIBC.

Verwenden Sie sie als übergeordnetes Bild mit Verwendung "Von Alpine: Neueste" würde auch zu kleineren Bildern führen. Da die Basisbilder nur 2-5 MB groß sind. Lassen Sie uns wissen, ob es ein Docker -bezogenes Thema gibt, das Sie möglicherweise als nächstes behandeln möchten. Sie können uns auf Twitter, Facebook erreichen oder uns per E -Mail abonnieren.