Als Entwickler kennst du die Herausforderungen, die mit der Einrichtung und Verwaltung deiner Entwicklungsumgebung einhergehen. Die Lösung für dieses Problem könnte in Docker liegen - einer mächtigen Containerisierungstechnologie, die deine Entwicklungsprozesse vereinfachen und beschleunigen kann.
In diesem Blogbeitrag werden wir uns damit beschäftigen, wie du Docker richtig einsetzen kannst.
Inhalt:
- Was ist Docker und wie funktioniert es?
- Vorteile von Docker in der Entwicklungsumgebung.
- Schritt-für-Schritt-Anleitung zur Einrichtung
- Best Practices und Tipps für den effizienten Einsatz von Docker.
- Sicherheit und Datenschutz in Docker-Containern.
- Beispiel für Freelancer: 2x so schnell Projekte aufsetzen
- Fazit: Warum Docker ein Muss für moderne Freelancer ist.
Was ist Docker und wie funktioniert es?
Docker ist eine Open-Source-Plattform, die es dir ermöglicht, Anwendungen in isolierten Containern zu verpacken und auszuführen.
Und jetzt noch mal in verständlich: Docker kann kleine virtuelle Maschinen starten die unabhängig von deinem Betriebssystem laufen. Du möchtest deine Software auf Linux testen? Kein Problem: Starte einfach einen Ubuntu Container und los geht's.
Du möchtest eine MySQL Datenbank erstellen? Anstatt es lokal zu installieren, kannst du den MySQL Container starten und hast alle Funktionen in einem abgeschlossenen System.
Zu dem Container Begriff: Ein Container ist eine abgeschlossene Einheit, die alles enthält, was deine Anwendung benötigt, um reibungslos zu laufen - von Code über Laufzeitumgebung bis hin zu Systemtools.
Dahinter steckt das das Konzept von Virtualisierung, wodurch mehrere Container auf demselben Host unabhängig voneinander ausgeführt werden können.
Hier nochmal kurz die wichtigsten Begriffe
- Container: Ein kleines abgeschlossenes System, was speziell für deine Anwendung angepasst werden kann.
- Image: Ein Image ist ein vorgefertigter Container, der von Docker Hub heruntergeladen werden kann. Hier sucht man sich oft eine Basis aus, also z.B. Ubuntu, Nginx, MySQL, etc. und baut darauf auf.
- Volumes: Da der Container ja ein abgeschlossenes System ist muss man die Dateien vom eigenen PC mit einem Volume verbinden. Das ist also ein virtuelles Laufwerk wodurch Dateien zwischen Host und Container geteilt werden können.
- Environment: In Docker werden viele Informationen mit Environment Variablen an den Container übergeben. Also z.B. was das Datenbank Passwort und User sein soll für den MySQL Container.
Vorteile von Docker in der Entwicklungsumgebung
Ich muss zugeben: Die ersten Jahre als Entwickler war ich komplett gegen Docker. Warum soll man sich so viel Mühe geben, nur damit meine Software in irgend einem Container läuft? Es läuft doch auch einfach so auf meinem System.
Doch wenn man einmal die Vorteile gesehen hat, will man nicht mehr zurück.
Also vielleicht kann ich dich ja auch mit den Argumenten hier überzeugen:
- Portabilität
Mit Docker kannst du deine Software auf jedem System replizieren, auf dem Docker läuft.
Das bedeutet, dass du deine Anwendung auf deinem Laptop entwickeln und später nahtlos auf einem Server oder in der Cloud bereitstellen kannst.
Das ist wirklich ein riesen Vorteil, denn alle Versionskonflikte sind damit aufgelöst. Überall laufen die gleichen Versionen auf der gleichen Code Basis.
Und nicht nur von lokal zu produktiv ist das wichtig. Auch im Team ist es so viel einfach er wenn alle die exakt(!) gleiche Basis haben. Was gibt es denn nervigeres als ein Bug, weil dein Kollege Node.js v16 und du v18 benutzt? - Isolation
Container sind voneinander isoliert, sodass Änderungen in einem Container keine Auswirkungen auf andere Container haben. Das verhindert Konflikte zwischen verschiedenen Projekten und vereinfacht die Verwaltung.
Wenn du z.B. in deiner lokalen Python Installation ein Update auf Python 3.10 machst gilt das für alle deine Projekte (natürlich gibt es hier auch die Möglichkeit von virtuellen Environments). Und wenn eines davon nicht kompatibel ist, passiert es sehr schnell, dass dein ganzer Code nicht mehr läuft.
Mit Docker wäre das einfach: Du installierst einen Container mit Python 3.9, einen anderen mit 3.10 und wieder einen anderen vielleicht sogar mit Python 2 (das war nur ein Beispiel - bitte hört auch Python 2 zu nutzen). - Schnelleres Setup und Deployment
Durch das Containerformat kannst du deine Anwendung und deren Abhängigkeiten in einem einzigen Schritt starten, ohne komplexe Installation. Dadurch wird das Setup und Deployment von Projekten erheblich beschleunigt.
Stell dir vor du brauchst lokal ein Testsystem für einen Server der mit Nginx läuft. Du müsstest einen Server wie Xammp installieren und alle Config Einstellungen anpassen damit die Website dargestellt wird.
Dazu der Vergleich zu Docker:docker run --name nginx-server -p 8080:80 -v /path/to_your_content:/usr/share/nginx/html:ro -d nginx
Fertig. - Skalierbarkeit
Es ist ganz einfach möglich, deine Anwendung schnell zu skalieren, wenn sie mehr Ressourcen benötigt. Dies ist besonders hilfreich, wenn du an Projekten arbeitest, die hohe Lasten bewältigen müssen.
Docker hat mit Swarm eine integrierte Lastenverteilung. D.h. die Anwendung wird dupliziert und auf mehrere Server verteilt.
Schritt-für-Schritt-Anleitung zur Verwendung von Docker in der Entwicklung
Docker lässt sich einfach installieren. Auf der Website findest du den Download Link für dein Betriebssystem.
Hier eine Anleitung mit dem Beispiel einen nginx Servers:
- Installation: Lade Docker für dein Betriebssystem herunter und installiere es. Docker ist für Windows, macOS und Linux verfügbar, daher kannst du es problemlos auf deinem bevorzugten Entwicklungsrechner verwenden.
- Docker Image suchen: Suche nach einem passenden Docker-Image für deine Anwendung. Docker Hub hat für alle Anwendungen offizielle und von der Community bereitgestellte Images. Du findest dort Images für verschiedene Programmiersprachen, Frameworks und Tools.
In unserem Fall verwenden wir nginx. Unter "How to use this image" gibt es eine detaillierte Beschreibung wie man dieses Image nutzt.
Führe folgenden Befehl im Terminal aus:docker run --name nginx-server -p 8080:80 -v /path/to_your_content:/usr/share/nginx/html:ro -d nginx
Das "/path/to_your_content" muss der Pfad sein wo deine HTML Dateien liegen. Damit wird dann ein Volume erstellt.
Mit "-p 8080:80" öffnen wir den Port 8080 im Host-System zum Port 80 im Container. - Optional: Dockerfile erstellen und bauen: Wenn du kein geeignetes Image gefunden hast, kannst du ein eigenes Dockerfile erstellen, um deine Entwicklungsumgebung anzupassen. Ein Dockerfile ist eine Textdatei, in der du alle Befehle angibst, die ausgeführt werden sollen.
Wenn du mehrere Dateien kopieren willst oder sehr viele Einstellungen anpassen musst ist ein Dockerfile übersichtlicher als nur die Kommandozeile.
In unserem Beispiel reicht das aber vollkommen aus.
Falls du doch lieber die Dockerfile nutzen willst, führe den Befehl "docker build" aus, um das Image zu bauen. Anschließend kannst du einen Container aus dem Image starten, indem du "docker run" verwendest. - Entwicklung im Container: Sobald der Container gestartet ist, kannst du den Server nutzen, als ob es lokal auf deinem Rechner installiert wäre. Du kannst deinen Code bearbeiten und alle gewohnten Tools verwenden.
Im Browser siehst du unter "http://localhost:8080" die HTML Website die du vorher im Volume definiert hast. - Persistenz und Datenverwaltung: Wenn du Daten speichern möchtest, die über den Container hinaus bestehen bleiben sollen (z.B. Datenbankinhalte oder Konfigurationsdateien), kannst du noch mehr Volumes verwenden, um die Daten zwischen dem Host und dem Container zu teilen.
Übrigens: Wenn du Visual Studio Code benutzt gibt es eine sehr gute Extension um alle Container zu managen.
Best Practices und Tipps für den effizienten Einsatz
- Halte deine Container klein und leicht: Vermeide es, unnötige Pakete oder Abhängigkeiten in deinen Containern zu installieren. Je kleiner der Container, desto schneller ist er einsatzbereit und desto effizienter ist er in Bezug auf Ressourcenverbrauch.
- Nutze offizielle Docker-Images: Offizielle Images werden von den Entwicklern der jeweiligen Software gepflegt und regelmäßig aktualisiert. Sie sind oft sicherer und zuverlässiger als inoffizielle Images von Dritten.
- Versioniere dein Dockerfile: Wenn sich deine Entwicklungsumgebung ändert, solltest du auch dein Dockerfile aktualisieren und versionieren. So kannst du jederzeit zu einer früheren Konfiguration zurückkehren, wenn nötig.
- Automatisiere den Build-Prozess: Setze CI/CD-Tools ein, um den Build- und Deployment-Prozess deiner Container zu automatisieren. Dadurch kannst du potenzielle Fehler frühzeitig erkennen und schneller reagieren.
Sicherheit und Datenschutz in Containern
Sicherheit sollte nie unterschätzt werden. Gerade wenn Docker auf einem Server genutzt wird und echte Nutzerdaten verwaltet, musst du das System absichern.
Obwohl Docker eine sichere Technologie ist, gibt es einige bewährte Verfahren, die du beachten solltest, um die Sicherheit deiner Container zu gewährleisten:
- Halte Docker und die Images aktuell: Regelmäßige Updates helfen, Sicherheitslücken zu schließen und deine Container vor möglichen Angriffen zu schützen.
- Verwende offizielle Images und vertrauenswürdige Quellen: Bevorzuge offizielle Images und Images von vertrauenswürdigen Quellen, um die Gefahr von Schadsoftware zu minimieren.
- Begrenze Container-Berechtigungen: Führe deine Container nicht als Root-Benutzer aus, sondern verwende stattdessen einen weniger privilegierten Benutzer.
- Isoliere Netzwerkzugriffe: Schränke die Netzwerkzugriffe von Containern ein, um unerwünschte Kommunikation zu verhindern und sensible Daten zu schützen.
Docker erfolgreich als Freelancer einsetzen: 3x so schnell Projekte aufsetzen
Lass uns ein Fallbeispiel betrachten: Ein Freelancer - nennen wir ihn einfach Fritz - arbeitet als Fullstack Entwickler an mehreren Projekten für verschiedene Kunden.
Er verwendet Docker in seiner Entwicklungsumgebung, um seine Projekte effizienter zu gestalten.
Ein Projekt von Fritz ist eine Web-App basierend auf Next.js. Ein anderes Projekt ist ein Backend mit Django. Er hat mit Dockerfiles für alle diese Projekte ein Setup erstellt, das alle notwendigen Abhängigkeiten für seine Projekte enthält.
D.h. jedes Projekt hat einen eigenen Container, mit eigenen Software Versionen die unabhängig angepasst werden können. Das Wechseln zwischen den Projekte ist einfach nur das starten oder stoppen von Containern.
Wenn er an einem neuen Projekt mit Docker arbeitet, muss er nur das entsprechende Git-Repository klonen und den Container starten. Und es läuft alles garantiert so wie geplant, ganz ohne Installationen.
Dadurch spart er wertvolle Zeit und minimiert die Wahrscheinlichkeit von Konflikten mit anderen Projekten.
Fritz nutzt auch Volumes, um seine Datenbanken und Konfigurationsdateien zwischen den Containern zu speichern, damit er seine Projekte nahtlos zwischen verschiedenen Umgebungen verschieben kann.
Im Produktivsystem laufen die gleichen Container und mit Swarm ist die Skalierbarkeit gleich mit dabei.
Aber wie viel Zeit kann man nun wirklich damit sparen? Um genau zu sein: Bei unserem Beispiel oben mit nginx hat mich das Installieren der Software ohne Docker ungefähr 15 min gekostet.
Nutze ich Docker, muss ich nur das entsprechende Image finden, ein paar env-Variablen setzen und starten. Das hat ca. 5 min gedauert.
Und diese Beispiel war sehr einfach gehalten. Bei einem komplexen Server mit mehreren Datenbanken wir der Unterschied natürlich deutlich größer.
Fazit: Warum Docker ein Muss für moderne Freelancer ist
Docker bietet Freelancern eine leistungsfähige Möglichkeit, ihre Entwicklungsumgebung effizient und portabel zu gestalten. Die Fähigkeit, isolierte Container mit allen notwendigen Abhängigkeiten zu erstellen, vereinfacht den Entwicklungsprozess erheblich und sorgt für eine konsistente Umgebung auf verschiedenen Systemen.
Man weiß einfach, dass das ganze Paket abgeschlossen in einem Container arbeitet.
Die Portabilität, Skalierbarkeit und Sicherheit, die Docker bietet, machen es zu einer unverzichtbaren Technologie für Freelancer, die agil und effizient arbeiten möchten.
Wenn du es in einsetzt, sparst du Zeit, hast weniger Konflikte und kannst dich darauf konzentrieren großartige Software zu entwickeln!
Probiere es einfach aus und du wirst die Vorteile bald nicht mehr missen wollen. Viel Erfolg bei deinen Projekten!