Prof. Dr.-Ing. Oliver Radfelder
Informatik / Wirtschaftsinformatik
Hochschule Bremerhaven
Docker

Auf einem unserer Server (turing) läuft Docker. Alle, die einen Account auf hopper haben, können dort einen eigenen Container mit ssh, Apache, tomcat, LaTeX, redis, gnuplot und anderen freien Werkzeugen ausgestatteten Container aktivieren. Auf diesem Container können sie sich per ssh einloggen.

In dem Docker-Container haben Sie einen Account nach dem Muster docker-<HopperUser>. Der User demo hat auf seinem Container also einen Account docker-demo. Der folgende Text bezieht sich immer auf diesen Account, passen Sie den Code also entsprechend für sich an.

In dem Docker-Container läuft ein kleiner Apache, auf den für den User demo die URL
https://informatik.hs-bremerhaven.de/docker-demo-web/
gelenkt wird. Html-Dateien werden in dem Docker-Container in dem Verzeichnis /var/www/html/docker-demo-web/ bearbeitet.

Folgende Befehle sind im Zusammenhang mit Ihrem Docker-Container relevant:

Mit hbv_dockeraktivieren aktivieren Sie Ihren Docker-Container. Danach können Sie sich auf Ihrem Docker-Container mit ssh mydocker einloggen. Ihren Docker-Container können Sie beliebig häufig aktivieren, ohne dass die von Ihnen dort gesicherten Daten gelöscht werden. Die Systemadministration wird jede Nacht automatisiert diesen Befehl ausführen. Dabei wird der Docker-Container entfernt und mit dem aktuellen Image neu gestartet.

Mit hbv_dockerpruefen können Sie überprüfen, in welchem Zustand Ihr Container ist und welche Ports Ihnen gehören.

In Ihrem Docker-Container läuft eine systemweite eigene, nur von Ihnen nutzbare redis-Instanz. Von hopper ebenso wie aus dem Docker selbst heraus können Sie mit redis-cli darauf zugreifen. Ebenso können Sie mit mysql oder mariadb wie von hopper aus auf Ihre systemweit erreichbare MariaDB-Instanz zugreifen.

Wenn Sie mit Java-Webdiensten experimentieren wollen, dann rufen Sie in Ihrem Docker-Container hbv_install-tomcat-mini-demo.sh auf und folgen den Instruktionen.

Ebenso können Sie dort mit hbv_install-cgi-demo.sh die ersten Schritte einer kleinen cgi-basierten Anwendung in Ihrem Docker-Container gehen.

Schauen Sie auf cgi, wie sich mit bash und cgi Webanwendungen entwickeln lassen.

Jeder Docker-Container hat zehn freie tcp-Ports, mit denen Sie experimentieren können. Welche das sind und zu welchem Zweck sie genutzt werden können, erfahren Sie mit dem Aufruf hbv_dockerpruefen auf hopper. Einige dieser Ports haben eine eigene Repräsentation in unserem Informatik-Webserver. So wird die Url https://informatik.hs-bremerhaven.de/docker-demo-web/ auf das Verzeichnis /var/www/html/docker-demo-web/ in dem Docker-Container des Users demo weitergeleitet.

Eine weitere URL, die weitergeleitet wird, ist https://informatik.hs-bremerhaven.de/docker-demo-http/. Wenn Sie beispielsweise mit einem eigenen Webserver in einer der verfügbaren Programmiersprachen experimentieren möchten, um die Prinzipien dahinter zu verstehen, können Sie in dem Docker-Container einen http-Dienst auf Port 4000 starten. Dann werden Anfragen über https mit der obigen URL dort hingelenkt. Beispielsweise lässt sich mit php -S 0.0.0.0:4000 ein kleiner (nicht für den Produktionsbetrieb gedachter) PHP-Webserver starten. Ähnlich kurz geht es natürlich mit node, go oder java ...

ssh mydocker
mkdir mywebserver
cd mywebserver
mkdir $USER-http/
echo 'Moin' > $USER-http/index.html
php -S 0.0.0.0:4000

Mit hbv_dockerssherlauben (auf hopper) übertragen Sie den öffentlichen Schlüssel von Ihrem Docker-Container auf hopper und tragen ihn in Ihre .ssh/authorized_keys ein, damit Sie passwortlos sich von Ihrem Docker-Container auf hopper einloggen können. Zur automatisierten Nutzung von git ist das beispielsweise notwendig.

Die Inhalte der Verzeichnisse /home/docker-demo/, /var/www/html/docker-demo-web/ und /usr/lib/cgi-bin/ können von Ihnen beschrieben werden und werden nur beim Aufruf von hbv_dockerloeschen entfernt. Denken Sie aber bitte daran, dass die Inhalte der Docker-Container nicht in die allgemeine Datensicherung eingehen. Dafür sind Sie selbst verantwortlich. Der empfohlene Weg ist daher, mit ssh und scp das Arbeiten mit den Docker-Containern zu automatisieren:

#!/bin/bash
# deploy-to-docker.sh auf hopper
scp -q -r work/ mydocker:
ssh mydocker work/run.sh

Oder in einem Schritt:

#!/bin/bash
# deploy-to-docker.sh auf hopper
ssh mydocker bash -s < init.sh

In diesem Beispiel hätten Sie auf hopper Ihre Arbeitsumgebung mit einem work-Verzeichnis, das vollständig (-r) auf den Docker-Container in das Home-Verzeichnis kopiert wird. In dem Skript work/run.sh steht der Code, der auf dem Docker-Container ausgeführt wird. Das kann ein einfaches einmaliges Kopieren sein. Oft findet sich dort jedoch ein Initialisierungsskript, das einen Prozess mit nohup ... & startet, dessen Prozess-id sichert und beim nächsten Mal diesen Prozess beendet.

Natürlich können Sie sich auch einen Arbeitsprozess mit git zeigen lassen ...

Mit hbv_dockerloeschen wird Ihr kompletter Docker-Container inklusive Ihrer Daten darin gelöscht.

Mit hbv_dockerstatswatch können Sie sich für Ihren Docker-Container eine kontinuierliche Statistik anzeigen lassen.

In dem Docker-Container sind folgende Anwendungen installiert:

Also vieles zum Experimentieren ...

Da die Docker-Container regelmäßig heruntergefahren werden, achten Sie selbst darauf, dass Ihr Container läuft, wenn Sie ihn brauchen. Jede Nacht werden die Container herunter- und wieder hochgefahren. Wenn Sie dann einen Prozess starten wollen, legen Sie ein Skript mit dem Namen atreboot.sh in dem Homeverzeichnis des Docker-Containers an. Beim Herunterfahren (auch beim Aufruf von hbv_dockeraktivieren) wird das Skript atstop.sh in dem Homeverzeichnis aufgerufen, wenn es existiert.

Wenn Sie also Prozesse haben, die sauber heruntergefahren werden sollen, merken Sie sich die Prozess-ID in einer Datei beim Start in atreboot.sh und stoppen Sie den Prozess mit kill in atstop.sh

Seit kurzem können Sie neben der allgemeinen Datenbank, die Sie direkt mit mysql oder mariadb erreichen, eine eigene mariadb-Serverinstanz in Ihrem docker-Container verwalten.

Zu diesem Zweck können Sie in dem docker-Container bestimmte Kommandos mit sudo nutzen: sudo -l zeigt Ihnen Ihre Möglichkeiten.

sudo /etc/init.d/mariadb start
sudo -u mysql mariadb -e "drop database if exists xyz; 
drop user if exists xyzuser@'localhost';
drop user if exists xyzuser@'%';
create database xyz;
create user xyzuser@'localhost' identified by 'complexpassword';
grant all privileges on xyz.* TO xyzuser@'localhost';
flush privileges;"

echo '[client]
user=xyzuser
password=complexpassword
host=localhost

[mariadb-client]
database=xyz
' > ~/.my-localhost.cnf
chmod go-rwx ~/.my-localhost.cnf

mariadb --defaults-file=~/.my-localhost.cnf \
  -e 'create table holla (id integer)'

Denken Sie unbedingt an ein wirklich sicheres Passwort, das Sie am besten mit pwgen erzeugen.

Nun können Sie sich auch die typische DVD-Rentals-Datenbank (sakila, github-sakila) in den Docker-Container kopieren, auspacken und importieren.

scp /home/common/data/sakila-db.tar.gz mydocker:
ssh mydocker
tar -zxvf sakila-db.tar.gz
cd sakila-db
sudo -u mysql mariadb < sakila-schema.sql
sudo -u mysql mariadb < sakila-data.sql
sudo -u mysql mariadb sakila -e 'show tables'

Damit lässt sich hervorragend SQL einüben. Im nächsten Schritt könnten Sie noch die Zugriffsrechte auf Ihren User erweitern:

sudo -u mysql mariadb -e "GRANT ALL PRIVILEGES ON sakila.* TO xyzuser@'%'"

Wie der tomcat wird die mariadb-Instanz nicht automatisch beim Aktivieren des Containers wieder gestartet. Darum müssen Sie sich in atreboot.sh und atstop.sh selbständig kümmern.

Das Gleiche gilt für postgresql:

sudo /etc/init.d/postgresql start
echo 'create database xyzpostgres'|sudo -u postgres psql

Schauen Sie auf postgresql, wenn es Sie interessiert.

Mittlerweile gehen wir davon aus, dass Sie ab dem zweiten Semester eine virutelle Maschine auf dem Notebook installiert haben, in der Ubuntu installiert ist. (docker-tools.html).

Darin können Sie nun die gleichen Schritte durchführen, wie im docker-Container. Allerdings funktioniert dort im Gegensatz zu den dockern auch systemd als Init-System.

sudo apt install mariadb-server
sudo systemctl status mariadb # enabled and active (running)

Nun können wir innerhalb der VM wie oben eine Datenbank installieren und mit mariadb darauf zugreifen.

Unter MacOS lässt sich mariadb mit brew installieren. Allerdings wird dort wohl ssl im default erzwungen. Daher nehmen wir dort noch ssl=0 im Abschnitt client mit auf.

Und das Ganze als Videos

Denken Sie daran, dass Sie das Video zwischendurch anhalten können, um die Schritte einzeln für sich nachvollziehen zu können. Oder schauen Sie es sich an, machen sich Notizen und versuchen Sie das Vorgehen anhand der Notizen nachzuvollziehen. Üben Sie das so lange, bis Sie es aus dem Kopf ohne nachzuschauen beherrschen.

Docker-Container aktivieren und einloggen


Docker-Container und cgi


Mit tmux und redis auf hopper und im Docker-Container