Docker und die Softwareentwicklung
Die Softwareentwicklung hat sich in den vergangenen Jahren dramatisch weiterentwickelt und Docker hat dabei eine entscheidende Rolle gespielt. Während Docker oft „nur“ als Laufzeitumgebung für das eigentliche Softwareprodukt gesehen wird, bietet es auch erhebliche Vorteile für den Entwicklungsprozess. In diesem Artikel wird dieser Aspekt näher beschrieben.
Was ist Docker und wie funktioniert es?
Bevor wir uns in die Details vertiefen, betrachten wir die Technologie aus der Vogelperspektive, um einen Überblick zu erhalten. Docker ist eine Open-Source-Plattform, die es Teams ermöglicht, Anwendungen und deren Abhängigkeiten in sogenannten Containern zu verpacken. Ein Container ist dabei eine “virtuelle” Umgebung mit eigenem Lebenszyklus, die isoliert und leichtgewichtig ist, wodurch Anwendungen unabhängig von der zugrunde liegenden Infrastruktur konsistent ausgeführt werden können. Docker verwendet Images, die textuell in Dockerfiles beschrieben werden, als Vorlagen für diese Container. Diese Images sind austauschbar und können in verschiedenen Umgebungen als Container ausgeführt werden, solange die Plattform auf dem Hostsystem installiert ist. Daher ist ein resultierender Container auch für eine Entwicklungsumgebung perfekt geeignet. Die Anwendungen innerhalb des Containers sind in diesem Fall nicht unsere Produkte, sondern Tools wie Git, Java, Gradle oder verschiedene Compiler, die wir für unsere Softwareentwicklung oder die Qualitätssicherung benötigen. Docker spielt also in der modernen Softwareentwicklung eine zentrale Rolle, indem es eine einheitliche, containerisierte Entwicklungsumgebung inklusive aller benötigten Komponenten automatisiert bereitstellt. Schauen wir uns die Vorteile genauer an.
Einheitliche Build-Umgebung
Kennt ihr nicht auch diesen Spruch: „Bei mir funktioniert es, keine Ahnung warum es bei dir nicht funktioniert?“ evtl. gefolgt und begleitet durch Schuldzuweisungen? Oft liegt es daran, dass die Entwicklungsumgebung nicht einheitlich ist. Da durch Docker jedes Teammitglied eine containerisierte Umgebung nutzen kann, erreichen wir, dass der gesamte Entwicklungsprozess von der Codeerstellung über Debugging bis zum Testing auf einer konsistenten und identischen Plattform stattfindet. Dadurch werden potenzielle Probleme vermieden, die durch Unterschiede in den Entwicklungsumgebungen verursacht werden können. Selbst Continuous Integration Systeme wie Jenkins, Bamboo oder GitLab Runner oder sogar Partnerfirmen können dieselbe Umgebung nutzen, womit Teamwork auf einer ganz neuen Ebene funktioniert.
Container steigern die Reproduzierbarkeit
Durch die Verwendung von Containern kann das Team sicherstellen, dass jeder Build einer Anwendung genau gleich ist. Stellt euch vor, ein Kunde meldet einen Bug in einem 1+x Jahre alten Softwarestand. Klar können wir den Codestand dank Git reproduzieren, aber können wir auch die Buildumgebung von vor einem Jahr oder mehr reproduzieren? Mit dieser Technologie ist dies ganz leicht möglich, da wir entweder das Image dank eines versionierten Dockerfiles wieder herstellen können oder besser sogar das entsprechende Image in unserer Registry (z.B. Nexus, Artifactory oder DockerHub) zur Verfügung steht. So ist es möglich, auch ältere Softwarestände deterministisch zu bauen, zu testen und zu debuggen. Dank Containern ist es evtl. sogar möglich, die Analyse des vom Kunden gemeldeten Bugs direkt in der Produktionsumgebung des Kunden zu testen, da diese durch Docker leicht reproduzierbar ist
Bessere Team Performance
Dank Docker können Teams ihre Entwicklungsumgebungen in wenigen Minuten statt Stunden oder Tagen einrichten und auch passend zu Produkten oder Entwicklungsphasen wechseln. Anstatt komplexe Installations- und Konfigurationsschritte durchzuführen, können sie einfach das passende Docker-Image nutzen, um eine containerisierte Entwicklungsumgebung zu starten. Alle Tools und Abhängigkeiten sind direkt in einer standardisierten Umgebung vorhanden, wodurch die Entwicklung ohne große manuellen Aufwand direkt gestartet werden kann. Dies spart wertvolle Entwicklungszeit und erhöht die Produktivität.
Try & Error dank Isolierung
Wer spielt nicht gerne mit dem Code? Einfach mal Try & Error etwas ausprobieren, um erste Erkenntnisse zu gewinnen. Als Beispiel: Nehmen wir an, dass unser Produkt auf npm und Node.js basiert und wir mit dem Gedanken spielen, ein Major-Update zur neuesten Version zu machen. Das Update der Toolchain würden wir uns nie in unserer produktiven Entwicklungsumgebung trauen. Einfach mal die neuesten Versionen installieren und testen, mit dem Risiko, dass danach die komplette Entwicklungsumgebung kernsaniert werden muss? Eher nicht! Mit Docker ist dieses Szenario dank Isolierung kein Thema. Einfach die aktuellsten Versionen von npm und Node.js in einem Docker-Image installieren und schon kann man die Anwendung in einer isolierten Umgebung testen und bewerten, ohne die produktive Entwicklungsumgebung zu gefährden.
Qualitätssteigerung
Wie du dir vielleicht schon denken kannst, ist die Nutzung von Docker auch ein bedeutender Schritt hin zur Verbesserung der Softwarequalität und Qualitätssicherung. Denn Docker sorgt dafür, dass eine stabile und automatisch reproduzierbare Umgebung bereitgestellt werden kann. Nehmen wir an, dass unser Produkt in einer komplexen heterogenen Infrastruktur z.B. mit allen gängigen Datenbanken funktionieren soll. Resultierend müssen alle gängigen Datenbanken spätestens im Freigabeprozess berücksichtigt werden. Oft sehe ich bei Kunden hier ganze Fachabteilungen, die alle Permutationen der System Requirements wieder und wieder manuell durchspielen. In vielen Fällen ist ein solches Testsystem auch ein Flaschenhals, denn es ist nur einmal vorhanden und daher heiß umkämpft. So kann zwar Qualität sichergestellt werden, jedoch unflexibel, sequenziell und zu spät, denn aufgrund der aufwendigen Iterationen wird die Qualität oft nur einmalig im Freigabeprozess bewertet. Idealerweise ist eine solche Testinfrastruktur nicht der Flaschenhals und steht automatisierbar zur Entwicklungszeit dem Entwicklungsteam und einem Continuous Integration System zur Verfügung. Dadurch werden Inkonsistenzen und Probleme zeitnahe erkannt und können kostengünstig beseitigt werden. Docker ist ein Schlüsselelement in diesem Szenario, denn Datenbanken und Test-Datensätze können containerisiert zur Verfügung gestellt werden. Dies ist nur ein Beispiel und kann als Stellvertreter für viele weitere heterogene und komplexe Testumgebungen gesehen werden.
Freiheit deines Entwicklungsteams
Wer kennt die speziellen Wünsche nach Hardware und Software nicht. Ich möchte Windows nutzen, Mac nutzen oder Linux. Als Resultat erhalten wir, wenn wir den Wünschen folgen, eine heterogene Entwicklungslandschaft im Team. Klar kann dies in einer herkömmlichen Entwicklung zu Problemen führen, jedoch können diese Probleme dank Containerisierung minimiert werden. Denn ein Docker-Container kann auf jedem Betriebssystem ausgeführt werden, solange Docker selbst installiert ist. Somit kann eine einheitliche Entwicklungsumgebung trotz unterschiedlicher Hostsysteme gewährleistet werden. Das Team wird es dir danken, denn alle können mit ihrem Lieblingssystem arbeiten. Dies führt natürlich wieder zu gesteigerter Qualität und Teamleistung.
Fazit
Docker hat die Art und Weise, wie wir Software entwickeln, revolutioniert, indem es eine einheitliche Entwicklungsumgebung für Teams schafft. Durch die Verwendung von Docker-Containern können Teammitglieder sicherstellen, dass ihre Anwendungen in verschiedenen Umgebungen konsistent und zuverlässig funktionieren. Dies trägt dazu bei, Entwicklungszeit zu sparen, die Qualität der Software zu verbessern und die Zusammenarbeit im Team zu erleichtern. Wenn du bisher nicht mit Docker in deinem Entwicklungsprozess arbeitest, dann solltest du dies in Betracht ziehen, um von diesen Vorteilen zu profitieren und die Entwicklungseffizienz im Team zu steigern.
Gerne kannst du auf unserer Seite bleiben und mehr über unsere Schulungen, unser Konzept und unser Team erfahren. Wir freuen uns darauf, dich kennenzulernen!