Schlagwortself hosting

Docker 2: Container erstellen

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:

BefehlBeschreibung
docker createErstellt einen neuen Container aus einem Image
docker startStartet einen bestehenden Container
docker stopStoppt einen bestehenden Container
docker attachVerbindet die Bash Ein/Ausgabe mir dem im Container laufenden Prozess
docker execFührt einen Befehl in einem Container aus
docker runErstellt einen neuen Conatiner aus einem Image und führt einen Befehl darin aus
docker psListet alle erstellten Container auf
docker imagesListet alle heruntergeladenen Images auf
docker renameContainer umbenennen
docker rmContainer löschen
docker rmiImages 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:

docker create --name "nginx-test" -p 8080:80 nginx

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.

Docker: 1 – Einführung

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.

Docker (Software) – Wikipedia

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.

Docker (Software) – Wikipedia

Im nächsten Part wird gezeigt wie man Container mit Docker erstellt. Bleibt dran!

© 2021 Conrad Owatz

Theme von Anders NorénNach oben ↑