Setup der New-UI in Docker

Setup

In diesem Kapitel werden einige grundlegende Informationen darüber gegeben, wie die neue UI der B2B mit Docker zusammen arbeitet.

Docker

Sie benötigen mindestens einen Server den Sie als Docker-Host nutzen.

Auf dem Docker-Host muss zwingend eine Docker-Instanz und docker-compose installiert sein. Hinweise zur Installation sind hier aufgelistet.

Achten Sie darauf, Docker genügend Zwischenspeicher zur Verfügung zu stellen. (Der Windows-Docker default von 1GB ist deutlich zu wenig).

Ebenso muss genügend Speicher zur Verfügung gestellt werden. Es müssen die Images sowie zukünftig auch neuere Versionen der Images gespeichert werden können. Falls nicht anders konfiguriert, werden außerdem Logs auf die Festplatte geschrieben.

Um nach einer Installation von Docker zu prüfen, ob der Docker-Service ordnungsgemäß ausgeführt wird, kann unter Linux folgendes Kommando ausgeführt werden:

:> systemctl status docker | grep Active
   Active: active (running) since Fri 2020-08-21 10:17:16 CEST; 34min ago

Unter Windows sollte nach dem Start von “Docker Desktop” das Docker-Icon Docker-Icon in der Taskleiste angezeigt werden. Mit einem Rechtsklick auf das Icon und Auswahl von “Settings” sollte in dem sich öffnenden Popup links unten die Meldung “Docker is running” erscheinen.

Docker-Settings

Eine weitere Möglichkeit zu testen, ob Docker korrekt installiert wurde, ist der Start eines Test-Containers. Hierfür kann mit dem folgenden Kommando (für Windows und Linux) eine Hello-World-Anwendung in einem Container gestartet werden:

:> docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Erscheint die Ausgabe in etwa so wie oben dargestellt, wurde Docker korrekt installiert.

Zugriff auf NLI-Nexus

Damit beim Starten der Docker-Container die Docker-Images vom NLI-Nexus bezogen werden können, muss dieser vom Docker-Host-System aus zugänglich sein. Hierfür ist für Kundensysteme über ein NLI-Support Ticket eine entsprechende Firewall-Freischaltung für den Docker-Host zu beantragen.

Zusätzlich zur IP-Freischaltung muss auch ein Login beantragt werden. Mithilfe dieses Logins kann der initiale Docker-Login am NLI-Nexus durchgeführt werden.

Für NLI externe Netze (z.B. Arvato) kann mithilfe eines VPNs auf den NLI-Nexus zugegriffen werden. Die Konfiguration für z.B. openVPN kann ebenfalls über den NLI-Support beantragt werden.

docker-compose Umgebung

Die Docker-Umgebung wird durch die Datei docker-compose.yml beschrieben. Der Inhalt dieser Datei wird auf den folgenden Seiten aufgezeigt & erläutert.

Das Hello-World Beispiel könnte mit docker-compose wie folgt umgesetzt werden:

version: '3.7'
services:
  hello-world:
    image: hello-world

Start docker container (New-UI, B2B, keycloak)

Nachdem die docker-compose Umgebung vorbereitet wurde, die Anpassungen an der Remote-B2B-Datenbank vorgenommen wurden und bestätigt werden konnte, dass der Docker-Service ausgeführt wird, kann mit dem folgenden Kommando der Login der Docker-Instanz am NLI-Nexus vorgenommen werden (Zugangsdaten siehe hier):

:opt/docker/b2b/> docker login -u [user] -p [password] nexus-docker.next-level-apps.com

Anschließend können mit dem folgenden Kommando die benötigten Container im Docker gestartet werden:

:opt/docker/b2b/> docker-compose up -d

Um zu prüfen, ob die Container erfolgreich gestartet wurden kann der Status der Container mit dem folgenden Kommando abgefragt werden:

:opt/docker/b2b/> docker ps -a

Als Ergebnis dieses Kommandos sollte in etwa Folgendes ausgegeben werden:

CONTAINER ID        IMAGE                                                                   COMMAND                  CREATED             STATUS              PORTS                                            NAMES
c5b131cc4bd4        nexus-docker.next-level-apps.com/b2b:2021-02-22                 "/bin/sh -c 'catalin…"   30 minutes ago      Up About a minute   0.0.0.0:8000->8000/tcp, 0.0.0.0:8081->8080/tcp   dev_b2b_1
79ea59d8cab7        nexus-docker.next-level-apps.com/b2b-ui:2021-03-18              "/docker-entrypoint.…"   19 hours ago        Up 2 hours          0.0.0.0:80->80/tcp                               dev_b2bui_1
3213ce077344        nexus-docker.next-level-apps.com/keycloak:2021-02-22            "/opt/jboss/tools/do…"   19 hours ago        Up 2 hours          0.0.0.0:8080->8080/tcp, 8443/tcp                 dev_keycloak_1

Wichtig ist hierbei der Status der einzelnen Container, der jeweils “Up” sein sollte.

Die Container können mit folgendem Befehl gestoppt werden:

docker-compose stop

Möchten Sie eine neue Version eines Images einspielen, aktualisieren Sie einfach die Versionsnummer des Images innerhalb der docker-compose.yml und starten dann die Umgebung neu.

Anhang: nützliche Docker-Kommandos

Stoppen von einzelnen Containern

:> docker stop [Containername]

Starten von einzelnen Containern

:> docker start [Containername]

Stoppen aller Container

:> docker stop $(docker ps -a -q)

Entfernen aller Container

:> docker rm $(docker ps -a -q)

Log-Ausgaben einzelner Container anzeigen

:> docker logs [Containername]

oder um den Log-Ausgaben zu folgen:

:> docker logs --follow [Containername]

Zugriff auf einzelne Container

:> docker exec -it [Containername] bash

Dieses Kommando ist sehr nützlich, um direkt in dem entsprechenden Docker-Container zu arbeiten. So können ggf. direkte Anpassungen im Container vorgenommen werden oder weitere Log-Dateien analysiert werden.

Anhang: Die verschiedenen Parameter in docker-compose

Parameter Wert Beschreibung
version aktuell 3.3 Die Version des docker-compose-file (Compose file format compatibility matrix)
image nexus-docker.next-level-apps.com/b2b-ui:latest Der Link und Name des Dockerimages, welches geladen werden soll. Es wird aus dem NLI-Nexus-Repository geladen. Als <VERSION> kann aktuell noch latest verwendet werden.
restart always Damit startet Docker den Caontainer automatisch neu, sollte er abgestürzt sein oder Docker selbst neugestartet werden.
ports 4040:4010 Der hintere Port ist jener, welcher in der Konfiguration application.yml innerhalb des Dockercontainers vom Service verwendet wird. Der vordere ist der Port, welchen der Container nach außen freigibt und auf den internen Port abbildet. Der zweite Wert muss also dem Wert der application.yml entsprechen.
volumes z.B. /opt/b2b/B2B-UI/B2B-UI-webapp:/config Der hintere Wert, ist das Verzeichnis, in welches die Daten aus dem vorderen Pfad gemounted werden sollen. Die Dateien im vorderen Verzeichnis werden damit innerhalb des Containers verfügbar und vom Service verwendet. Im vorne genannten Verzeichnis muss die oben beschrieben Konfiguration (yaml-Dateien) abgelegt sein.
environment / JAVA_OPTS z.B. ein Debug-Port Im Beispiel wird hier der Debug-Port im Container gesetzt, welcher unter ports auf einen externen port abgebildet wird. Hier können alle relevanten JAVA_OPTS, wie z.B. Speicheranforderungen, gesetzt werden.

Anhang: Tips

DNS

Falls die DNS Namen nicht aufgelöst werden können, hilft es, folgende Datei in den Container zu mounten:

    volumes:
      - /etc/resolv.conf:/etc/resolv.conf

Docker-User wechseln

Sie können selbst in der docker-compose.yml einen User (und Gruppe) angeben, der zum Ausführen der Applikation im Container genutzt wird. Das ist z.B. nützlich, wenn Sie nur bestimmten Usern Schreibzugriff auf das Log-Verzeichnis gewähren möchten. Beispiel:

  b2b:
    image: ${NEXUS}/b2b:2021-02-22
    user: 1000:1000

Pruning

Nachdem ein neues Release eingespielt wurde, ist es nicht mehr nötig, die alten Images zu speichern. Diese können gelöscht werden, z.B. mit dem folgenden Befehl:

docker system prune -a -f

NLI HTTPS Zertifikat Support

Falls Sie Ihren Keycloak wie empfohlen per HTTPS absichern, dabei aber selbst signierte Zertifikate nutzen, müssen entsprechend die Zertifikate den Backends zur Verfügung gestellt werden. Unsere Backend-Container unterstützen Sie beim Zertifikatsimport.

Folgende Backends unterstützen die Zertifikatsaufbereitung:

  • B2B (Tomcat)
  • Index
  • Notification
  • Revision
  • FSS

Führen Sie bitte für jedes Backend die folgenden Schritte durch:

  • Mounten Sie die Zertifikate nach /cert. Mounten Sie in dieses Verzeichnis keine anderen Dateien.
  • Mounten Sie das beigefügte Script nach /import_certs.sh. Achten Sie darauf, Linuxzeilenumbrüche zu verwenden.
  • Achten Sie darauf, dass der User des Docker-Containers Lese- & Schreibrechte auf dem /cert Verzeichnis sowie Ausführungsrechte auf dem Script hat.

Beispiele

Keystore aus eigenen Zertifikaten

#!/bin/sh
echo "import_certs.sh"
DIR="/cert"
DEFAULT_PASSWORD=b2bbpdefault
CURRENT_USER=$(id -u -n)
echo "Current user: $CURRENT_USER"

# /certs is not empty
if [ "$(ls -A $DIR)" ]; then
  echo "$DIR is not Empty"
  # Find existing keystore
  KEYSTORE=$(find $DIR -name "*.jks" -print | head -n 1)
  # No keystore
  if [ -z "$KEYSTORE" ]; then
	echo "Keystore not found"
    keytool -genkeypair -noprompt \
     -alias self-signed-keystore \
     -dname "CN=$CURRENT_USER, OU=$CURRENT_USER, O=$CURRENT_USER, L=DE, S=DE, C=DE" \
     -keystore $DIR/self-signed-keystore.jks \
     -storepass $DEFAULT_PASSWORD \
     -keypass $DEFAULT_PASSWORD

 	KEYSTORE=$DIR/self-signed-keystore.jks
    echo "Keystore is created"

    INDEX=1
    for CERT in $DIR/*; do
	  if [ $CERT != $KEYSTORE ]; then
	    echo $CERT
	    keytool -import -noprompt \
	     -file $CERT -keystore $DIR/self-signed-keystore.jks \
	     -storepass $DEFAULT_PASSWORD -alias self-signed-cert-$INDEX
	    INDEX=$((INDEX+1))
	  fi
    done
    echo "Certificates are imported"
  else
    echo "Use existing keystore"
  fi

  # Update JAVA_OPTS
  export JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.trustStore=$KEYSTORE -Djavax.net.ssl.trustStoreType=JKS -Djavax.net.ssl.trustStorePassword=$DEFAULT_PASSWORD"
else
  echo "$DIR is Empty"
fi

Standard Java-Keystore erweitert um eigene Zertifikate

#!/bin/sh
echo "import_certs.sh"
DIR="/cert"
CURRENT_USER=$(id -u -n)
echo "Current user: $CURRENT_USER"

# /certs is not empty
if [ "$(ls -A $DIR)" ]; then
  echo "$DIR is not Empty"

  KEYSTORE=$DIR/self-signed-keystore.jks
  echo "Keystore is created"

  INDEX=1
  for CERT in $DIR/*; do
	if [ $CERT != $KEYSTORE ]; then
	  echo $CERT
	  keytool -importcert -alias extended-keystore-$INDEX -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -noprompt -file $CERT
	  keytool -keystore "$JAVA_HOME/jre/lib/security/cacerts" -storepass changeit -list | grep extended-keystore-$INDEX
	  INDEX=$((INDEX+1))
	fi
  done
  echo "Certificates are imported"

else
  echo "$DIR is Empty"
fi

Hinweis: Hierbei muss der Java-Keystore editierbar sein. Dies ist mit dem B2B Image seit Dezember 2023 Release automatisch möglich (oder für den User root).

View Me   Edit Me