Dies ist eine alte Version des Dokuments!


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 erweitern kann. Durch Wegfall einer Virtualisierungsschicht steht hierbei die volle Leistung der bwLehrpool-Clients zur Verfügung. Eventuell vorhandene leistungsfähige GPUs (Grafikkarten) werden ebenfalls direkt angesprochen. 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 per 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-Image

bwLehrpool-Suite: Container-Image erstellen

Für die Erstellung eines Container-Images stehen Ihnen verschiedene Möglichkeiten zur Auswahl. Sie können dabei das Image bauen lassen (aus einem Dockerfile oder über ein Git-Repository) oder auf bestehende Abbilder aus einem Image-Repositorium zurückzugreifen (beispielsweise auf Docker Hub).

  1. Falls eins eigenen Images gebaut werden soll, nutzten Sie die Eingabeoptionen „Dockerfile“ oder „Git Repository“.
    • Dockerfile: Nutzten Sie hierzu die Anleitung https://docs.docker.com/engine/reference/builder/ um ein eigenes Dockerfile zu erstellen.
    • Git Repository: Für komplexere Images können Sie auch, entsprechend der Docker-Build-Anleitung einen Link auf ein Git Repository angeben. Hierdurch ist es beispielsweise möglich weitere Dateien wie eine Konfiguration oder Skripte dem endgültigen Image hinzuzufügen.
  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. Vergeben Sie einen Namen für Ihre Definition eines Container-Images
Der Bau von Container-Images findet derzeit noch auf Clients statt. Sollte dies zu viel Zeit in Anspruch nehmen, können Sie dem Upload auch ein vorgebautes Container-Image hinzufügen (docker save). Das Bauen eines Images soll in einem späteren Schritt im bwLehrpool System erfolgen

Metadaten, Container-Typ

Zuletzt geben Sie wie gewohnt 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:

  • Welches Quell-Image wird benutzt und von wo es stammt.
  • Welche Anwendung in dem Container enthalten ist und in welcher Version.

Container-Image-Typ

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

  • Pool(Default): Ein einfaches Container-Image, das rein zur Verwendung auf bwLehrpool-Clientrechnern erstellt wurde.
  • Daten: Ein spezielles Container-Images, das nur Daten enthält. Beispielsweise können so einen Daten-Container mit Trainingsdaten für Machine-Learning (Mnist, ImageNet, CIFAR, …) bereitstellen.

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 die Veranstaltung mit einem Abbild verknüpft werden. Der Vorgang zur Erstellung hat sich im Vergleich zum Umgang mit „normalen“ VMs nicht wesentlich geändert.

Konfiguration des Containers

Veranstaltungsdetails Containerkonfiguration

Nachdem die Veranstaltung mit einem Container Image angelegt ist, muss durch eine spezifische Konfiguration das Startverhalten des Containers festgelegt werden. Hierzu befindet sich in Detailansicht der neuen Veranstaltung im Untermenü „Container“ eine Eingabemaske. Hier kann das Verhalten des Containers durch die Menüpunkte „Container-Startoptionen“, „Container-Startbefehl“ sowie eine Mount-Konfiguration angepasst werden.

  • Container-Startoptionen: Geben Sie hier die zur Ausführung Ihres Containers nötigen Parameter an, beispielsweise
    -itd -p 8888:8888 --name container-name

    . Nutzen Sie die Docker Dokumentation als ausführliche Referenz zum Festlegen der Optionen.

  • Container-Startbefehl: Bei der Erstellung eines Containers wird durch die im Dockerfile enthaltenen Angaben ENTRYPOINT bzw. CMD festgelegt, welche und wie die Containeranwendung gestartet wird. Durch Überschreiben dieser Angaben können Sie das Verhalten der genutzten Anwendung Ihren Wünschen entsprechend anpassen (siehe Dockerreferenz).
  • Bind Mount-Konfiguration: Geben Sie hier die Verzeichnisse an, die in den Container hineingemountet werden sollen. Unter „SOURCE“ finden Sie vordefinierte Labels für eine Quelle. „USER_HOME“ stellt das Home Verzeichnis des angemeldeten Users dar, „USER_TMP“ einen Bereich in /tmp. Die Buchstaben sind als Laufwerkbuchstaben zu betrachten und referenzieren ein Netzlaufwerk, das in den Veranstaltungsdetails festgelegt werden kann. „TARGET“ stellt das Zielverzeichnis innerhalb des Containers dar, in das die Quelle gemountet wird. Weitere Informationen zur Anwendung von Bind Mounts finden Sie in der Docker-Dokumentation.

Zusätzliche Einstellungen

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

  • Netzlaufwerke: Hier können Netzlaufwerke hinzugefügt werden, die im Basissystem eingebunden werden. Diese können dann über den Laufwerksbuchstaben für Bind Mounts referenziert und so in den Container durchgereicht werden.
  • VM-Start: Wie sonst auch kann hier ein Skript abgelegt werden. Bei „normalen“ VM-Veranstaltungen wird das Skript direkt nach dem Start der VM ausgeführt. Bei Veranstaltungen, die einen Container beinhalten, wird analog dazu zuerst der Container gestartet und anschließend das Skript ausgeführt. So können beispielsweise Programme gestartet werden, die mit der Anwendung aus dem Container kommunizieren. Hinweis: Andere Einstellungen in diesem Konfigurationsfenster werden im Kontext von Container ignoriert.

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 gepullt. Im Bild ist beispielhaft eine Initialisierungsphase dargestellt, in der ein vorgebautes Image geladen wird, auch ist bereits die erfolgreich gestartete Containeranwendung zu sehen (Nvidia Nsight Eclipse Edition). Muss das Container-Image noch gebaut werden, wird zuerst Build-Prozess angestoßen. Die benötigte Zeit, um das Image zu bauen, hängt hierbei von mehreren Faktoren ab (Größe des Basis-Image, Anzahl und Komplexität der nachfolgenden Instruktionen im Dockerfile, Netzwerkgeschwindigkeit, etc.).

Beispielkonfigurationen

Nachfolgend soll anhand einer Beispielkonfiguration der Einstieg in Container Lehrveranstaltungen geschaffen werden. Zudem sollen Informationen und erste Erfahrungen mit grafischen Containeranwendungen vermittelt werden.

Beispielkonfiguration - Tensorflow

In diesem ersten Beispiel soll exemplarisch für den Bereich Machine Learning das Framework Tensorflow mit GPU Unterstützung und der Juptyer Notebook IDE bereit gestellte werden. Über die bwLehrpool-Suite muss hierbei zuerst das Container-Image angelegt, und dann mit einer Veranstaltung verknüpft werden. Folgende Schritte sind dabei 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 werden die folgenden Einstellungen gesetzt:
      • 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 Configuration:
        • SOURCE USER_HOME TARGET /tf/user_home
  3. Danach ist die eigentliche Konfiguration der Veranstaltung mit dem Container abgeschlossen. Jedoch startet der Container nur eine Webanwendung, daher will man zusätzlich noch ein Browser mit der entsprechenden URL zu der Webanwendung starten. Dies erreicht man mit dem folgenden Skript in dem Untermenü VM-Start
    • Skript:
      #!/bin/bash
      sleep 2
      xdg-open http://localhost:8888/?token=easyPw

Grafische Containeranwendung

Wie in der vorherigen Abbildung gezeigt, ist es mit Container auch möglich Anwendungen mit einer grafischen Oberfläche diese in ein Image auszulagern und diese in Lehrveranstaltungen zu verwenden, welche auf GPUs angewiesen sind. Für eine solche Veranstaltung musste in der Entwicklungsphase solch ein Container erstellt werden. Die Anwendung war hierbei eine spezifische Eclipse IDE für die CUDA-Programmierung (Nvidia Nsight). Dieses Vorgehen erlaubte eine erfolgreiche Durchführung einer Laboreinheit mit Studierende.

Für die Realisierung solcher Container mit grafischen Anwendungen existieren mehrere Lösungsmöglichkeiten. Die erste Option ist hierbei das X11-Forwarding, in welcher der X11-Socket in den Container gemountet wird und somit in der Lage ist grafische Oberflächen direkt darzustellen. Ein zweiter Lösungsansatz ist die Erstellung einer rudimentären Desktopumgebung beispielsweise mit OpenBox und eines VNC-Ansatzes. Der Zugriff auf diese Umgebung erfolgt dann schließlich über den Browser, in dem die Anwendung angezeigt wird.

X11-Forwarding

Für diesen Ansatz muss im Container lediglich die auszuführende Anwendung sowie dessen Abhängigkeiten installiert sein. Damit die Anwendung aus dem Container auf dem Bildschirm dargestellt wird, müssen lediglich die folgenden Parameter bei Containererzeugung angegeben sein:

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

Nach einem erfolgreichen Start des Containers mit der Anwendung, sollte diese dann auf dem Desktop zu sehen sein. Der Blogbeitrag wurde hierbei als Referenz für den eigenen Ansatz genutzt.

Sicherheitshinweis: Wie in der Referenz bereits hingewiesen ist, sollte nach diesem Vorgehen nur Software genutzt werden, welcher Sie vertrauen.

VNC-Ansatz

Der Konfigurationsaufwand bei diesem Lösungsansatz ist bei der Erstellung des Container-Images wesentlich höher. Hierbei müssen unterschiedliche Aspekte des Desktops sowie der VNC-Verbindung installiert und konfiguriert werden. Die Erstellung des eigenen Images wurde nach dem Tutorial von Digital Ocean erstellt. Für den Zugriff auf die spezielle Desktopumgebung mit der Anwendung muss lediglich darauf geachtet werden, dass der konfigurierte VNC-Port erreichbar ist.

 docker run ... -p 8080:VNC_PORT ...
Da Container in der Regel nicht die grafischen Bibliotheken besitzen, werden diese ebenfalls bei der Installation der eigentlichen Anwendung mitinstalliert. Das führt dazu, dass der Bau von Container-Images mehr Zeit in Anspruch nimmt. Zudem erhört sich hierbei auch enorm die Größe des resultierenden Images. Daher sollten solche Images derzeit noch vorgebaut in bwLehrpool hochgeladen werden.

Ressourcen

  • Die Quellen der erstellen Container-Images für nvidia-nsight können in dem Repository eingesehen werden.
  • Vorgebaute Images sind öffentlich auf DockerHub verfügbar
    # run vnc container,  visit with browser localhost:8080
    docker run -itd --name nsight-vnc -p 8080:8080  ralphhso/nvidia-nsight-vnc:latest
    # run x11 container
    docker run -itd --name nsight-x11 -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix/ ralphhso/nvidia-nsight-x11:latest
Drucken/exportieren