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 aktivieren. Auf diesem Container könnt Ihr Euch per ssh einloggen.

In dem Docker-Container habt Ihr 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, passt den Code also entsprechend für Euch 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 dem Docker-Container auf Hopper relevant:

Mit hbv_dockeraktivieren aktivierst Du von Hopper aus Deinen Docker-Container. Danach kannst Du Dich auf Deinem Docker-Container mit ssh mydocker einloggen. Den Docker-Container kannst Du beliebig häufig aktivieren, ohne dass die 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 kannst Du überprüfen, in welchem Zustand der Container ist und welche Ports dazugehören. Mit hbv_dockersystemdf wird in der sechsten Spalte angegeben, wieviel Speicher zusätzlich zu home, html etc. verbraucht wird (docker system df -v).

In dem Docker-Container läuft eine systemweite eigene, nur von Dir nutzbare redis-Instanz. Von hopper ebenso wie aus dem Docker selbst heraus kannst Du mit redis-cli darauf zugreifen. Mit redis beschäftigen wir uns erst im dritten Semester in der Veranstaltung Vernetzte Systeme.

Ebenso kannst Du mit mysql oder mariadb wie von hopper aus auf die systemweit erreichbare MariaDB-Instanz zugreifen. Die Nutzung von Mariadb als Datenbankmanagementsystem behandeln wir im zweiten Semester.

Wenn Du mit Java-Webdiensten experimentieren willst, dann rufe in dem Docker-Container hbv_install-tomcat-mini-demo.sh auf und folge den Instruktionen. Wir behandeln Java-Webanwendungen allerdings erst im vierten Semester in Softwareengineering II.

Ebenso kannst Du dort mit hbv_install-cgi-demo.sh die ersten Schritte einer kleinen cgi-basierten Anwendung in dem Docker-Container gehen. Das machen wir bereits im ersten Semester in STEP.

Schaue Dir auf cgi, wie sich mit bash und cgi Webanwendungen entwickeln lassen.

Jeder Docker-Container hat zehn freie tcp-Ports, mit Du experimentieren kannst. Welche das sind und zu welchem Zweck sie genutzt werden können, erfährst Du 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 Du beispielsweise mit einem eigenen Webserver in einer der verfügbaren Programmiersprachen experimentieren möchtest, um die Prinzipien dahinter zu verstehen, kannst Du 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) überträgst Du den öffentlichen Schlüssel von Deinem Docker-Container auf hopper und trägst ihn in die .ssh/authorized_keys ein, damit Du passwortlos von Deinem Docker-Container auf hopper kommst. 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 beschrieben werden und werden nur beim Aufruf von hbv_dockerloeschen entfernt. Denkt aber bitte daran, dass die Inhalte der Docker-Container nicht in die allgemeine Datensicherung eingehen. Dafür seid Ihr 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ättst Du auf hopper Deine 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 kannst Du Dir auch einen Arbeitsprozess mit git zeigen lassen. Das behandelt wir im zweiten Semester.

Mit hbv_dockerloeschen wird der komplette Docker-Container inklusive der Daten darin gelöscht.

Mit hbv_dockerstatswatch kannst Du für den 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, achtet selbst darauf, dass der Container läuft, wenn Ihr ihn braucht. Jede Nacht werden die Container herunter- und wieder hochgefahren. Wenn Du dann einen Prozess starten lassen willst, lege ein Skript mit dem Namen atreboot.sh in dem Homeverzeichnis des Docker-Containers an oder trage ihn in der crontab ein.

Beim Herunterfahren (auch beim Aufruf von hbv_dockeraktivieren) wird das Skript atstop.sh in dem Homeverzeichnis aufgerufen, wenn es existiert.

Wenn Du also Prozesse hast, die sauber heruntergefahren werden sollen, merken Dir die Prozess-ID in einer Datei beim Start in atreboot.sh und stoppe den Prozess mit kill in atstop.sh

Seit kurzem könnt Ihr neben der allgemeinen Datenbank, die direkt mit mysql oder mariadb erreichbar ist, eine eigene mariadb-Serverinstanz in dem docker-Container verwalten.

Zu diesem Zweck könnt Ihr in dem docker-Container bestimmte Kommandos mit sudo nutzen: sudo -l zeigt die 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)'

Denke unbedingt an ein wirklich sicheres Passwort, das Du am besten mit pwgen erzeugst.

Nun kannst Du 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 kannst Du noch die Zugriffsrechte auf Deinen 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üsst Ihr Euch 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

Schaue auf postgresql, wenn es Sie interessiert.

Mittlerweile gehen wir davon aus, dass Sie ab dem zweiten Semester eine virtuelle Maschine auf dem Notebook installiert haben, in der Ubuntu installiert ist. (virtuelle-umgebung.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


Datenschutz / Impressum