3.8 Verwenden von Docker

Für die offene Docker-Plattform steht eine hervorragende Dokumentation zur Verfügung, die Sie lesen und beachten sollten.

3.8.1 Warum Docker?

Docker ist eine eigenständige Plattform, mit der Sie Anwendungen in einem Container entwickeln, bereitstellen und ausführen können. Ihre Anwendung, alle von der Anwendung benötigten Abhängigkeiten, wie Binärdateien und Bibliotheken, und die Konfigurationsinformationen sind im Container enthalten. Sie können mehrere Container bereitstellen, die alle in Docker und über dem Betriebssystem ausgeführt werden.

Mithilfe von Docker können Sie Ihre Anwendungen vertikal skalieren, d. h. mehrere Instanzen des Sitzungsservers können auf einem Server vorhanden sein und jede Instanz liefert die gleiche Leistung, die sie beim Erstellen und Testen bot.

3.8.2 Welche Vorteile bietet dies?

Die Verwendung von Containern bietet mehrere Vorteile:

  • Leistung

    Virtuelle Maschinen sind eine Alternative zu Containern. Container enthalten jedoch (im Gegensatz zu virtuellen Maschinen) kein Betriebssystem. Das bedeutet, dass Container schneller erstellt und gestartet werden können und einen kleineren Fußabdruck hinterlassen.

  • Agilität

    Weil Container portabler sind und eine bessere Leistung bieten, können Sie agilere und dynamische Entwicklungsmethoden nutzen.

  • Isolation

    Docker-Container sind unabhängig voneinander. Dies bietet den Vorteil, dass ein Docker-Container, der eine Anwendung und die erforderlichen Versionen der unterstützenden Software enthält, nicht mit einem anderen Container mit der gleichen Anwendung, aber anderer unterstützender Software, in Konflikt geraten kann. So können Sie sicher sein, dass sich das Image, das Sie erstellen, in jeder Entwicklungs- und Bereitstellungsphase genau wie erwartet verhält.

  • Skalierbarkeit

    Neue Container lassen sich einfach und schnell erstellen. Die Docker-Dokumentation enthält Informationen zum Verwalten mehrerer Container.

3.8.3 Terminologie

Zum Arbeiten mit Docker sollten Sie mit einigen Grundbegriffen vertraut sein. Weitere Information finden Sie auf der Website zur Docker-Dokumentation.

  • Container
  • Eine Laufzeitinstanz eines Image. Ein Container ist üblicherweise vollständig von der Hostumgebung isoliert und kann nur auf Hostdateien und -ports zugreifen, wenn er entsprechend konfiguriert wurde. Um ein Image in einem Container auszuführen, verwenden Sie den Docker-Befehl „run“.
  • Docker Hub
  • Eine Cloud-basierte Community-Ressource für das Arbeiten mit Docker. Docker Hub dient üblicherweise dem Hosten von Images, kann aber auch für die Benutzerauthentifizierung und Automatisierung der Image-Erstellung verwendet werden. Jeder kann Images in Docker Hub veröffentlichen.
  • Docker Compose
  • : Compose ist ein Werkzeug, das mithilfe von YAML-Dateien Ihre Anwendungsservices konfiguriert und dann Docker-Anwendungen mit mehreren Containern definiert und ausführt. Weitere Informationen zu Compose finden Sie in der Docker Compose-Dokumentation.
  • Dockerfile
  • Ein Textdokument, das die Befehle zum Erstellen eines Docker-Image enthält. Sie können komplexe Befehle (zum Beispiel zum Festlegen eines vorhandenen Image als Basis) oder einfache Befehle (zum Beispiel zum Kopieren von Dateien zwischen Verzeichnissen) angeben. Um ein Image von einer Dockerfile-Datei zu erstellen, verwenden Sie den Docker-Befehl „build“.
  • Image
  • Ein eigenständiges, ausführbares Paket, das in einem Container ausgeführt wird. Ein Docker-Image ist eine Binärdatei, die alle erforderlichen Elemente zum Ausführen eines einzelnen Docker-Containers einschließlich Metadaten enthält. Sie können eigene Images (mit einer Dockerfile-Datei) erstellen oder Images verwenden, die von anderen Personen erstellt und in einer Registrierung (wie Docker Hub) verfügbar gemacht wurden. Um ein Image von einer Dockerfile-Datei zu erstellen, verwenden Sie den Docker-Befehl „build“. Um ein Image in einem Container auszuführen, verwenden Sie den Docker-Befehl „run“.

3.8.4 Erste Schritte mit Docker und Host Access for the Cloud

Wenn Sie sich bei der Installation von HACloud für die Verwendung von Docker entscheiden, enthält das Installationspaket eine anfängliche Dockerfile und eine zugehörige JAR-Anwendungsdatei für die ersten Schritte bei der Verwendung des Sitzungsservers in Containern. Diese Dateien sind vor der Installation verfügbar.

Der Ordner docker/samples enthält Beispiele. Eine Anleitung dazu finden Sie unter Beispiele.

Das Erstellen des Basisimage erfolgt in vier Schritten:

  1. Docker installieren. Befolgen Sie die Anweisungen auf der Docker-Website.

  2. Extrahieren Sie die Downloadpaketdatei und suchen Sie die Dateien Dockerfile, entrypoint.sh und sessionserver.jar im Ordner Docker.

  3. Erstellen Sie das Docker-Image.

  4. Führen Sie das Docker-Image aus.

Docker-Image für den Sitzungsserver erstellen

Nachdem Sie den ersten und zweiten Schritt ausgeführt haben, d. h. Docker installiert und die Dockerfile und die sessionserver.jar-Datei extrahiert und gefunden haben, besteht der nächste Schritt im Erstellen des Docker-Basisimage des Sitzungsservers.

  1. Führen Sie im Ordner, der die Dockerfile enthält, den folgenden Befehl aus:

    docker build -t hacloud/sessionserver:<Version> .

    Ersetzen Sie <version> mit der Version des Sitzungsservers. Wenn eine Version nicht verfügbar ist, ist das standardmäßige Tag (-t) latest (neueste Version).

  2. Überprüfen Sie, ob das Image erfolgreich erstellt wurde. Führen Sie den folgenden Befehl aus:

    docker images

    Die Ausgabe sollte Informationen zum soeben erstellten Image enthalten.

Image ausführen

Bevor Sie das Image des Sitzungsservers in einem Docker-Container ausführen können, müssen Sie diese Schritte ausführen:

Adresse des MSS-Servers angeben

Um den Ort des MSS-Servers anzugeben, übergeben Sie eine Umgebungsvariable über Docker an den Sitzungsserver. Beispiel: --env MSS_SERVER=mss.server.com

Passwort für Serviceregistrierung angeben

Um das Passwort für die Serviceregistrierung anzugeben, übergeben Sie eine Umgebungsvariable über Docker an den Sitzungsserver. Beispiel: --env SERVICE_REGISTRY_PASSWORD=<Ihr_Passwort>.

Das Passwort ist in der Eigenschaft service.registry.password unter ./mss/server/conf/container.properties auf dem MSS-Server abrufbar. Verwenden Sie die gesamte Eigenschaft service.registry.password.

MSS anweisen, dem Identitätszertifikat des Sitzungsservers zu vertrauen

Führen Sie diesen Schritt in der Verwaltungskonsole unter „Einstellungen konfigurieren > Verbürgte Zertifikate“ aus. Mehr dazu erfahren Sie in der Dokumentation zur MSS-Verwaltungskonsole, im Abschnitt To add a server certificate to the MSS trust store (Hinzufügen eines Serverzertifikats zum Truststore). Das Zertifikat des Sitzungsservers ist im Verzeichnis sessionserver/etc verfügbar.

Keystore mit dem Identitätszertifikat des Sitzungsservers angeben

Der Sitzungsserver weist sich mithilfe eines Zertifikats aus. Dieses Zertifikat sollte im Java-Keystore /sessionserver/etc/keystore.bcfks im Container hinterlegt sein.

Truststore mit MSS-Zertifikat angeben

Wenn der Sitzungsserver ausgehende TLS-Verbindungen aufbaut, prüft er die Vertrauenswürdigkeit der Remoteserver (z. B. MSS) anhand der Zertifikate in seinem Truststore. Zertifikaten, die sich im Java-Keystore /sessionserver/etc/trustcerts.bcfks des Containers befinden, wird vertraut.

Keystore und Truststore zu denen im Container zuordnen

Sie können dem Container die Keystores auf zwei Wegen präsentieren:

Per Volume-Mount

Mit einem Volume-Mount wird eine Datei oder ein Verzeichnis auf dem Hostcomputer im Container eingehängt. Die Datei bzw. das Verzeichnis wird mit dem vollständigen oder relativen Pfad auf dem Hostcomputer referenziert.

Mit dem Volume-Mount werden die Keystore- und Truststore-Dateien auf dem Host im Docker-Container eingehängt.

docker run --env MSS_SERVER=localhost \
    --env SERVICE_REGISTRY_PASSWORD=<Passwort hier eingeben> \
    --volume ~/demo_keystore.bcfks:/sessionserver/etc/keystore.bcfks \
    --volume ~/demo_truststore.bcfks:/sessionserver/etc/trustcerts.bcfks \
    --publish 7443:7443 \
    sessionserver

Nachteil von Volume-Mounts: Da sich Keystores auf jedem Docker-Host befinden müssen, auf dem ein Container ausgeführt wird, ist der Docker-Container nicht besonders portabel.

Vorhandenes Docker-Image erweitern

Mit dieser Methode erstellen Sie eine neue Dockerfile-Datei, um die erforderlichen Dateien in das Docker-Image zu kopieren. Auf diese Weise lässt sich das Docker-Image besser verschieben.

Erstellen Sie zuerst eine Dockerfile, die aus dem Docker-Image „hacloud/sessionserver“ erweitert wird.

FROM hacloud/sessionserver:<Beispiel: hacloud/sessionserver:latest oder hacloud/sessionserver:version>

COPY <Ihr Pfad>/keystore.bcfks //sessionserver/etc/keystore.bcfks
    COPY <Ihr Pfad>/truststore.bcfks //sessionserver/etc/trustcerts.bcfks

Erstellen Sie dann das erweiterte Docker-Image und nennen Sie es demo.

docker build -t demo .

Führen Sie dann das Image demo aus.

docker run --env MSS_SERVER=localhost \
    --env SERVICE_REGISTRY_PASSWORD=<Passwort eingeben> \
    --publish 7443:7443 \
    demo

Docker-Hostname und -Port angeben

Damit MSS den Sitzungsserver findet, muss dieser seinen Hostnamen versenden. Da Docker einen zufälligen einmaligen Namen generiert, der von außerhalb des Containers nicht erreichbar ist, müssen Sie den Docker-Hostnamen für MSS angeben. Teilen Sie dem Sitzungsserver außerdem mit, welchen Port Sie auf Ihrem Docker-Host veröffentlichen. Clients, die auf den Sitzungsserver zugreifen, werden hier herauskommen: <Docker_Hostname>:<Docker_veröffentlichter_Port>.

--env HOST_NAME=docker_host_name
   --env SERVER_PORT=docker_published_port

3.8.5 Beispiele

Die Beispiele im Ordner docker/samples illustrieren vier Szenarien mit Docker Compose. Compose ist ein Werkzeug, das eine YAML-Datei verwendet, um die Anwendungen mit einem einzigen Befehl zu konfigurieren und auszuführen.

Voraussetzungen

So führen Sie die Beispiele aus:

Folgende Beispiele sind verfügbar:

  • Einfaches Beispiel - Ein einfaches Beispiel mit einer Demo-Keystore-Datei und Truststore-Dateien, in die Sie ein MSS-Serverzertifikat importieren können

  • Beispiel eines Hybridszenarios - Ein Beispiel eines Hybridszenarios mit einer lokalen Host Access for the Cloud-Installation, in dem auf einem Datenträger vorhandene Keystore- und Truststore-Dateien im Docker-Container eingehängt werden

  • Beispiel für ein Erweiterungsszenario - Ein Beispiel mit einer Erweiterung, das darstellt, wie der Webclient aktualisiert, modifiziert und angepasst werden kann

  • Lastausgleich - Ein Beispiel mit Lastverteiler, das den Lastausgleich zwischen verknüpften Containern beschreibt

Einfaches Beispiel

Dieses einfache Beispiel zeigt, wie das Docker-Image des Sitzungsservers in Docker Compose ausgeführt wird. Für dieses Beispiel müssen Sie das Zertifikat des MSS-Servers in das bereitgestellte Beispiel ./certs/demo_truststore.bcfks importieren. Verwenden Sie dazu beispielsweise KeyStore Explorer. Standardmäßig befindet sich Ihr MSS-Zertifikat unter /mss/server/etc/<Computername>.cer. (siehe Zertifikat in den Truststore des Sitzungsservers importieren).

Bevor Sie das Beispiel ausführen, aktualisieren Sie die Werte MSS_SERVER, HOST_NAME und SERVICE_REGISTRY_PASSWORD in docker-compose.yml.

  • So starten Sie den Sitzungsserverservice:

    docker-compose up
  • So führen Sie den Service in einem Daemon aus (getrennter Modus):

    docker-compose up -d
  • So zeigen Sie ausgeführte Container an:

    docker ps

Beispiel eines Hybridszenarios

In diesem Beispiel ist eine lokale Installation von Host Access for the Cloud mit Keystore- und Truststore-Dateien auf einem Datenträger vorhanden. Diese Dateien müssen im Docker-Container eingehängt (dorthin kopiert) werden.

Bevor Sie das Beispiel ausführen, aktualisieren Sie die Werte MSS_SERVER, HOST_NAME, SERVER_PORT und SERVICE_REGISTRY_PASSWORD in der Datei .env.

So starten Sie den Sitzungsserverservice:

  • Kopieren Sie .env und docker-compose.yml zu sessionserver/microservices/sessionserver/.

  • Führen Sie aus diesem Verzeichnis Folgendes aus: docker-compose up -d

Beispiel für ein Erweiterungsszenario

Mithilfe von Erweiterungen und eigenem HTML-, CSS- oder JavaScript-Code können Sie die Darstellung des Webclients über den Browser aktualisieren, ändern und anpassen. Weitere Informationen hierzu finden Sie in Erweitern des Webclients.

In diesem Beispiel wird SPRING_PROFILES_ACTIVE auf extensions-enabled festgelegt und der Speicherort der Erweiterungen in docker-compose.yml zugeordnet.

Bevor Sie das Beispiel ausführen, aktualisieren Sie die Werte MSS_SERVER, HOST_NAME, SERVER_PORT und SERVICE_REGISTRY_PASSWORD in der Datei .env.

So starten Sie den Sitzungsserverservice:

docker-compose up -d

Sie könnten außerdem das Docker-Basisimage hacloud/sessionserver erweitern und die Erweiterungsdateien in den Docker-Container kopieren:

  1. Erstellen Sie die Dockerfile, die aus dem Docker-Image „hacloud/sessionserver“ erweitert wird.

    FROM hacloud/sessionserver
        
        COPY ./certs/keystore.bcfks //sessionserver/etc/keystore.bcfks
        COPY ./certs/trustcerts.bcfks //sessionserver/etc/trustcerts.bcfks
        COPY ./extensions /sessionserver/extensions/
  2. Erstellen Sie das erweiterte Docker-Image und nennen Sie es extensions.

    docker build -t extensions
  3. Aktualisieren Sie docker-compose.yml zur Verwendung des neuen Erweiterungs-Image.

    version: '3'
    services:
      sessionserver:
        image: extensions
        environment:
          - LOGGING_FILE=./logs/sessionserver.log
          - LOGGING_FILE_MAXSIZE=10MB
          - LOGGING_FILE_MAXHISTORY=10
          - MSS_SERVER=${MSS_SERVER}
          - SERVICE_REGISTRY_PASSWORD=${SERVICE_REGISTRY_PASSWORD}
          - SPRING_PROFILES_ACTIVE=extensions-enabled
        ports:
          - ${SERVER_PORT}:7443

Lastausgleich

HAProxy ist ein Lastverteiler. Weitere Informationen zu HAProxy erhalten Sie auf der zugehörigen Website.

In diesem Beispiel wird ein haproxy-Service in die Datei docker-compose.yml eingeschlossen. Das Beispiel verwendet ein haproxy-Image zum Ausgleich zwischen verknüpften Containern. Dieses Beispiel verwendet SLL-Bridging zum Verknüpfen der Container.

Um eine sichere Kommunikation zwischen den Clients und dem Lastverteiler zu gewährleisten, aktualisieren Sie die Eigenschaft LOAD_BALANCER_CERT in der .env-Datei mit dem Speicherort des Lastverteilerzertifikats.

Zum Testen können Sie ein eigensigniertes Zertifikat generieren:

  1. Generieren Sie einen eindeutigen privaten Schlüssel (KEY):

    sudo openssl genrsa -out mydomain.key 2048
  2. Generieren Sie einen Zertifizierungsantrag (CSR):

    sudo openssl req -new -key mydomain.key -out mydomain.csr
  3. Erstellen Sie ein eigensigniertes Zertifikat (CRT):

    sudo openssl x509 -req -days 365 -in mydomain.csr -signkey mydomain.key -out mydomain.crt
  4. Fügen Sie KEY und CERT an loadbalancer-pem an:

    sudo cat mydomain.key mydomain.crt > ./etc/loadbalancer.pem

So starten Sie die Sitzungsserver- und haproxy-Services:

docker-compose up -d

Alternativ:

docker-compose up --scale sessionserver=n -d

n stellt die Anzahl der Sitzungsserverinstanzen dar.

Sie können die Anzahl der Sitzungsserverinstanzen nach dem Starten des Services ändern:

docker-compose scale sessionserver=n

So greifen Sie auf den Sitzungsserver und die HAProxy-Statistikseite zu:

  • https://server:7443

  • http://server:1936/haproxy?stats

Verwenden Sie:

  • Benutzer: admin

  • Passwort: password