Einführung in Container und Docker

DevOps

Dies ist der erste Beitrag zur Blogreihe über Kubernetes. Diese Blogreihe beschäftigt sich von den Grundkonzepten von Containern bis hin zu deren Einsatz. Anhand von Beispielen wird aufgezeigt, wie lokale containerisierte Testumgebungen aufgesetzt werden können.

In diesem Blogbeitrag möchte ich eine kurze Einführung in Container und die Container Software Docker geben. Das bedeutet:

  • Welche Unterschiede und Vorteile gibt es zwischen Containern und virtuellen Maschinen?
  • Wie unterscheidet sich deren Architektur?
  • Wie kann ich Container lokal laufen lassen?

Container vs. virtuelle Maschinen

Für das Entwickeln und Testen von Anwendungen sind Entwickler beispielsweise auf einen lokalen Webserver oder auch eine Datenbank angewiesen. Diese aufzusetzen kostet nicht nur Zeit, sondern auch Hardwareressourcen, egal ob auf dem Host Betriebssystem oder in einer virtuellen Maschine. Eine virtuelle Maschine hat neben ihrem eigenen Gast-Betriebssystem inklusive einem eigenen simulierten Kernel auch viele unnötige Abhängigkeiten.

Container

Container bieten im Vergleich zu virtuellen Maschinen eine ressourcensparende und leichtgewichtige Lösung, um Anwendungen dynamisch bereitzustellen. Zudem sind sie auch zustandslos und persistieren keine Daten, falls nicht gewollt. Ein Container bildet üblicherweise einen Prozess ab. Dieser ist durch Namespaces und Cgroups von parallel laufenden Prozessen auf dem Host-System isoliert. Jeder Container hat zudem sein eigenes Dateisystem mit seinen benötigten Bibliotheken, die die Lauffähigkeit des Prozesses sicherstellen. Eine containerisierte Anwendung kann dadurch mit ihren Abhängigkeiten (shared libraries) als Paket dynamisch auf unterschiedlichen Umgebungen (Cloud, Bare Metal) exportiert und bereitgestellt werden.

Architekturvergleich

In der nachfolgenden Abbildung ist die vereinfachte Architektur von Containern im Vergleich zu virtuellen Maschinen dargestellt. Die Abbildung hebt deutlich die Ressourcenaufteilung zwischen diesen hervor. Gleichzeitig könnten beispielsweise mehr Container als virtuelle Maschinen auf demselben Host-System betrieben werden.

Docker

Für die Verwaltung und Interaktion mit Containern wird eine Container Software benötigt. Diese Container Software baut aus einem Bauplan (Dockerfile) die eigentliche Anwendung und bietet (üblicherweise) über ein Kommandozeilen-Tool die Option mit dieser zu interagieren (starten & stoppen des Containers). Eine der populärsten Container Anwendungen ist Docker, wobei auch rkt oder Buildah mit Podman sich steigender Beliebtheit erfreuen.

Die Installation von Docker kann für Windows hier nachgelesen werden.

Das Starten eines Containers mit einer Datenbank ist in diesem Github-Repository erklärt.

Vom Bauplan zum Container

Ein Dockerfile ist der Bauplan für eine Anwendung, die als Container bereitgestellt werden soll. Der Container basiert auf einem Base-Image. Dieses kann beispielsweise ein minimales Betriebssystem wie Linux-Alpine oder Busybox sein. Auf Basis dieses minimalen Betriebssystems wird die eigentliche Anwendung (schichtweise) gebaut.

 

FROM postgres:12
RUN localedef -i de_DE -c -f UTF-8 -A /usr/share/locale/locale.alias de_DE.UTF-8
ENV LANG de_DE.utf8

 

Aus diesem Dockerfile wird ein Container Image, welches in einer Container Registry gespeichert werden sollte. Dafür bietet sich zum Beispiel dockerhub an. Die unten stehende Abbildung zeigt visuell den Ablauf dar, wie aus einem Dockerfile ein Container entsteht.

Aus dem Dockerfile kann nun mit dem Befehl

 

docker image build -t custom-postgres:1.0 .

 

ein Container Image gebaut werden.

Mit dem Befehl

 

docker run --name pg-instance -e POSTGRES_PASSWORD=postgres -d custom-postgres:1.0

 

kann aus dem Docker Image ein Container gestartet werden. Dieser Container ist eine PostgreSQL Instanz.

Docker-CLI

Docker bietet ein Kommandozeilen-Tool (docker) um die Container über ein Terminal zu verwalten. Hier sind die gängigsten Befehle aufgelistet:

  • Alle laufenden Container auflisten
docker ps docker container ls
  • Einen Container starten
docker run --name <Containername> -d imagename:tag
  • Einen Container stoppen
docker container stop <Container-ID oder Containername>
  • Einen Container löschen
docker container rm <Container-ID oder Containername>
  • Alle bereits heruntergeladenen Images auflisten
docker image ls

 

  • Terminal in einem Container öffnen

 

docker exec -it <Container-ID oder Containername> bash

 

  • Vorsicht! Ungenutzte Images, Container und Netzwerke löschen (--volumes zusätzlich für Volumes)

 

docker system prune

 

  • Auf einer privaten Container Registry einloggen

 

docker login <url.container.registry>

Nächster Blogbeitrag

Im nächsten Blogbeitrag wird das Open Source Container Orchestrierungstool Kubernetes erklärt. Dieses bietet die Möglichkeit große Containerlandschaften automatisiert zu verwalten. Google verwaltet damit täglich Milliarden von Containern.

Yannic Nevado Autor

Yannic Nevado ist ein Datenbank-Consultant bei der Proventa AG. Seine Schwerpunkte liegen beim Open Source und EDB Postgres. Er arbeitet mit Kunden daran neue Datenbanksysteme einzuführen. Des Weiteren unterstützt er Migrationen von Oracle und DB2  zu Postgres. DevOps mit Containern und Kubernetes gehören außerdem zu seinem Alltag. Gerne teilt er sein neu erlangtes Wissen bei der Postgres User Group Frankfurt weiter.

Tags