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 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.
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