Docker Tutorial – eigenen Container erstellen
In diesem Tutorial zeige ich euch wie man für Docker einen eigenen Container erstellen kann. Im Gegensatz zu anderen Tutorials verzichte ich auf das langweilige „Hello World“ und widme mich gleich einem praxisnahen Beispiels.
Docker Tutorial – eigenen Container erstellen
Im letzten Docker Tutorial haben wir bereits einen Container mit ubuntu heruntergeladen und kurz ausgeführt. Auf Basis dessen möchte ich nun einen neuen Container bauen. Die Anforderungen sind wie folgt:
Der Container soll ein Programm beinhalten, das ein DVD Image in eine abspielbare Videodatei konvertiert. Ich möchte auf meinem Server ein solches Programm nutzen und dafür keine 3rd Party Software installieren. Der Container soll portabel sein, bei Bedarf heruntergeladen, ausgeführt und danach wieder gelöscht werden. Die Funktion zum Konvertieren eines DVD Images in eine Videodatei brauche ich vielleicht 2 Mal im Jahr, da möchte ich dazu keine Software auf dem Rechner haben.
Recherche
Bevor wir den Container erstellen muss man ein wenig Recherche anstellen. Welche Software ist für die Anforderung geeignet? Ich habe das Open Source Programm HandBrake gefunden. Das gibt es für Ubuntu Linux in einer grafischen Version, kann aber auch ausschließlich über die Kommandozeile genutzt werden. Ideal also für den Einsatz in unserem ubuntu Container. Laut der Ubuntu Seite wird die Software wie folgt installiert:
sudo apt-get install handbrake-cli
Genau das werden wir nun auch für den Container versuchen.
Dockerfile
Ein neuer Container benötigt eine Bauanleitung. Ich denke da immer an ein Lego Set, welches auch eine Anleitung enthält wie man die Teile zusammenbauen muss. Wir erstellen also eine neue Anleitung:
code Dockerfile
Ich verwende Visual Studio Code als Editor. Mit dem Befehl code Dockerfile wird im aktuellen Verzeichnis die Datei Dockerfile erstellt und im Visual Studio Code Editor geöffnet. Achtung: diese Datei hat keine Dateiendung! Man kann dieses Beispiel auch mit Notepad unter Windows 10 nachbauen, da musst du aber unbedingt daran denken die Dateiendung *.txt zu entfernen!
Visual Studio Code erkennt sofort, dass es sich um ein Docker spezifisches File handelt und schlägt vor die Docker Erweiterung zu installieren. Damit haben wir Syntax Highlighting, was überaus hilfreich ist.
FROM ubuntu RUN apt-get -y update RUN apt-get -y install handbrake-cli RUN apt-get -y install ubuntu-restricted-extras RUN DEBIAN_FRONTEND=noninteractive apt -y install libdvd-pkg RUN DEBIAN_FRONTEND=noninteractive dpkg-reconfigure libdvd-pkg
Das Kochrezept für den ersten Container erscheint recht simpel, die Arbeit liegt aber im Detail, weshalb ich mehrere Stunden daran gesessen bin. Basierend auf dem offiziellen minimalen ubuntu Container wird zusätzlich Software installiert. Das ist das Programm Handbrake als CLI Version und danach braucht man noch „Extras“ um auch mit einem Kopierschutz versehene DVDs rippen zu können. Die Installation von libdvd-pkg hat sich dabei als ziemliches Problem herausgestellt, weil es bei der Konfiguration eine Frage mit Ja/Nein Antwort stellt die man interaktiv beantworten muss. Das geht aber bei der Erstellung des Containers nicht. -y beim apt-get beantwortet alle Fragen mit Ja, nicht aber jene der Konfiguration. Nach vielen vergeblichen Versuchen bin ich dann auf DEBIAN_FRONTEND=noninteractive gestoßen, das Problem wird damit behoben.
Image bauen
Mit einem korrekten Bauplan ist der Bau eines Docker Images sehr einfach. Ich muss in meinem Fall lediglich folgendes Kommando ausführen:
docker build -t handbrake .
build baut das im selben Verzeichnis befindliche Dockerfile zu einem Container. Als Argument gibt man den Namen des Containers an. Sofern etwas nicht funktioniert wird das auf der Kommandozeile protokolliert, man hat jederzeit die Information weshalb ein Step nicht funktioniert hat. Die Installation der Software in den minimalen ubuntu Container dauert etwas, da sehr viele Abhändgigkeiten aufgelöst werden müssen.
Anhand der Größe vom Container kann man sich denke ich gut vorstellen, dass das ubuntu Image tatsächlich nur das Notwendigste an Daten enthält.
Praxistest
Ein eigener Container macht nur Sinn, wenn er auch funktioniert. Deshalb lasse ich diesen nun meine Anforderung durchspielen. Die folgende Zeile zeigt wie ich Docker Container ausführe um eine als *.iso gepackte DVD in eine Videodatei umwandle:
docker run -it -v C:\Users\werne\docker:/mnt/extern handbrake HandBrakeCLI -e x264 -E ac3 -i /mnt/extern/dvd.iso -o /mnt/extern/test.mp4
Alles nach HandBrakeCLI sind spezielle Kommandozeilenargumente von Handbrake, diese kann man in der entsprechenden Dokumentation nachlesen. Interessant ist das docker Argument -v. Damit habe ich ein lokales Verzeichnis auf meinem Rechner mit der *.iso Datei in den Docker Container als /tmp/docker Ordner gemounted. Von dort liest Handbrake die DVD und erstellt auch die Ausgabe.
Ein kurzer Test der test.mp4 Datei zeigt, dass der komplette Film wie erhofft in der korrekten Qualität und der korrekten Audiospur als Videodatei gerendert wurde. Der erste Docker Container macht seine Aufgabe wie erwartet.
Wer kennt den Film?
Community
Erst nachdem ich meinen Container fertig gebaut hatte bin ich auf die Idee gekommen den Docker Hub zu probieren. Docker ist deshalb so präsent, da dort jeder Nutzer eigene Dockerfiles hochladen kann. So findet man im Docker Hub unter dem Suchbegriff handbrake zahlreiche andere Container. Mein Bedarf war eine funktionierende Konversion von DVD zu Videodateien. Die Handbrake Suche zeigt, dass man auch mehr haben kann. So gibt es Container die auch das grafische Interface von Handbrake anzeigen können und andere haben weit mehr Videocodecs installiert als nur die von ubuntu. Tatsächlich basieren die anderen Container auf anderen Linux Versionen. Viel ist möglich und man kann dank Docker jegliche, von der Software mögliche Speziallösung bauen. Mein Dockerfile ist super simpel und kurz, beispiele auf Docker Hub zeigen teils sehr komplexe und lange Rezepte.
Fazit
Ich habe gezeigt wie man einen eigenen Container erstellen kann um ein konkretes Problem zu lösen. Docker eignet sich sehr gut um spezialisierte Container für bestimmte Aufgaben zu erstellen die man bei bedarf herunterladen kann und ausführt. Software muss dank Docker nicht mehr auf dem Rechner installiert werden, wenn man diese nur einmal benötigt. Außerdem kann man diesen Docker Container nun auch in der Cloud laufen lassen und bei bedarf flexibel skalieren. In Zusammenarbeit mit Kubernetes könnte man so ein frei verfügbares Service aufstellen, dass DVD Images in Videodateien konvertiert.
Man baut keine Container, sondern Images. Container werden aus den gebauten Images erstellt.
danke für den Input