Entwickler arbeiten gerne mit Docker für seine Flexibilität und Benutzerfreundlichkeit. Beim Erstellen von Anwendungen lohnt es sich, die zusätzlichen Zeit zu investieren, um Docker -Bilder und Dockerfiles zu optimieren. Die Optimierung hilft den Teams, kleinere Bilder zu teilen, die Leistung zu verbessern und die Probleme zu erleichtern. Im Folgenden finden Sie einige Empfehlungen zum Erstellen besserer Bilder und Dockerfiles.
Optimierung von Docker -Bildern
Große Docker -Bilder können es schwierig machen, sie zu teilen. Auch große Bilder verlangsamen die Ausführung. Die Optimierung der Bilder kann also beim Gesamtentwicklungs- und -produktionsprozess helfen.
Die auf Docker Hub verfügbaren Bilder sind bereits optimiert. Anstatt Ihre eigenen zu erstellen, ist es eine gute Idee, die verfügbaren optimierten Bilder zu verwenden. Wenn Sie beispielsweise ein Redis -Bild benötigen, haben Sie die Möglichkeit, es auf einem Ubuntu -Bild zu erstellen oder die Redis direkt herunterzuladen. Die Verwendung des bereits erstellten Redis -Images ist eine bessere Option, da die Entwickler bereits redundante Pakete gekümmert haben.
Die neue mehrstufige Option in Docker (seit Version 17.05) können Ihnen helfen, clevere Möglichkeiten zur Optimierung Ihrer Bilder zu erstellen. Sie können eine Anwendung erstellen und dann in eine neue saubere Umgebung übertragen, um sie bereitzustellen. Es wird sicherstellen, dass nur die erforderlichen Laufzeitbibliotheken und Abhängigkeiten Teil des endgültigen Bildes sind.
Achten Sie beim Erstellen eines Bildes auf die von DockerFiles erstellten Ebenen. Jeder Laufbefehl erstellt eine neue Ebene. Das Kombinieren der Schichten kann die Bildgröße verringern. Ein einfaches Beispiel ist das Apt-Get. Im Allgemeinen führen Benutzer den Befehl wie diesen aus:
Führen Sie APT -Get -y -Update aus |
Führen Sie APT -Get Install -y Python aus |
Es wird zwei Schichten erstellen. Das Kombinieren der Befehle erzeugt jedoch eine einzige Ebene im endgültigen Bild:
Führen Sie APT -Get -y -Update && apt -Get Install -y Python aus |
Intelligente Kombinationen von Befehlen können also zu kleineren Bildern führen.
Docker speichert Bilder. Wenn Sie mehrere Instanzen derselben Ebenen benötigen, ist es eine gute Idee, die Optimierung der Ebenen und das Erstellen eines benutzerdefinierten Basisbildes zu betrachten. Es beschleunigt die Ladezeiten und erleichtert die Verfolgung.
Testbilder erfordern mehr Tools und Bibliotheken, um Funktionen zu testen. Es ist eine gute Idee, das Produktionsbild als Basis zu verwenden und Testbilder darüber zu erstellen. Die unnötigen Testdateien befinden sich außerhalb der Basis. Die Produktionsbilder bleiben also klein und sauber für den Einsatz.
Durch das Speichern von Anwendungsdaten im Container werden Ihre Bilder aufgeblendet. Verwenden Sie für Produktionsumgebungen immer die Volumenfunktion, um den Container von den Daten getrennt zu halten.
Best Practices zum Schreiben von Dockerfiles
Dockerfiles ermöglichen es Entwicklern, Prozesse zu kodifizieren. Es ist also ein großartiges Werkzeug, um den Aufbau des Docker -Bildes zu verbessern. Hier sind einige Praktiken, mit denen Sie Ihre Entwicklung verbessern können.
Versuchen Sie, Behälter zu entwerfen, die leicht zu erstellen und zu zerstören sind. Wenn Container zu peripheren Umgebungen und Konfigurationen zu abhängig sind, sind sie schwerer zu pflegen. Das Entwerfen von Behältern von Staatenlosen kann daher dazu beitragen, das System zu vereinfachen.
Wenn Sie ein kompliziertes Build haben, das rekursiv mehrere Verzeichnisse durchläuft, werden alle Dateien und Verzeichnisse an den Docker -Daemon gesendet. Es kann zu größeren Bildern und langsameren Build -Zeiten führen. Du kannst den ... benutzen .Dockerignore, um unnötige Dateien und Ordner auszuschließen, die den Erstellungsprozess komplizieren.
Mehrstufige Builds sind eine neue Docker-Funktion seit Version 17.05. Es ermöglicht Entwicklern, mehrere Bilder in derselben Dockerfile zu erstellen und Artefakte von einem Container in die Dockerfile selbst von einem Container zu bewegen. Sie können also kleinere und optimierte Artefakte in Ihrem endgültigen Bild haben, ohne komplizierte Skripte zu verwenden, um die gleichen Ergebnisse zu erzielen.
DockerFile sollte nur die bloßen Mindestpakete installieren, die für die Ausführung der Dienste erforderlich sind. Jedes Paket erfordert Platz im Bild. Einige Anwendungen wie Ping oder Texteditor können also im Kontext des Dienstes, der auf dem Container ausgeführt wird, nicht erforderlich sein. Wenn Sie die Anforderungen eines bestimmten Dienstes verstehen, können Sie bessere Dockerfiles schreiben, die optimierte Bilder erstellen können.
Das Entwerfen von Dockerfiles mit der Architektur von Microservices kann hilfreich sein. Es ist nicht immer möglich, einen Prozess pro Container bereitzustellen. Entwickler können sich jedoch überlegen, wie sie ihre Prozesse proaktiver verteilen und Entscheidungen treffen können. Behälter passen natürliche für modulares Design. Daher sollten Ihre Dockerfiles die Möglichkeiten nutzen, die Docker bietet.
Führen Sie dockerfiles nur aus, erstellen Sie neue Ebenen seit Version 1 aus, kopieren und fügen Sie nur aus.10. Andere Anweisungen beeinflussen nicht direkt die Größe der endgültigen Bilder. Sie sollten also wachsam sein, wenn sie diese Befehle verwenden. Das Kombinieren mehrerer Befehle kann die Anzahl der Schichten verringern. Weniger Schichten bedeuten kleinere Größen.
Wenn Sie ein multi-line-Argument haben, sortieren Sie die Argumente alphanumerisch, um die Wartung des Codes zu verbessern. Zufällige Argumente können zu Duplikationen führen. Sie sind auch schwerer zu aktualisieren. Ein gutes Beispiel:
Führen Sie APT-Get-Update && Apt-Get Install -y \ aus |
Apache2 \ |
Git \ |
Iputils-ping \ |
Python \ |
Wenn Sie von [ImageName]: Neueste verwenden, können Sie auf Probleme stoßen, wenn sich das Bild ändert. Es kann ein schwieriges Problem werden, nachzuspüren. Wenn Sie bestimmte Tags verwenden, können Sie sicherstellen, dass Sie das genaue Bild aus der Docker -Registrierung kennen.
Dockerfile -Befehle werden nacheinander ausgeführt, um Bilder zu erstellen, und es erstellt nur Ebenen, die noch nicht vorhanden sind. Angenommen, Sie haben ein Paket.JSON für NPM und Anforderungen.txt für pip. Sie können das folgende Dockerfile schreiben, bei dem Paket Paket ist.JSON und Anforderungen.txt befinden sich im MyCode -Ordner:
KOPIEREN ./mycode//home/programm/ |
Führen Sie die NPM -Installation aus |
PIP -Installationsanforderungen ausführen |
Jedes Mal, wenn sich die Dateien in MyCode ändern, müssen beide Befehle umgebaut werden. Stattdessen, wenn der Code folgendermaßen geschrieben ist:
KOPIEREN ./mycode/paket.JSON/Home/Programm/Paket.JSON |
WorkDir /Home /Programm |
Führen Sie die NPM -Installation aus |
KOPIEREN ./Mycode/Anforderungen.txt/home/programm/Anforderungen.txt |
WorkDir /Home /Programm |
PIP -Installationsanforderungen ausführen |
Anschließend sind die Befehle für die Ausführung unabhängig voneinander und ändert sich in einer einzelnen Datei im Ordner mycode nicht sowohl die NPM- als auch die PIP -Run -Befehle aus. Wenn Sie sich solche Abhängigkeiten ansehen, können Sie bessere Dockerfiles schreiben.
Die oben genannten Techniken und Best Practices sollten Ihnen helfen, kleinere Docker -Bilder zu erstellen und bessere Dockerfiles zu schreiben. Hier sind Links, mit denen Sie weitere Informationen zu verschiedenen Themen finden können:
https: // linuxHint.com/install- und usedocker-on-subuntu/