Eine Einführung in Docker und dessen Verwendung zur Einrichtung einer virtualisierten Entwicklungsumgebung

Die Notwendigkeit der Virtualisierung, die Lösung des Ressourcenproblems durch Docker und eine einführende Erklärung der Funktionsweise des DevOps-Tools

Cover image on blog on the topic of Docker and virtualising development environments

In diesem Teil unserer DevOps-Beratungsreihe sehen wir uns an, wie Docker zur Virtualisierung einer Entwicklungsumgebung verwendet werden kann. Und wie die Vereinfachung, die das Containerisierungstool bietet, aussieht:

  • Kosteneffizienz
  • Geringerer Zeitaufwand für das Einrichten eines neuen Java-Projekts
  • Geringere Bereitstellungszeit

Warum eine reine Virtualisierung der Entwicklungsumgebung in der Regel nicht in Frage kommt

Im Grunde genommen ermöglicht die Virtualisierung die Ausführung mehrerer Betriebssysteme auf einem einzigen Rechner. Das ist für Softwaretests sehr hilfreich, führt aber zu hoher Prozessorlast, übermäßiger Nutzung von RAM und Festplattenspeicher und bedeutet, dass einzigartige Konfigurationen nicht repliziert und wiederverwendet werden können. All dies verlangsamt den Entwicklungsprozess.

Aus diesem Grund war die Virtualisierung in der Vergangenheit oft keine praktikable Option, wenn eine schnelle Anwendungsbereitstellung eine strategische Anforderung war.

Das begann sich zu ändern, als HashiCorp 2010 Vagrant einführte. Als Befehlszeilendienstprogramm für Virtualisierungssoftware ermöglicht es die Ausführung von Befehlen wie [create virtual machine] und die Erstellung komplizierter Konfigurationen. So können Sie eine einzige [vagrant up]-Zeile in Ihr Terminal eingeben, wenn Sie z. B. Ihr Projekt mit PHP isoliert in Ubuntu ausführen möchten.

Vagrant hat die Virtualisierungsaufgaben für Entwickler wesentlich vereinfacht. Aber der Ansatz selbst blieb zu ressourcenintensiv, sodass Solomon Hyckes 2013 Docker einführte.

Wie Docker die Art und Weise der Virtualisierung von Hardware als Entwicklungsumgebung verändert hat

Docker ist eine Open-Source-Plattform, die für eine schnelle Bereitstellung geschaffen wurde und Folgendes ermöglicht

  • die Einrichtung der gleichen virtuellen Entwicklungsumgebung an jedem Ort, den Sie benötigen
    schnellere Freigabe von Anwendungscode
    eine schnellere und effizientere Qualitätssicherung

Diese Vorteile werden durch die Container-Virtualisierungsplattform von Docker mit Prozessen und Dienstprogrammen zur Verwaltung von RAM, HDD, CPU usw. ermöglicht. Ganz gleich, welche Software Sie in Docker ausführen möchten – eine NodeJS-Webanwendung, einen Selenium-Server, eine Java-Anwendung oder ein Python-Skript – jeder Microservice wird isoliert in seinem Docker-Container ausgeführt.

Und Sie können so viele Container auf einem einzigen Rechner erstellen, wie Sie benötigen!

Unter der Haube: Wie Docker funktioniert

In Docker sorgen drei Hauptkomponenten für die ganze Magie:

Linux-Container, eine Virtualisierungstechnologie, die die Ausführung mehrerer isolierter Betriebssysteminstanzen auf einem Host ermöglicht
Cgroups, eine Funktion des Linux-Kernels, die die Ressourcennutzung (CPU, Arbeitsspeicher, Festplatten-E/A, Netzwerk usw.) einer Sammlung von Prozessen begrenzt, berücksichtigt und isoliert
Linux Namespaces (leichtgewichtige Prozessvirtualisierungsfunktion), die zur Organisation isolierter Orte, so genannter Docker-Container, verwendet wird

Container sind vergleichbar mit Verzeichnissen, die alles enthalten, was Anwendungen zum Funktionieren benötigen. Jeder Container wird aus einem Image erstellt, einer schreibgeschützten Vorlage, die in der Regel in einer Docker-Registry (entweder privat oder öffentlich) gespeichert ist.

Dockerfile, das ein Image mit installiertem Ruby, Sass und Gulp erstellt und dann einen Container darauf startet:

FROM node:6.1-onbuild

# Install gem sass for grunt-contrib-sass
RUN apt-get update -qq && apt-get install -y build-essential
RUN apt-get install -y ruby
RUN gem install sass

RUN npm install -g bower gulp

RUN bower install --config.interactive=false --allow-root

ENV NODE_ENV development

# Port 3000 for server
# Port 35729 for livereload
EXPOSE 3000 35729

Klingt gut, aber in der Praxis müssen wir in der Regel mehrere Container auf einmal starten, um eine vollständige Entwicklungs- oder Testumgebung für eine Anwendung zu erstellen. Was ist dann zu tun?

Docker Compose für Anwendungen mit mehreren Containern

Compose von Docker ist ein Tool, das für die Definition und Ausführung von Multi-Container-Anwendungen eingeführt wurde. Um die Dienste Ihrer Anwendung zu konfigurieren, müssen Sie eine Compose-Datei erstellen. Mit einem einzigen [docker-compose up]-Befehl können Sie dann alle für Ihre Konfiguration erforderlichen Dienste einrichten und starten.

Beispiel für eine docker-compose.yml-Datei:

app:
  build: ./app/
  ports:
    - "3000:3000"
    - "35729:35729"
  volumes:
    - ./app/config:/usr/src/app/config
    - ./app/modules:/usr/src/app/modules
    - ./app/public:/usr/src/app/public
    - ./app/.jshintrc:/usr/src/app/.jshintrc
    - ./app/.csslintrc:/usr/src/app/.csslintrc
  environment:
    MOODLE_URL: http://192.168.99.100:8080
    MOODLE_SERVICE: appname_mobile_app
    ANGULAR_EXPIRATION_HOURS_AUTH: 24

moodle:
  build: ./dockerfiles/moodle/
  ports:
    - "8080:80"
  links:
    - db
  volumes:
    - ./dockerfiles/appname/foreground.sh:/etc/apache2/foreground.sh

db:
  image: centurylink/mysql
  expose:
    - "3306"
  environment:
    MYSQL_DATABASE: moodle
    MYSQL_USER: moodle
    MYSQL_PASSWORD: moodle
docker-compose up -d

Die oben aufgeführte Datei führt eine Anwendung aus, die in drei verschiedenen Docker-Images existiert: app (mit einer nodeJS-Anwendung), moodle (mit PHP-Skripten und dem Apache-Webserver) und db (mit einer mySQL-Datenbank).

Docker und Kubernetes: eine hervorragende Kombination für Cloud-Native Anwendungen

Docker verfügt zwar über sein eigenes Tool Docker Swarm, das für die skalierte Orchestrierung von Container-Clustern in komplexeren Cloud-nativen Anwendungen verwendet werden kann, doch Kubernetes hat sich zum Industriestandard entwickelt – eine Erkenntnis, die sogar von Mirantis, dem neuen Eigentümer von Docker Enterprise, anerkannt wird. Weitere Informationen darüber, wie Docker und Kubernetes in einer Cloud-nativen DevOps-Architektur zusammenarbeiten, finden Sie in unserem Artikel Kubernetes vs. Docker: eine Kooperation, keine Konkurrenz.

Lange Rede, kurzer Sinn: Warum Docker verwenden?

Mit Docker können Sie jede Plattform mit ihrer eigenen Konfiguration auf Ihrer Infrastruktur betreiben, ohne deren Ressourcen zu überlasten, wie es bei virtuellen Maschinen der Fall ist. Mit Docker können Sie Ihre Umgebung und Konfiguration in den Code integrieren und diesen bereitstellen.

Folglich ermöglicht Docker unseren Entwicklern,:

  • so nah wie möglich an der Produktion zu sei
  • von einer schnellen Entwicklungsumgebung zu profitieren, die für die interaktive Nutzung zur Verfügung steht
  • verschiedene Anwendungen auf demselben Host ohne Konflikte auszuführen
  • drastische Kostenreduzierung durch den Betrieb vieler Instanzen auf einem einzigen Server
  • neue Prozesse über Container innerhalb von Sekunden zu starten

Wenn Sie für ein aktuelles oder anstehendes Projekt ein Software-Entwicklungsteam oder eine Teamverstärkung mit Docker- und DevOps-Expertise benötigen, nehmen Sie bitte Kontakt mit uns auf! Wir freuen uns auf die Details.

Ausgewählte Blogbeiträge