Let’s Dockerize everything!

10. März 2020, von Daniel
Dockerize everything

Ich bin sehr begeistert von Docker. Hier ein kleiner Anstoß für all jene, die sich noch nicht den Ruck gegeben haben, sich damit zu beschäftigen. Alles in allem ist Docker eine ziemlich coole Anwendung. Der Workflow beim Entwickeln wird nach initialem Setup um ein Vielfaches vereinfacht.

Das hier ist keine technische Anleitung und kein How-To.

Es sind einfach nur ein paar Basics, die erklären, warum Docker zu einem wichtigen Teil in meinem Development-Workflow wurde und die euch den Einstieg in die Docker-Welt hoffentlich erleichtern.

Was ist Docker?

Docker ist eine Freie Software zur Isolierung von Anwendungen mit Containervirtualisierung. wikipedia
Say What

Bitte was!?

Jede Software hat bestimmte Anforderungen an das zugrundeliegende Betriebssystem. Eine Webseite wird von außen nur über einen Webserver erreichbar sein. PHP Code wird nur ausgeführt werden, wenn am System ein PHP Interpreter installiert ist, und eine Java Applikation wird nur funktionieren, wenn ein Java Framework vorhanden ist. 

Docker kümmert sich darum, all diese Dependencies einer Anwendung in ein sogenanntes “Container-Image” zu packen. Das Image ist eine ausführbare Datei, welche alles notwendige enthält, um die Applikation auszuführen. Weitere Infos zu Docker findet ihr hier: Docker.com – What is docker?

Das Container-Image enthält also das Betriebssystem, die Laufzeitumgebung, alle benötigten Libraries und Programme, um die Applikation auszuführen. Der Docker-Container “glaubt” also, ein eigenes System zu sein, obwohl er doch eigentlich nur ein Prozess am Host-System ist.

Lassen wir das mal so stehen, und schauen uns ein klassisches Webhosting Beispiel an:

Auf einem Ubuntu Server soll ein WordPress CMS gehostet werden. Die Serveranforderungen von WordPress können auf der Requirements-Seite von WordPress nachgelesen werden.

Die Version 5.3.2 hat folgende Requirements:

  • PHP >= 7.3
  • MySQL >= 5.6 oder MariaDB >= 10.1
  • Webserver (nginx oder Apache2)

Jetzt denkt ihr euch bestimmt:
Kein Problem! Das Ganze kann man doch locker flockig am Server installieren!

Wozu also Docker?!

1. Scalability

Mithilfe von Docker kann man kann beliebig viele Container-Instanzen aus einem Docker-Image erstellen. Das bedeutet, man kann 10 Web Server Instanzen gleichzeitig laufen lassen, einen Load-Balancer davor schalten und somit die Last auf diese 10 Instanzen verteilen.

Anwendungen, wie Docker Swarm und Kubernetes stellen einfache und intuitive Plattformen zur Verfügung, wie die Container sogar auf mehrere physische Server verteilt werden können. Mehr dazu findet ihr auf deren Webseiten.

Dieser Punkt wird dann essentiell, wenn auf den Anwendungen sehr viele Zugriffe zugleich passieren. 

Für kleinere Projekte sind die nächsten beiden Use-Cases relevanter:

2. Entwicklungsumgebungen — Lokal, Dev, Test, Staging, Production

Es kommt (gottseidank) nur selten vor, dass Änderungen der Codebase am Live-Server durchgeführt werden. Eher wird lokal (am Rechner der Entwickler) entwickelt, die Änderungen werden dann Schritt für Schritt auf die unterschiedlichen Umgebungen deployed.

Es gibt also nicht einen Server, sondern eine lokale Entwicklungsumgebung und vier Server (Dev, Test, Staging, Produktion). Man müsste also nicht einen, sondern vier Server aufsetzen. Lokal hat man meisten überhaupt mehr Projekte mit unterschiedlichsten System-Requirements. Und hier kommt Docker zum Einsatz:

Docker-Images enthalten bekanntlich alle Dependencies, um eine Anwendung auszuführen.

Wenn man Applikationen als Docker-Image bereitstellt, ist sichergestellt, dass die Applikation im Container läuft — alle Dependencies sind ja im Container geladen. Das Image wird lokal einmal erstellt, und kann auf den Servern einfach gestartet werden. 

3. Hosting mehrerer Applikationen mit unterschiedlichen Systemanforderungen

Weiters wird ein Server meist nicht nur zum Hosting einer Applikation genutzt. Viel wahrscheinlicher ist es, dass mehrere gleichzeitig auf einem Server laufen sollen. 

Bsp:

  • Frontend App (Angular 9)
  • Frontend App (Angular 7)
  • WordPress (<= PHP 7.0 weil ein benötigtes Plugin noch nicht PHP 7.3 unterstützt; MySQL 5.7)
  • Drupal 8.8.0 (>= PHP 7.3, MySQL 8.0)
  • Laravel 6.0 (PHP >= 7.2)
  • KeyCloak (Java 8 JDK & MySQL 8.0) 

In diesem Szenario stößt man schnell mal auf Probleme beim Server-Setup. Für Drupal und Laravel wird PHP 7.3 oder 7.4 benötigt. WordPress funktioniert aber nur bis PHP 7.0. Bei der  MySQL Datenbank besteht das gleiche Problem. Auch die Frontend Apps könnten unterschiedliche node/npm Versionen benötigen.

Jetzt gibt es 2 mögliche Wege:

  • für jede Applikation einen neuen Server aufsetzen.
  • die Applikationen isolieren, und als Container parallel laufen lassen.

Da ersteres aus diversen Gründen (Preis, Ressourcen, Umwelt, ..) nicht praktikabel ist, können auch hier Docker Container Abhilfe leisten.

Die beiden Frontend-Apps werden je mit der richtigen Node-Version in ein Docker-Image gepackt. Für die beiden nötigen Datenbank-Versionen wird je ein Image erstellt. Ein weiteres Image wird mit WordPress, einem Webserver (z.B. Apache2) und PHP 7.0 erstellt. Drupal und Laravel kommen ebenfalls je in ein Image mit einem Webserver und PHP. In dem Fall allerdings in der Version 7.4. Keycloak wird in ein Image mit der Java 8 JDK gepackt.

Gesamt gibt es nun 6 Images, in denen die jeweils relevanten System-Requirements installiert, und die Codebase der Applikation geladen ist. Diese Images können nun auf den Servern einfach via “docker run” gestartet werden.

Um die Kommunikation zwischen Containern zu ermöglichen, können Docker Netzwerke angelegt werden. Drupal und Keycloak würden in unserem Fall mit dem MySQL 8.0 Container kommunizieren, und WordPress mit dem MySQL 5.7 Container.

Sum up

Alles in allem ist Docker eine ziemlich mächtige Anwendung. Falls du noch keine Erfahrung mit Docker hast, findest du viele Informationen in der offiziellen Docker Dokumentation. Falls du bereits einige Projekte mit Docker, oder einer anderen Container-Virtualisierung-Software, umgesetzt hast, schreib’ uns doch bitte deine größten “Wow”-Erfahrungen in den Kommentaren! 

Daniel

Meine Rolle bei Liechtenecker: Backend Development🤓 Wenn es weder IT noch Digitalisierung gäbe, wäre mein Beruf: Musiker Mein Herz schlägt für: PHP Development, Progressive Metal, Kaffee
1 Kommentar.
Kommentar verfassen
Name
Mail
Web
Captcha
Erfolgreich!
Fehler!
23. März 2020 um 11:33

I feel very thankful that I could read that awesome article. Thanks for sharing. Keep posting.
We offer yahoo support services in USA & Canada. Feel free to contact us:
Contact Yahoo Support

Jetzt antworten
Antwort verfassen
Name
Mail
Web
Captcha
Erfolgreich!
Fehler!
Home Office, Digitalisierung und Coronavirus
Zukunft – Blogbeitrag

Die Stunde der Wahrheit: Digitalisierung in Zeiten des Coronavirus

23. März 2020, von Susanne

Vier Eckpfeiler, die durch die Coronavirus-Krise aufzeigen, wie es um die Digitalisierung eines Unternehmens steht.

Jetzt lesen
Liechtenecker Leseliste #57 mit Michael Kräftner
Arbeitskultur – Podcasts

Folge #57 mit Michael Kräftner

6. März 2020

In Folge 57 ist Michael Kräftner, Founder und CEO von Celum, zu Gast. Mitgebracht hat er "The Hard Thing About Hard Things" von Ben Horowitz, ein ganz und gar unklassisches Management-Buch.

Jetzt anhören
Close