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