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