Docker - Einstieg

Aus Laub-Home Wiki

Ich versuche hier mal einen guten, einfachen Einstieg in die Welt der Docker Container zu schaffen. Zuerst gehe ich mal darauf ein, was die Idee von Docker ist und was dies für die heutige IT bedeutet. Ich versuche mal alle Buzzwords, die man mit Docker in Verbindung bringt zu erläutern und komme dann zur Installation der Docker Engine. Zu guter letzt komme ich noch zu ein paar Standard Befehlen, die einem das Leben leichter machen. Weiterführende Links sind natürlich obligatorisch.

Docker? Container? Images?

Was ist denn nun dieses Docker und was ein Container. Docker ist ein System Daemon, der es einem erlaubt Docker Container zu hosten. Ein Container (Container) ist in etwa vergleichbar mit einen SchiffsContainer. Jeder für sich ist komplett abgekapselt und mehrere davon fahren auf einem Containerschiff durch die Welt. Das Containerschiff kann man also mit dem Docker Daemon vergleichen, auf dem einer oder viele Container gehostet werden. So viele bis die Kapazität des Systems (Schiffes) aufgebraucht ist. Jeder Container hat einen anderen Inhalt und ist soweit von den anderen abgekapselt, das es kein Problem ist, zum Beispiel auf einem Docker Daemon, alle verschiedenen PHP Versionen inkl. Apache am Laufen zu haben. Und schon kommen wir zu einem der größten Plus Punkte. Ich baue meine Applikation komplett abgekapselt mit allen Abhängigkeiten (Softwareversionsstände) in einen Container und lasse diesen Laufen. Somit ist es kein Thema eine Applikation auf einer Middleware laufen zu lassen, die einen andere Version hat als, zum Beispiel die Verfügbare im Debian Repository. Container basieren auf Docker Images. Man startet ein Image mit gewünschten Parametern und schon hat man einen Container, der läuft. Ein Docker Image wird durch das Dockerfile erstellt und kann gleichzeitig in mehr als einem Container auf einem System laufen. So kann man sehr gut Skalieren. Brauche ich zum Beispiel unter Last meine Applikation x-Mal, dann starte ich einfach beliebig viele Container basierend auf dem selben Applikations Image.

Jetzt habe ich schon ein paar Dinge verraten. Was sind die Benefits von Docker:

  • Systemunabhängig
  • Cluster fähig
  • Viele verschiedene Software Versionen (Middleware) verfügbar
  • Skalierbarkeit
  • Applikation kann komplett als Image gebaut und beliebig oft deployt werden
  • Umzug von einem System auf ein Anderes System ist einfach

Was ist ... ?

  • Docker Container: Grundgerüst, wie ein leerer FrachtContainer, ist nur eine Hülle die mit einem Docker Image gefüllt wird. Besser gesagt, ein mit Parametern gestartetes Docker Image ist ein Container.
  • Docker Image: sozusagen ein Template mit dem man einen Docker Container startet. Beinhaltet die komplette Applikation.
  • dockerfile: Rezept/Anleitung zur Erstellung eines Docker Images (Kann via GIT versioniert werden und an Kollegen zum Erstellen neuer baugleicher Docker Images weitergegeben werden)
  • Docker Compose: Mit Docker Compose baut man komplexere Applikationen, die aus mehreren Containern bestehen zusammen. Dafür wird ein docker-compose.yml verwendet
  • docker-compose.yml: Ist das Rezept/Anleitung für eine Applikation, die aus mehreren Containern, Netzwerken, Volumes und sonstigem besteht.
  • Docker Stack: ähnlich docker-compose, deployt eine Applikation die aus mehreren Containern besteht in den Docker Swarm
  • Docker Swarm: Cluster Lösung von Docker selbst
  • Kubernetes: von Google entwickelte Konkurenzlösung zu Docker Swarm. RedHats Openshift basiert auf dieser.

Was gibt es noch zu wissen?

  • Container sind nicht für persistente Daten ausgelegt. Hierfür muss ein Speicherort außerhalb des Containers gemountet werden. In dem Moment in dem der Container gelöscht wird, sind alle Daten weg, was auch bei einem Update der Fall ist. Starten und Stoppen ist kein Problem.
  • Applikationen sollten keine Logfiles erstellen sondern auf die Konsole loggen. Dies kann man dann ggf. via ELK Stack persistent machen.
  • Docker Container legen Logdateien im JSON Format ab.
  • Docker Container können gesichert werden, jedoch nur wenn sie vorher pausiert wurden. (Konsistente Daten)
  • Docker Images liegen im Docker HUB oder bei GIT
  • Container können via Docker virtuelle Netzwerke mit einander kommunizieren (früher Linking)
  • Man kann TCP Ports in einen Container Mappen um diesen von außen verfügbar zu machen. (-p 80:5000)
  • Man kann eigene Images bauen, auf denen dann andere Container oder Images basieren, zum Beispiel Apache + verschiedene PHP Versionen FROM im dockerfile
  • Es können Dateien in das Docker Image inkludiert werden (zum Beispiel ein WAR File) ADD / COPY im dockerfile
  • Container haben eine eindeutige ID, die Container ID.
  • Jeder Container bekommt einen Alias Namen automatisch vergeben, wenn man ihn nicht selbst benennt.

Installation

Die aktuellen Installationen findet ihr auf der offiziellen Docker Seite. Ebenfalls eine aktuelle Anleitung zum Installieren.

Linux

MacOS

Für Apples MacOS gibt es eine DMG Datei zum herunterladen und installieren.

Windows

Ready to start

Ist Docker installiert kann man mit ein paar ersten Tests loslegen. Zum Beispiel lassen wir mit einem ubuntu Image einfach mal ein "Hello World ausgeben:

docker run ubuntu echo "Hello World"

Warum dauert das nun solange beim ersten Aufruf? Ganz einfach, das Ubuntu Image muss zuerst vom öffentlichen Docker Hub auf den Docker Host heruntergeladen werden und dann in einem Container gestartet werden. Beim zweiten Aufruf geht es schon deutlich schneller, da das Image bereits auf dem Host liegt und es nur noch angestartet wird.

Ein paar nützliche Befehle

## Durchsucht den Docker Hub nach Images
docker search ubuntu

## Lädt einzelne Images herunter
docker pull ubuntu

## Löscht Images
docker rmi ubuntu

## zeigt lokal abgelegte Images an
docker images

## Zeigt laufende und gestoppte Container an
docker ps -a
docker container ls -a

## Zeigt die Festplatten Belegung von Docker auf dem Host an
docker system df

## Remove exited containers
docker ps --filter status=dead --filter status=exited -aq | xargs docker rm -v

## Remove unused images
docker images --no-trunc | grep '<none>' | awk '{ print $3 }' | xargs docker rmi

## Remove unused volumes
docker volume ls -qf dangling=true | xargs docker volume rm

## Zeigt den Ressourcenverbrauch der Container an
docker stats 

## Räumt das System auf
docker system prune

Updaten eines Containers

möchte man einen laufenden Container manuell updaten, so geschieht dies durch folgende beiden Befehle.

docker pull KONTAINERNAME
docker restart KONTAINERNAME

Möchte man automatisch Updaten, schaut euch Watchtower an.

Durchsuchen nach Tags

möchte man wissen, welche Versions Tags zur Verfügung stehen, muss man im normal fall via Browser und Docker HUB dies herausfinden. Oder man nutzt das pytools image und sucht damit:

docker run harisekhon/pytools dockerhub_show_tags.py centos ubuntu

Quellen