Inhaltsverzeichnis

bwLehrpool Container-Integration

Mit dem Projekt bwGPUL wurde ein Docker-Container-Service in bwLehrpool integriert, der das native Linux-System bwLehrpools (MaxiLinux) mit nutzerspezifischen Applikationen erweitert. Durch Wegfall der Virtualisierungsschicht steht hierbei die volle Leistung der bwLehrpool-Clients zur Verfügung. Eventuell vorhandene leistungsfähige GPUs (Grafikkarten) können direkt angesprochen werden. Der Arbeitsablauf zur Erstellung einer containerbasierten Lehrveranstaltung entspricht dem üblichen Vorgehen beim Einsatz virtueller Maschinen. Aktuell werden nur Docker-Container unterstützt.

In dieser Anleitung wird beschrieben, wie Docker-Container im bwLehrpool-Kontext erstellt und in Veranstaltungen verlinkt werden. Eine kompletter Leitfaden zum Umgang mit Docker kann hier nicht gegeben werden; weitere Informationen zu Docker finden Sie in der Docker-Referenz.

Erstellung eines Docker-Images

Auswahl des Imagetyps

bwLehrpool-Suite: Auswahl zwischen VM und Container

Den Wizard zur Erstellung eines Docker-Abbildes erreichen Sie nach Auswahl der Schaltfläche „Neues Docker-Image“ (siehe Abb. rechts).

Bitte beachten Sie eventuelle Warnungen unter „Hinweis“. Überprüfen Sie gegebenenfalls wie hier beschrieben, ob eine neue Version der bwLehrpool-Suite zur Verfügung steht.

Anlegen des Container-Images

bwLehrpool-Suite: Container-Image erstellen

Zur Erstellung eines Container-Images stehen Ihnen zwei Möglichkeiten zur Auswahl. Sie können Ihr selbstgebautes Image als Docker-Archive exportieren und hochladen, oder auf bestehende Abbilder aus einem Image-Repositorium, beispielsweise Docker Hub), zurückgreifen.

  1. Docker-Archive ist die bevorzugte Methode, um in bwLehrpool Container-Images anzulegen. Exportieren Sie Ihr erstelltes Image mit docker save und fügen Sie es dem Upload hinzu.
  2. Soll ein bestehendes Image von Docker Hub verwendet werden, geben Sie lediglich den Repository-Namen an (z.b. python:3.7, tensorflow/tensorflow:nightly-gpu-jupyter, etc.).
  3. Geben Sie Ihrem Container-Image einen sprechenden Namen.
Docker-Archive profitieren aktuell von lokalem Caching.
Die Dateiendung für Docker-Archive muss für die bwLehrpool-Suite .tar lauten, ansonsten werden die Dateien in der Auswahl nicht angezeigt.

Prüfen Sie nach dem Exportieren eines Containers-Images („docker save …“), ob das erstellte Docker-Archive passende Dateiberechtigungen besitzt. Eventuell besitzt die Datei Root-Rechte und kann daher nicht in der Suite ausgewählt werden.

Metadaten, Container-Typ

Geben Sie im letzten Schritt dem Container-Image eine Beschreibung und legen den Typ des Container-Image fest.

Beschreibung

Vergeben Sie dem Image eine aussagekräftige Beschreibung mit Informationen wie:

Container-Image-Typ

Der Typ eines Container-Images legt fest, wie dieser in Veranstaltungen oder in anderen Systemen genutzt wird. Derzeit werden zwei Arten unterstützt:

Daten für einen Daten-Container müssen derzeit unter /data/ abgelegt werden! Verwenden Sie zur Erstellung von Daten-Containern kleine Basis-Images wie Alpine oder BusyBox

Nach Angabe der Beschreibung und des gewünschten Imagetyps können Sie wie gewohnt mittels „Weiter“ die Zugriffsberechtigungen Ihres Containers festlegen oder direkt per „Fertigstellen“ die Konfiguration abschließen.

Veranstaltungen mit Docker-Container

Damit ein erstelltes Container-Image in einer Veranstaltung genutzt werden kann, muss eine Veranstaltung erstellt und das Abbild damit verknüpft werden. Der Vorgang hat sich im Vergleich zum Umgang mit „normalen“ VMs nicht wesentlich geändert.

Konfiguration des Containers

Veranstaltungsdetails Containerkonfiguration

Nachdem eine auf ein Container-Image verlinkende Veranstaltung angelegt wurde, muss das Startverhalten des Containers festgelegt werden. Hierzu befindet sich in der Detailansicht der neu erstellten Veranstaltung im Untermenü „Container“ eine Eingabemaske. Dort kann das Verhalten des Containers durch die Menüpunkte „Container-Startoptionen“, „Container-Startbefehl“ sowie eine Mount-Konfiguration angepasst werden.

Zusätzliche Einstellungen

Weitere Einstellungen, welche die Container-Veranstaltung betreffende, können u.a. in den Reitern „Netzlaufwerke“ und „VM-Start“ vorgenommen werden:

Container-Veranstaltungen auf bwLehrpool-Client

Start der Containeranwendung auf einem bwLehrpool-Client

Nach dem Start einer Container-Veranstaltung wird der Desktop des nativen Linux gestartet und der Container mit den Veranstaltungsdetails initialisiert. Im aktuellen Entwicklungsstand öffnet sich nach Start der Desktopoberfläche ein Terminal, in dem der aktuelle Fortschritt der Initialisierung angezeigt wird.

Bei der Initialisierung wird das Image gebaut bzw. geladen oder aus einer Container-Registry gezogen. In nebenstehendem Bild ist beispielhaft eine Initialisierungsphase zu sehen, in der ein vorgebautes Image geladen wurde und die erfolgreich gestartete Containeranwendung zu sehen ist (Nvidia Nsight Eclipse Edition). Zuerst wird der Build-Prozeß anghestoßen, falls das Container-Image noch gebaut werden muß. Die zum Bau des Images benötigte Zeit hängt hierbei von mehreren Faktoren wie Größe des Basis-Images, Anzahl und Komplexität der Instruktionen im Dockerfile, Netzwerkgeschwindigkeit usw. ab

Beispielkonfigurationen

Nachfolgend soll anhand einer Beispielkonfiguration ein Einstieg in Container-Lehrveranstaltungen gezeigt und Informationen zu grafischen Containeranwendungen vermittelt werden.

Beispielkonfiguration - Tensorflow

Im ersten Beispiel soll exemplarisch für den Bereich Machine Learning das Framework Tensorflow mit GPU Unterstützung und der Juptyer Notebook-IDE bereit gestellt werden. Mit der bwLehrpool-Suite wird hierbei zuerst das Container-Image angelegt und dann mit einer Veranstaltung verknüpft. Folgende Schritte sind hierzu auszuführen:

  1. Container-Image in bwLehrpool-Suite angelegen:
    • Image Repository: tensorflow/tensorflow:2.3.3-gpu-jupyter (Docker-Hub)
    • Container-Name: Tensorflow 2.3 GPU Jupyter
  2. Danach wird auf Grundlage dieses Images eine Veranstaltung angelegt:
    1. Veranstaltungsname: Machine Learning mit Tensorflow,
    2. in den Veranstaltungsdetails im Untermenü Container folgende Einstellungen setzen:
      • Container-Startoptionen:
        -itd --rm --name bwlp-tensorflow-gpu --gpus all -p 127.0.0.1:8888:8888
      • Container-Startbefehl:
        jupyter notebook --no-browser --ip=0.0.0.0 --allow-root --NotebookApp.token='easyPw'
      • Bind Mount-Konfiguration:
        • SOURCE USER_HOME TARGET /tf/user_home
  3. Damit ist die eigentliche Konfiguration der Container-Veranstaltung abgeschlossen. Jedoch startet der Container lediglich eine Webanwendung, daher sollte zusätzlich ein Browser mit entsprechender URL zur Webanwendung gestartet werden. Dies erreicht man mit folgendem Skript im Untermenü VM-Start:
    • Skript:
      #!/bin/bash
      sleep 2
      xdg-open http://localhost:8888/?token=easyPw

Grafische Containeranwendungen

Wie in der vorherigen Abbildung angedeutet, können mit Containern Anwendungen mit grafischer Oberfläche, die auf Direktzugriff zur GPUs angewiesen sind, in Container ausgelagert und in Lehrveranstaltungen verwendet werden. Als Beispiel zur Abbildung wurde eine Eclipse-IDE zur CUDA-Programmierung (Nvidia Nsight) verwendet.

Zur Verwendung solcher Container, die grafischen Anwendungen beinhalten, existieren mehrere Lösungsmöglichkeiten. Die erste Option ist hierbei das X11-Forwarding mittels eines in den Container gemounteten X11-Sockets, über den die grafische Oberfläche direkt dargestellt werden kann. Ein zweiter Lösungsansatz besteht in der Verwendung einer rudimentären Desktopumgebung innerhalb des Containers wie beispielsweise Openbox, auf die mit VNC zugegriffen wird. Der Zugriff auf diese Umgebung erfolgt dann schließlich über den Browser, in dem die Anwendung angezeigt wird. (??)

X11-Forwarding

Hierzu muss im Container die auszuführende Anwendung sowie deren Abhängigkeiten installiert sein. Damit die im Container befindliche Anwendung auf dem Bildschirm dargestellt wird, müssen bei Containererzeugung folgende Parameter angegeben werden:

 docker run ... -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix/ ...

Nach erfolgreichem Start des Containers sollte diese dann auf dem Desktop angezeigt werden. Vergleichen Sie hierzu auch „Running X11 applications like xeyes in Docker“, Quelle.

Sicherheitshinweis: Da auf diesem Wege X11 u.a. Maus- und Tastatureingaben abgefangen werden könnten, sollten Sie hierfür nur vertrauenswürdige Software verwenden!

VNC-Ansatz

Dieser Lösungsansatz erfordert deutlich höheren Konfigurationsaufwand, da unterschiedliche Aspekte des Desktops sowie der VNC-Verbindung konfiguriert werden müssen. Als Beispielanleitung hierfür empfiehlt sich das Tutorial „How to remotely access GUI applications using Docker“. Für den Zugriff auf die Desktopumgebung mit der Anwendung muss darauf geachtet werden, dass der konfigurierte VNC-Port erreichbar ist.

 docker run ... -p 8080:VNC_PORT ...
Da Container in der Regel nicht die für die grafische Umgebung notwendigen Bibliotheken beinhalten, werden diese bei der Installation der eigentlichen Anwendung mitinstalliert. Daher nimmt der Bau des Container-Images mehr Zeit in Anspruch. Zudem erhöht sich hierbei die Größe des resultierenden Images. Daher sollten solche Images derzeit noch vorgebaut in bwLehrpool hochgeladen werden.

Ressourcen