Erlernen Sie schnell die Verwendung von Docker zum Erstellen einer Entwicklungsumgebung

Erlernen Sie schnell die Verwendung von Docker zum Erstellen einer Entwicklungsumgebung

Da die Plattform weiter wächst, ist die Forschung und Entwicklung des Projekts immer abhängiger von verschiedenen externen Umgebungen für Entwickler geworden, insbesondere von grundlegenden Diensten. Diese Phänomene führen häufig dazu, dass Entwickler der Einfachheit halber direkt öffentliche Basiskomponenten für die kollaborative Entwicklung verwenden. Bei paralleler Entwicklung, insbesondere bei Änderungen an der Datenbank oder den Daten, verbringen andere Entwickler häufig unnötig Zeit mit der Fehlerbehebung, was die Gesamteffizienz der Entwicklung verringert und große Hindernisse für die Remoteunterstützung schafft. Um die oben genannten Probleme zu lösen, wird die Docker Compose-Technologie verwendet, um Entwickler beim Erstellen der Entwicklungsumgebung zu unterstützen. Letztlich können Entwickler den Aufbau der gesamten Entwicklungsumgebung abschließen, solange sie Docker installiert haben.

Etwas zu wissen und es zu erreichen, sind zwei völlig verschiedene Dinge. Seit dem Tag der Geburt von Docker haben wir von Dingen wie „Ein Projekt in 15 Sekunden bereitstellen“, „versionskontrollierte Entwicklungsumgebung“ und trendigen Betriebs- und Wartungsbegriffen wie „fortlaufende Entwicklung“ und „softwaredefinierte Architektur“ geträumt. Branchenexperten an der Spitze dieser Welle beteiligen sich mit beispiellosem Enthusiasmus an dem Trend, viele Begriffe und Tools wie „Orchestrierung“ und „Service Discovery“ zu definieren, neu zu definieren und zu kommerzialisieren.

Ich denke, der Katalysator für diesen Trend ist die schöne Schnittstelle und Abstraktion, die Docker zwischen Anwendungen und Infrastruktur schafft. Entwickler können über die Infrastruktur sprechen, ohne die zugrunde liegende Architektur kennen zu müssen, und das Betriebspersonal muss nicht viel Zeit darauf verwenden, herauszufinden, wie Software installiert und verwaltet wird. Hinter der scheinbar schlichten Erscheinung muss eine Kraft verborgen sein, die das Leben aller Menschen vereinfacht und effizienter macht.

Die reale Welt ist grausam. Gehen Sie nicht davon aus, dass die Einführung einer neuen Technologie Ihnen nur Freude bringt. Ich habe in den letzten Jahren bei der Arbeit an zahlreichen Projekten einige merkwürdige Umstände erlebt und ich glaube, Docker bildet hier keine Ausnahme. Allerdings lassen sich gewisse Erfahrungen meist direkt im nächsten Projektabschnitt umsetzen. Um Docker-Kenntnisse zu erlangen, müssen Sie sich in echte Projekte vertiefen, um Ihre Fähigkeiten zu verfeinern.

Im letzten Jahr habe ich mich darauf konzentriert, mein Buch über Docker-Grundlagen, Docker in Action, zu unterrichten.

Mir ist aufgefallen, dass fast jeder, der anfängt, sich mit der Docker-Technologie zu befassen, damit kämpft, eine Entwicklungsumgebung zu erstellen, bevor er die Beziehungen zwischen den einzelnen Mitgliedern des Ökosystems verstehen kann. Jeder denkt zunächst, dass die Verwendung von Docker die Einrichtung der Umgebung erleichtert, was nicht ganz falsch ist. Es gibt viele Tutorials zur „Containerisierung“, in denen das Erstellen eines Images und das Verpacken eines Tools in einen Container behandelt werden. Wie man die Entwicklungsumgebung jedoch dockerisiert, ist eine völlig andere Sache.

Als Pionier kann ich meine Erfahrungen weitergeben.

Früher war ich ein erfahrener Java-Benutzer, aber die Erfahrungen, die ich geteilt habe, beziehen sich nicht auf Java, sondern auf meine Anwendungsentwicklung mit Go und Node. Ich habe einige Erfahrung in der Go-Entwicklung und arbeite aktiv daran, meine Fähigkeiten in diesem Bereich zu verbessern. Das Hauptproblem bei einem schnellen Einstieg in ein unbekanntes Gebiet besteht darin, den richtigen Arbeitsablauf zu finden. Außerdem hasse ich es, ständig Software auf meinem Laptop zu installieren. Deshalb versuche ich, für diese Aufgaben Docker oder manchmal Vagrant zu verwenden.

Bei dem Projekt, an dem ich beteiligt bin, geht es darum, einen Standard-REST-Dienst in Go zu schreiben, der auf Gin basiert und auf bestimmten Bibliotheken und Diensten von Redis und NSQ basiert. Das bedeutet, dass ich einige Bibliotheken der lokal laufenden Redis- und NSQ-Instanzen importieren muss. Interessanter ist, dass ich auch einige statische Ressourcen verwende, die von NGINX bereitgestellt werden.

Für die Uneingeweihten: Go ist eine Programmiersprache, die tatsächlich ein Befehlszeilentool namens „go“ hat. Es wird für alles verwendet, von der Abhängigkeitsverwaltung über die Kompilierung bis hin zu Testfällen und vielen anderen Aufgaben. Für Go-Projekte bleibt neben Git und einem guten Editor nur noch die Auseinandersetzung damit. Es gibt jedoch immer noch ein Problem. Ich möchte Go nicht auf meinem Laptop installieren. Ich möchte nur Git und Docker auf meinem Laptop installieren. Diese Probleme begrenzen die Kompatibilität mit anderen Umgebungen und senken die Einstiegshürde für Neueinsteiger.

Dieses Projekt weist Laufzeitabhängigkeiten auf, was bedeutet, dass das Toolset Docker Compose für eine einfache Umgebungsdefinition und Orchestrierung enthalten muss. Viele Menschen fühlen sich dabei unwohl. Was sollen wir also tun? Mit der Erstellung einer Docker-Datei oder docker-compose.yml beginnen? Lassen Sie mich Ihnen zunächst erzählen, wie ich es gemacht habe, und dann erklären, warum ich es getan habe.

Im Fall von www.sangpi.com möchte ich beispielsweise, dass meine lokalen Pakete vollautomatisch sind. Ich möchte die Schritte nicht manuell ausführen und meine Vim-Konfigurationsdatei ist ziemlich einfach. Ich möchte die Laufzeitumgebung lediglich auf der Ebene „Ausführen oder Nichtausführen“ steuern. Lokalisierte Ziele der Entwicklungsumgebung werden nicht nur aus Produktivitätsgründen schnell repliziert, sondern auch zum Teilen von Docker-Images. Ich habe endlich die Docker-Datei fertiggestellt, die Images erstellt, die Go, Node und mein am häufigsten verwendetes Verpackungstool Gulp enthalten. Dieses Dockerfile hat keinen eingebetteten Code und das Image hat kein eingebettetes Gulpfile. Stattdessen wird ein Volume auf einem etablierten GOPATH (der Stammadresse des Go-Arbeitsbereichs) definiert.

Schließlich habe ich einen Einstiegspunkt für Gulp eingerichtet, um diese Bilder bereitzustellen, und den Standardbefehl zum Überwachen festgelegt. Die Ausgabebilder sind definitiv nicht das, was ich ein Build-Artefakt nenne. In diesem Sinne stellt diese Umgebung lediglich eine laufende Instanz bereit, mit deren Hilfe wir feststellen können, ob der Code ausgeführt wird. In meinem Szenario funktioniert es großartig. Ich werde „Artefakte“ verwenden, um mich auf einen anderen Build zu beziehen.

Als nächstes definiere ich mit Compose eine lokale Entwicklungsumgebung. Definieren Sie zunächst alle im Docker Hub definierten abhängigen Dienste, die in den Images verwendet werden, und verbinden Sie sie mit einem „Ziel“-Dienst. Dieser Dienst verweist darauf, wo die neue Docker-Datei generiert wurde, hängt das lokale Quellverzeichnis per Bind-Mount an den Einhängepunkt ein, an dem die Ausgabe des neuen Images erwartet wird, und stellt einige Ports bereit, die getestet werden können. Anschließend wurde ein Dienst hinzugefügt, der eine Reihe von Integrationstests mit dem Zieldienst kontinuierlich durchläuft. Schließlich habe ich einen NGINX-Dienst hinzugefügt und ein Volume mit vielen Konfigurationsdateien und statischen Assets gemountet. Der Vorteil der Verwendung von Volumes besteht darin, dass Sie Konfigurationsdateien und Assets wiederverwenden können, ohne das Image neu erstellen zu müssen.

Der gesamte Code generiert schließlich eine lokale Entwicklungsumgebung auf Ihrem Computer. Bei Verwendung von:

docker-compose up –d

, git clone wird gestartet und läuft dann in einer Schleife; es ist nicht nötig, das Image neu zu erstellen oder den Container neu zu starten. Jedes Mal, wenn sich eine .go-Datei ändert, erstellt Gulp meinen Dienst im laufenden Container neu und startet ihn neu. So einfach ist das.

Ist es einfach, diese Umgebung zu erstellen? Nicht wirklich, aber es ist passiert. Wäre es nicht einfacher, keinen Container zu verwenden, sondern Go, Node und Gulp lokal zu installieren? Vielleicht in diesem Szenario, aber es ist darauf beschränkt, diesen abhängigen Dienst mit Docker auszuführen. Das gefällt mir nicht.

Früher musste ich verschiedene Versionen dieser Tools verwalten, was dazu führte, dass überall komplexe Umgebungsvariablen und Artefakte generiert wurden. Da es keine zentrale Versionskontrolle gab, musste ich meine Kollegen an diese konfliktanfälligen Umgebungsvariablen erinnern.

Vielleicht gefällt Ihnen die oben beschriebene Umgebung nicht oder Sie haben andere Anforderungen für Ihr Projekt. Nun, das stimmt. In diesem Artikel geht es nicht darum, alle Tools in Docker auszuführen. Wenn das der Fall wäre, würde das bedeuten, dass wir nicht berücksichtigt haben, welches Problem wir zu lösen versuchen.

Als ich diese Umgebung entworfen habe, habe ich die folgenden Fragen, Bedenken und einige mögliche Antworten berücksichtigt. Wenn Sie mit der Arbeit mit Docker beginnen, stellen Sie möglicherweise fest, dass die tatsächliche Situation schlimmer ist als Ihre Antwort.

Wenn Sie an Verpackung und Umwelt denken, was fällt Ihnen als Erstes ein?

Dies ist tatsächlich die wichtigste Frage. In diesem Szenario gibt es mehrere Optionen. Ich kann mit Go direkt im Container programmieren, was folgendermaßen aussieht:

Tatsächlich kann der Großteil der Bolierplate in diesem Beispiel durch Shell-Aliase oder Funktionen ausgeblendet werden, sodass es sich anfühlt, als wäre Go auf einem eigenen Gerät installiert. Es kann auch mit dem Go-Workflow verbunden werden, um Artefakte zu erstellen. Diese Funktionen sind für Nicht-Server-Projekte von Vorteil, aber nicht unbedingt für Bibliotheks- und Softwareprojekte.

Vorausgesetzt, Sie verwenden bereits Gulp, Make, Ant oder andere Skripte, können Sie Docker als Ziel für diese Tools verwenden.

Alternativ kann ich mehr Docker-orientierte Erfahrung sammeln, indem ich Dockerbuild zum Definieren und Steuern meiner Builds verwende. Der Code lautet wie folgt:

Die Verwendung von Docker zur Steuerung Ihres Builds hat mehrere Vorteile. Sie können zuvor kompilierte Images verwenden, und Dockerfilebuilds nutzen einen Caching-Ansatz, sodass die Kompilierungsarbeit nur minimale Schritte wiederholt (vorausgesetzt, Sie haben ein großartiges Dockerfile). Schließlich können die von diesen Builds generierten Bilder auch mit anderen Entwicklern geteilt werden.

In diesem Fall verwende ich onbuildimage aus dem Golang-Repository als Basis. Dies beinhaltet eine coole Logik zum Herunterladen von Abhängigkeiten. Diese Methode generiert ein Docker-Image, das problemlos in anderen Nicht-Produktionsumgebungen verwendet werden kann. Das Problem bei diesem Ansatz für Bilder auf Produktionsebene besteht darin, dass Schritte unternommen werden müssen, um große Bilder zu vermeiden und einige Init-Skripte einzubinden, um den Status zu überprüfen, bevor der Dienst gestartet und überwacht wird.

Interessanterweise verwendet Docker eine Reihe von Skripten, Makefiles und Dockerfiles. Das Build-System ist relativ robust und ist für verschiedene Spieletests, Linting usw. sowie Artefakte verschiedener Betriebssysteme und Architekturen verantwortlich. In diesem Szenario ist der Container ein Tool zum Generieren von Binärdateien, das jedoch aus einem lokalen Build-Image implementiert wird.

Um die Optionen des Docker-Builds zu erweitern, können Sie Compose verwenden, um eine vollständige Entwicklungsumgebung zu definieren.

Compose ist für das Umgebungsmanagement verantwortlich. Es überrascht nicht, dass das System sehr sauber ist. Compose verknüpft alles miteinander, optimiert die Datenträgerverwaltung, erstellt automatisch Images, wenn sie fehlen, und aggregiert die Protokollausgabe. Ich habe diese Schalter ausgewählt, um die Dienstabhängigkeiten zu vereinfachen und weil sie die Artefakte generieren, die ich brauche.

Bei diesem Beispiel handelt es sich um einen Runtime-Container, Compose oder Docker verfügen hierfür über entsprechende Werkzeuge. In diesem Szenario benötigen Sie möglicherweise ein verteiltes Image oder möchten, dass der Build eine Binärdatei für Ihren lokalen Computer erstellt.

Wenn Sie das gewünschte Image erhalten möchten, müssen Sie sicherstellen, dass der Quellcode oder die vorkompilierte Bibliothek während des Builds in das Image eingebettet wird. Während des Buildvorgangs wird das Volume nicht gemountet, was bedeutet, dass das Image bei jeder Wiederholung neu erstellt werden muss.

Wenn Sie bestimmte Artefakte innerhalb des Containers generieren möchten, müssen Sie ein gemountetes Volume einführen. Dies lässt sich mithilfe der Docker-Befehlszeile oder einer Compose-Umgebung ganz einfach durchführen. Beachten Sie jedoch, dass der Build nur funktioniert, wenn der Container ausgeführt wird. Dies bedeutet, dass Sie nicht einfach Docker Build verwenden können.

Zusammenfassung

Derzeit gibt es keine Docker-Möglichkeit, eine Entwicklungsumgebung zu erstellen. Docker ist ein Orchestrierungstool, nicht nur ein heiliges Buch. Anstatt das vorhandene Dockerbuild-System einer anderen Person zu verwenden, sollten Sie sich lieber etwas Zeit nehmen, um dieses Tool kennenzulernen, Ihre Anforderungen zu klären und dann eine für Sie geeignete Docker-Umgebung zu erstellen.

Dies ist das Ende dieses Artikels darüber, wie Sie die Verwendung von Docker zum Erstellen einer Entwicklungsumgebung schnell beherrschen. Weitere relevante Inhalte zum Erstellen einer Entwicklungsumgebung mit Docker finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • PyCharm verwendet Docker-Images zum Erstellen einer Python-Entwicklungsumgebung
  • Docker erstellt Ihre eigene PHP-Entwicklungsumgebung
  • Verwenden Sie Docker-Compose, um eine AspNetCore-Entwicklungsumgebung zu erstellen
  • So erstellen Sie schnell eine Oracle-Entwicklungsumgebung mit Docker
  • Detaillierte Erklärung zum Einrichten der Docker-Entwicklungsumgebung unter MAC OSX
  • Ubuntu erstellt eine auf Docker basierende LNMP + Redis-Entwicklungsumgebung (Bild und Text)
  • Ein ausführliches Tutorial zum Erstellen einer PHP-Entwicklungsumgebung basierend auf Docker

<<:  Mehrere beliebte Website-Navigationsrichtungen in der Zukunft

>>:  Einfacher Vergleich von Meta-Tags in HTML

Artikel empfehlen

DIV-Hintergrund, halbtransparenter Text, nicht durchscheinender Stil

Der DIV-Hintergrund ist halbtransparent, aber die ...

Erläuterung des MySQL-Nicht-Null-Einschränkungsfalls

Inhaltsverzeichnis Legen Sie beim Erstellen einer...

So finden Sie langsame SQL-Anweisungen in MySQL

Wie finde ich langsame SQL-Anweisungen in MySQL? ...

Einfaches Beispiel für die Definition und Verwendung von MySQL-Triggern

Dieser Artikel beschreibt die Definition und Verw...

Detaillierte Erklärung zur SQL-Injection - Sicherheit (Teil 2)

Sollte dieser Artikel Fehler enthalten oder du An...

Beispielcode zur Implementierung der Alipay-Sandbox-Zahlung mit Vue+SpringBoot

Laden Sie zunächst eine Reihe von Dingen aus der ...

JavaScript zum Erzielen eines Taobao-Produktbild-Umschalteffekts

JavaScript-Umschalteffekt für Bekleidungsalben (ä...

Über IE8-Kompatibilität: Erklärung des X-UA-Compatible-Attributs

Problembeschreibung: Code kopieren Der Code laute...

Gemeinsame Nutzung von zwei Plug-Ins zur Übersetzung von Webseiten

Übersetzen Sie diese URL: http://translateth.is G...

Lösung für zu große Mysql-Binlog-Protokolldateien

Inhaltsverzeichnis 1. Verwandte Binlog-Konfigurat...

So implementieren Sie die Kommunikation zwischen Docker-Containern

Szenario: Eine Laradock-Entwicklungsumgebung (php...