Eines meiner neusten Projekte ist eine Webseite für Besucher sogenannter Sneak-Preview-Vorstellungen in Kinos. Nutzer der Webseite können hier sehen, welcher Film wahrscheinlich in ihrer Sneak gezeigt wird.
Eine Sneak Preview […] ist eine unangekündigte Filmvorführung (Vorschau) vor dem offiziellen Release. Die Besucher wissen beim Kartenkauf nicht, welcher Film gezeigt wird. Die in einer Sneak Preview gezeigten Filme haben ihren offiziellen Kinostart oft erst einige Wochen später.
Auf der Webseite – SneakPrognose.de – können Nutzer eintragen, welche Filme sie zuletzt in der Sneak-Preview in ihrem Kino gesehen haben. Diese Filme werden dann wiederum anderen Nutzern vorgeschlagen, in deren Kino dieser Film bisher nicht lief. Mit Hilfe eines Wertungsalgorithmus, welcher den Kinostart, die Anzahl der Sneaks, in denen der Film gezeigt wurde und das Datum an denen der Film lief einbezogen.
Wie wurde die Webseite gebaut?
Das Projekt beinhaltet ein Front-End, welchs mit Vue.js gebaut wurde, und ein Back-End API-Server welcher mittels NodeJS und Express umgesetzt wurde. Als Datenbank wird ein MariaDB verwendet, mit der über typeORM gesprochen wird.
Alles drei Komponenten wurden als Docker-Image gebaut und integrieren sich in meinen Docker-Stack via Docker Compose.
Während des Programmierens lernte ich Vue.js als Front-End-Umgebung kennen. Hier habe ich versucht ein möglichst responsive Layout zu erstellen, welches für alle Gerätetypen nutzbar ist. In meinem letzten Webseiten-Projekt (Online Poker) habe ich stattdessen React genutzt, und nur eine Desktop-Version implementiert. Ich konnte außerdem meine Kenntnisse in SQL und Express auffrischen.
Im Rahmen eines Fakultativen Projektes an der Uni entwickle ich zusammen mit einer Kommilitonin eine überarbeitete Version meines Online-Poker Systems.
Die Arbeiten sind derzeit in vollem Gange und können im GitLab verfolgt werden.
Geplante Features werden sein:
spiele Online Poker mit deinen Freunden ohne Registrierung/Anmeldung
jederzeit verfügbar hier auf auf owatz.net
erstelle private Lobbies oder tritt öffentlichen Spielen bei
verändere Spieloptionen wie Blinds oder Timout selbst
neues Design in HTML5 und CSS mittels React
Es kann damit gerechnet werden dass das Projekt in den nächsten Wochen zum Beta-Testen online gehen wird.
da neulich das neue Minecraft Update raus kam (1.14) hatte ich mal wieder Lust etwas zu spielen. Deshalb existiert seit kurzen wieder der OwatzNET Minecraft Server. Falls ihr auch mitspielen wollt, schreibt mich ruhig an 🙂
In diesem Beitrag geht es darum, aus fertigen Images Container zu erstellen und diese zu nutzen.
Hinweis: Ich werde nicht erklären, wie man Docker installiert. Wer trotzdem Hilfe braucht wird hier fündig.
Images finden
Um ein Docker Image erstellen zu können muss man dessen Namen kennen. Docker ist Standardmäßig auf die Registry DockerHub voreingestellt. Hier liegen eigentlich alle öffentlich zugänglichen Images. Schaut doch mal selber rein und erforscht ein paar Seiten. Hier finden sich dann auch oft wichtige Informationen dazu, wie man die Images benutzt und welche unterschiedlichen Versionen (Tags) es gibt. Dazu mehr im nächsten Beitrag.
Beispiel nginx
Wir nutzen als Beispiel nun das Image nginx (ein simpler Webserver). Normalerweise besitzen Images einen Ersteller und einen Namen im Schema „ersteller/name“. In diesem Fall ist es allerdings ein Image welches zur DockerHub Standard Bibliothek gehört. Deshalb nur der einfache Name nginx.
Wir werden nun erstmal versuchen einen einfachen Container zu erstellen und die nginx-Landingpage im Webbrowser aufzurufen. Dafür benötigen wir einige Befehle.
Docker CLI
Die wichtigsten Docker Befehle sind:
Befehl
Beschreibung
docker create
Erstellt einen neuen Container aus einem Image
docker start
Startet einen bestehenden Container
docker stop
Stoppt einen bestehenden Container
docker attach
Verbindet die Bash Ein/Ausgabe mir dem im Container laufenden Prozess
docker exec
Führt einen Befehl in einem Container aus
docker run
Erstellt einen neuen Conatiner aus einem Image und führt einen Befehl darin aus
docker ps
Listet alle erstellten Container auf
docker images
Listet alle heruntergeladenen Images auf
docker rename
Container umbenennen
docker rm
Container löschen
docker rmi
Images löschen
Mehr lassen sich mit docker –help auflisten. Zu dem jeweiligen Befehl gibt es auch immer eine Hilfeseite. Desweitern gibt es Dokumentation hier.
Beispiel Container starten
Nun laden wir zunächst das Image runter und erstellen den Container mittels:
Dies erstellt einen Container mit dem namen „nginx-test“. Der -p Parameter steht für publish und gibt den internen Port 80, der nur im Docker-internen Netzwerk zur Verfügung steht an die Host-Maschine auf Port 8080 frei. Das benutzte Image steht am Ende. Woher weiß ich welchen Port ich veröffentlichen muss? Das ist von Image zu Image unterschiedlich und findet ihr auf der entsprechenden Docker Hub Seite. 8080 habe ich mir frei ausgesucht.
Unser Container ist jetzt erstellt, aber noch nicht gestartet. Dies können wir mittels docker start tun. Hier sieht man wieso es sinnvoll ist seinen Containern Namen zu geben:
docker start nginx-test
Der Conatiner läuft nun im Hintergrund und wir sollten in der Lage sein per Webbrowser die Standard-Nginx-Seite zu sehen, auf http://localhost:8080/
nginx-Startseite unter localhost:8080
Eine Übersicht bekommen
Wir können auch mal nachschauen was unser Container so macht, mittels:
docker ps
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3ce09f2cbce nginx "nginx -g 'daemon of…" 8 minutes ago Up 8 minutes 0.0.0.0:8080->80/tcp nginx-test
Wir sehen hier welche Container zur Zeit erstellt sind, in welchem Status sie sich befinden und welche Ports sie freigegeben haben. Sehr nützlich.
Spielt auch ruhig mit den anderen Befehlen aus der Tabelle oben etwas herum. Starten, stoppen, löschen, erstellen etc.
In den Container gehen
Docker Container sind in sich abgeschlossen. Man sollte sie also im betsen Fall nur starten und stoppen müssen. Alles was darin vorgeht ist uns egal. Manchmal ist es jedoch trotzdem nützlich in einen Container zu bashen um beispielsweise Fehler zu suchen oder Programme zu testen. Es gibt dafür 2 Möglichkeiten:
docker attach verbindet euch mit dem gerade im Container laufenden Prozess. Vorsicht, wenn ihr hier mittels Strg+C verlassen wollt, beendet ihr den Haupt-Prozess und damit den Container! Zum abkapseln nutzt ihr Strg+P, Strg+Q
docker exec -it <Container Name> /bin/bash startet einen neuen Terminal Prozess im Container (bin/bash wird ausgeführt) und verbindet euch dann mit diesem. -ti sind eigentlich zwei Parameter, die benötigt weden um ein Terminal zu emulieren. Auch hier gilt, Strg+C beendet den Terminal Prozess!
Was noch kommt
Was jetzt noch fehlt ist:
Wie bringe ich meine Datein in den Container?
Wie verbinde ich meine Container untereinander?
Wie kreiere ich meine eigenen Container?
All das wird in den nächsten Parts dieser Reihe folgen. Falls ihr noch Fragen habt, schreibt sie mir gerne. Ich vervöllständige bei Bedarf dann diesen Post.
Wie manche vielleicht mitbekommen haben war diese Webseite und andere von mir angebotene Dienste die letzten zwei Wochen nicht erreichbar.
Die Störung lag daran, dass mein bisheriger Server-Provider das Geschäft unerwartet geschlossen hat. Ich bin nun zu einem neuen Provider gewechselt, bei dem hoffentlich keine weiteren Probleme auftreten.
Dies Haupt-Webseite funktioniert schon wieder. Alle anderen Dienste sollte ich hoffentlich über die nächsten Tage wieder hergestellt haben.
Docker ist heutzutage schon fast Standard wenn es um Server Anwendungen geht. Auch ich bin von der Container-Technik grundauf begeistert. Wenn du dich damit noch nicht auskennst ist das jedoch keine Schande. Nachdem du diese kleine Reihe an Blog-Posts gelesen hast, bist auch du fit, was Docker angeht.
Was ist so toll an Docker?
Beginnen wir doch damit: Was ist überhaupt Docker?
Docker ist eine Freie Software zur Isolierung von Anwendungen mit Containervirtualisierung.
Das bedeutet du kannst (Server-)Anwendungen super simpel installieren und konfigurieren ohne dass sie sich mit anderen Anwendungen in den Weg kommen. Du brauchst verschiedene Versionen von PHP für verschiedene Apps? Kein Problem! Die Anwendund läuft nur auf bestimmten Linux-Distros? Nicht mit Docker!
Im Grunde laufen die Anwendungen einfach so, wie der Entwickler es gewollt hat, ohne dass du großartig Arbeit in das Installieren und stecken musst. Dieser nervige Schritt entfällt also. Und oben drauf gibt es noch nützliche Funktionen von Port-Forwarding bis zu Load-Balancing mittels Docker Swarm.
Doch Docker ist keine Virtuelle Maschine
Zumindest nicht so ganz. Die Anwendungen werden zwar isoliert auf ihre eigenen Dateisysteme, ihre eigenen Systembibliotheken etc. doch die Prozesse laufen alle direkt auf dem Hauptsystem. Damit besitzen sie fast die gleiche Performane wie wenn ich sie direkt installieren würde.
Prozesse aus Containern und der Docker Deamon laufen alle zusammen auf dem Host System
Hinweis: Was man hier auch sieht ist, dass viele Anwendungen als root laufen. Was genau das bedeutet, welche Auswirkungen das hat und wie man dagenen vorgehen kann wird in einem anderen Blogpost erklärt.
Begriffe
Um alles richtig zu verstehen ist es wichtig ein paar Begriffe zu kennen. Hier hat Wikipedia eine super Übersicht aus der ich mal zitiere:
Image Ein Speicherabbild eines Containers. Das Image selbst besteht aus mehreren Layern, welche schreibgeschützt sind und somit nicht verändert werden können. Ein Image ist portabel, kann in Repositories gespeichert und mit anderen Nutzern geteilt werden. Aus einem Image können immer mehrere Container gestartet werden. Container Als Container wird die aktive Instanz eines Images bezeichnet. Der Container wird also gerade ausgeführt und ist beschäftigt. Sobald der Container kein Programm ausführt oder mit seinem Auftrag fertig ist, wird der Container automatisch beendet. Layer Ein Layer ist Teil eines Images und enthält einen Befehl oder eine Datei, welche dem Image hinzugefügt wurde. Anhand der Layer kann die ganze Historie des Images nachvollzogen werden. Dockerfile Eine Textdatei, welche mit verschiedenen Befehlen ein Image beschreibt. Diese werden bei der Ausführung abgearbeitet und für jeden Befehl ein einzelner Layer angelegt. Repository Ein Repository ist ein Satz gleichnamiger Images mit verschiedenen Tags, zumeist Versionen. Registry Eine Registry, wie zum Beispiel Docker Hub oder Artifactory, dient der Verwaltung von Repositories.
Du befindest dich hier weil du dich entweder für meine Hosting Setup interessierst oder aus Kuriosität https://s.owatz.net/ besucht hast. In beiden Fällen erkläre ich hier gerne, wie mein Quick Share Service funktioniert.
Wofür genau ist s.owatz.net?
Ich benutze die Subdomain s.owatz.net für 2 Dinge:
Dateien sowie Bilder die ich teilen möchte auf meinen Server hochladen und dort öffentlich (nur mit Link) zur Verfügung zu stellen
Shortlinks erstellen/Links kürzen
Ich möchte beispielsweise schnell ein Bild von der Katze meiner Freundin teilen? Ich lade es schnell hoch, erstelle einen kurzen Link der dann so aussieht: https://s.owatz.net/4nhrg und diesen kann ich dann an Freunde schicken.
Wie funktioniert das?
Server Part
Owatz Quick Share Infografik
Auf meinem Server läuft eine Dockerinstanz, so dass jede Web-App seinen eigenen Container besitzt. (Mehr dazu in meiner Blog Reihe über meinen VPS) Um Quick Share möglich zu machen habe ich selbst ein Dockerimage erstellt. Dieses besteht aus 2 PHP Apps:
Image Hosting
Dafür verwende ich Chevereto in der kostenlosen Variante. Chevereto ist eine PHP App die es erlaubt Bilder hochzuladen, zu verwalten und öffentlich bereitzustellen. Sie kann noch viel mehr als für was ich sie benutze, jedoch benötige ich so viel Funktionalität gar nicht.
Ein wichtiges Feature von Chevereto ist die API mit der man Bilder auch ohne die Weboberfläche hochladen kann. Das ist später wichtig.
Link Shortening
Dazu nutze ich YOURLS. Ebenfalls eine PHP App, die wunderbar ist um URLs zu kürzen. YOURLS bietet wenig Schnickschnack kann aber mit diversen Plugins erweitert werden. Eine API Schnittstelle ist auch hier mit dabei.
Client Part
Um beide APIs von meinem Rechner aus anzusprechen kommt ein Tool namens ShareX zu Hilfe. Dieses Windows-only Programm ist mehr als nur ein Screenshot Hotkey. Es kann so eingestellt werden, dass es mit jeder API per Knopfdruck kommuniziert. Chevereto und YOURLS sind sogar schon voreingestellt mit dabei. Für andere APIs kann man jedoch sogar selbst Schablonen bauen.
Mit Hilfe von ShareX kann ich mit einem Knopfdruck einen Screenshot aufnehmen, ihn hochladen und eine kurze URL in meiner Zwischenablage finden.
Doch nicht nur Bilder funktionieren mit ShareX. Für Dateien oder Texte lassen sich andere Dienste als Ziel festlegen. So habe ich beispielsweise auch meine Nextcloud verknüpft.
Warum der ganze Aufwand?
Sicher gibt es auch einfachere Lösungen die einen Klick entfernt im Internet zur Verfügung stehen. Imgur, bit.ly oder was auch sonst.
Es ist mir jedoch wichtig, die volle Kontrolle über meine Daten zu haben. Dass private Bilder von mir auf irgendwelchen Servern in den USA oder anderen Ländern liegen, von kommerziellen Unternehmen gesteuert die damit machen können was sie wollen breitet mir Bauchschmerzen.
Sicher ist eine fertige Lösung für den normalen Nutzer einfacher und ich kritisiere diese auch nicht. Wenn man jedoch die Fähigkeiten besitzt sich ein solchen Dienst selbst zu bauen, wieso nicht?
Am Ende lernt man dazu und hat auch noch etwas Nützliches für den täglichen Gebrauch geschaffen.
mein Server ist neulich gecrasht. Vieles konnte ich durch vorhandene Backups retten, dazu zählen vorallem private backend Services und das EutarUnion Wiki. Andere Dinge sind verschollen gegangen oder habe ich absichtlich nicht aus dem Backup geladen weil sie veraltet waren.
Diese Webseite gehört zu den Dingen die komplett verschollen gegangen sind. Ich habe die wichtigsten Teile schon wieder aufgesetzt, der Rest folgt in den nächsten Tagen.
Ich hoffe die Downtime hat niemanden zu sehr gestört. Habt noch einen schönen Tag.