home..

Einführung Docker

Docker Container Plattform

Docker ist ein Open Source-Projekt zur Automatisierung der Bereitstellung von Apps als mobile, eigenständige Container, die in der Cloud oder lokal ausgeführt werden können. Docker ist darüber hinaus ein Unternehmen, das diese Technologie fördert und weiterentwickelt und mit Cloud-Anbietern, Linux und Windows kompatibel ist.

Dabei stellen Container eigenständige und abgeschottete Laufzeitumgebungen für Anwendungen verschiedenster Art dar. Container und die dazugehörigen Container Images basieren auf dem OCI (Open Container Initiative) Standard und sind somit nicht nur mit Docker kompatiebel. Docker ist vielmehr nur das zugehörige Verwaltungswerkzeug, um die darunterliegende Container Infrastruktur zu verwalten. Docker bietet dabei die Möglichkeiten, Container anzulegen, zu starten / stoppen oder zu löschen. Es können neue Images erstellt und bestehende Images verwaltet werden, lokal oder remote in sogenannten Container Registries (z.B. hub.docker.com)

Containervirtualisierung

Containervirtualisierung beschriebt eine Form der Virtualisierung beider auf dem Host System mittels PID Namespacing im Linux-Kernel eine eigene Laufzeitumgebung geschaffen wird. Inder Anwendungen abgeschottet vom restlichen System betrieben werden können.

Der Vorteil dieser Virtualisierungesmethode, ist der um ein Vielfaches verringerter Overhead im Vergleich zu KVM. Da bei einer Container Virtualisierung im direkten Vergleich der Kernel des Host OS verwendet wird und die Ressourcen des Systems nur abstrahiert und nicht virtualisiert werden.

Somit kann bei Containern auf ein eigenes Betriebssystem im klassischen Sinne verzichtet werden. Es muss lediglich eine Laufzeitumgebung mitgegeben werden, um die entsprechende Anwendung ausführen zu können. Somit kann die Hardware optimal ausgenutzt und der Wartungsaufwand deutlich reduziert werden.

Technologien, die auf diese Art der Virtualisierung zurückgreifen, sind. LXC und OCI Container.

Bei LXC Containern wird ein leichtgewichtiges Linuxsystem erzeugt, das über traditionelle Methoden administriert / verwaltet wird z.B. SSH.

OCI Container verfolgen einen anderen Weg, hier geht es darum, sehr leichtgewichtige System für die Cloud bereitzustellen. Hier liegt der Fokus auf Sicherheit, Performance und Fehlerminimierung.

Die Container sind weitergehend dazu auch im Hinblick auf die 12 Faktoren im Cloudumfeld designet, sie sind vorzugsweise Stateless, skalierbar und im Fehlerfall schnell austauschbar. Eine manuelle Fehlerbehebung eines einzelnen “bad” Containers ist hier nicht vorgesehen. Vielmehr werden die Container einfach schnell gegen einen neuen funktionsfähigen Container ausgetauscht.

Gerade im Hinblick auf Kubernetes, ist diese Art der Containerverwaltung die Grundlage eines solchen Konzepts.

Moby Project

Das Moby Projekt zu finden auf Github, stellt die Library dar, die von Docker für die Interaktion mit dem System verwendet wird. Hier ist z.B. der Image Build Prozess abgebildet.

ContainerD

ContainerD ist eine OCI standardisierte Container Laufzeitumgebung. Diese ist für den eigentlichen Betrieb der Container verantwortlich und steuert diesen eigenständig.

containerd is an industry-standard container runtime with an emphasis on simplicity, robustness and portability. It is available as a daemon for Linux and Windows, which can manage the complete container lifecycle of its host system: image transfer and storage, container execution and supervision, low-level storage and network attachments, etc.

Zu finden ist das Projekt bei Github

OCI - Open Container Initiative

Die Open Container Initiative verabschiedet Standards im Bereich Containering. Darunter fallen die Spezifikationen der Container und deren Images, damit diese zu den verschiedenen Systemen interkompatibel sind.

runc

runc is a CLI tool for spawning and running containers on Linux according to the OCI specification. Wird von Docker im Hintergrund verwendet, um Container anzulegen und zu verwalten. Zu finden auf Github

Docker Image Erstellen

Um ein Docker Image zu erstellen, wird mit sogenannten Dockerfiles das Image definiert. Dieses Dockerfile wird dann dem Build Agent übergeben, der dann aus dem übergebenen Dockerfile ein OCI Container Image erstellt.

In der Regel sind Dockerfiles in 3 Bereiche aufgeteilt.

Import: Hier werden OS Images (Debian, Alpine, Ubuntu, …) angegeben bzw. Base Images (Frameworks wie Java, dotNet, NodeJS oder Python) damit wird die Laufzeitumgebung festgelegt.

Installation: Hier wird die Installationsroutine der Software angegeben z.B. Download von Artefakten oder Kompilierung der Software.

Entrypoint: Hier wird der Startpunkt der Anwendung festgelegt.

Ein beispielhaftes Dockerfile sieht in etwa so aus:

FROM alpine:3.4

RUN apk update && apk add \
    curl \
    git \
    vim

RUN wget http://myapp.com/run && chmod +x run

ENTRYPOINT['run']

Im Anschluss kann dann das Dockerfile zu einem Image gebaut werden docker build .

Docker Image Verwaltung

Docker Container Verwaltung

Mit dem -a Parameter lassen sich auch die abgeschalteten Container anzeigen.

Im Beispiel: Startet einen Nginx Container auf Port 8080

docker run -d -p 8080:80/tcp --name=webserver --restart=always nginx:latest

Die verwendeten Parameter Parameter | Funktion | ——– | ——– | -d | Container im Hintergrund Starten -p 8080:80/tcp | TCP Portfreigabe von 8080 extern nach 80 intern –name | Namen des Containers festlegen –restart=always | Setzt die Restart Policy auf immer starten

Genauere Infos und Referenzen in der Docker Dokumentation

docker container rm -f 5793bbed585b

Container ID oder Container Name

Verwendeter Paramerter -f (Force) Löscht den Container auch im aktiven Zustand.

Docker Compose

Docker Compose ermöglicht es, mehrere Container in einem Deployment zusammenzufassen und die Ressource in diesem Deployment gegenüber anderen Containern abzuschirmen, die dafür notwendigen Schritte werden alle automatisch von Docker Compose übernommen.

Docker Compose benötigt eine sogenannte docker-compose.yml Datei, diese Datei enthält die Konfiguration des Deployments. Durch Docker Compose werden die folgenden Ressourcen verwaltet:

Ein typisches Usecase für Docker Compose wäre eine Webanwendung, bei der eine Datenbank, ein Webserver und ein Anwendungsserver benötigt werden. Dabei steuert Docker Compose die Erstellung der Container und deren persistenten Daten, die Erstellung eines Cloudnetzwerks sowie die automatische Zuweisung des Netzwerks an die Container.

Die docker-compose.yml für den oben beschriebenen Usecase sieht wie folgt aus:

version: "3.9"
    
services:
  db:
    image: mysql:5.7
    container_name: db
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: dbpasswd
      MYSQL_DATABASE: db
      MYSQL_USER: db
      MYSQL_PASSWORD: db
    
  proxy:
    image: nginx:latest
    container_name: proxy
    restart: always
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/error.log:/etc/nginx/error_log.log
      - ./nginx/cache/:/etc/nginx/cache
      - ./ssl/:/etc/letsencrypt/
    ports:
      - 80:80
      - 443:443
  app:
    depends_on:
      - db
      - proxy
    image: registry/myapp
    restart: always
    environment:
       DBL_USER: db
       DB_PASSWORD: db
       DB_HOST: db
    container_name: app
    ports:
        - 3000:3000
volumes:
  db_data: {}

Die Nginx Konfiguration muss noch entsprechend als Reverse Proxy auf den app Container angepasst werden.

Docker Volumes

Docker Volumes bieten die Möglichkeit, anfallende persistente Daten in einem Container zu speichern. Volumes werden komplett durch Docker verwaltet und sind damit der offiziell empfohlene weg persistente Daten abzuspeichern.

Docker bietet auch die Möglichkeit, andere Storage Driver anzusprechen. Somit ist es möglich, die Volumes auf anderen Storage Medien zu speichern. Von Haus aus unterstützt Docker die folgenden Storage Drivers:

Docker Networking

Um die Container untereinander zu vernetzen, bietet Docker die Möglichkeit, über Bridges auf dem Hostsystem Container miteinander zu verbinden.

Bei einem durch Docker verwalteten Netzwerk erfolgt die IP-Adressvergabe eigenständig durch Docker. Ebenso wie eine DNS Namensvergabe jeder Name eines Containers ist im Docker Netzwerk per DNS auflösbar. Somit ist es möglich, Container nach ihrem Namen im Netzwerk aufzurufen.

Es existieren auch noch einige andere Netzwermodelle, diese können hier eingesehen werden.

Mit Docker Swarm, lassen sich mehrere Docker Dienste zu einem Verbund zusammenschalten und somit können die Container auch Hostübergreifend miteinander kommunizieren.

Übersicht Overlay Netzwerke: https://docs.docker.com/network/overlay/

Beispielkonfiguration: https://docs.docker.com/network/network-tutorial-overlay/

Container Orchestrierung

Mit Container Orchistration lassen sich die Container in Clustern organisieren. In diesem Modus wird ein Cluster aus mehreren Containern einer Anwendung erstellt. Dieses Cluster ist dank Hostübergreifenden Netzwerk und Speicher in der lage eine Hochverfügbare Clusterumgebung zu schaffen.

In dieser konstelation ist der einzelne Container nicht mehr von großer bedeutung, dieser kann durch die Beachtung der 12 Faktoren einer Cloud Anwendung. Im Laufenden betrieb ohne störungen zu verursachen ausgetauscht werden.

Ein kleiner Überklich über die wichtigesten Eigenschaften einer Cloud Nativen Anwendung.

  1. Die Anwendung selbst darf keinen Status im Arbeitsspeicher halten.
  2. Persistente Daten dürfen nicht im Container gespeichert werden.
  3. Die Konfguration der Anwendung erfolgt über Umgebungsvariablen oder zentralisiertem Konfigurationsmanagenemt.
  4. Persistente Daten werden nur in Datenbanken gespeichert.
  5. Container mit Persistenten Daten speichern diese in Volumes.
  6. Volumes werden nicht auf dem Pod gespeichert sondern auf zentralisierten Storage Systemen z.B. S3 oder Ceph

Somit lassen sich im Live Betrieb wartungen und aktualisierungen durchführen, die die Verfübgarkeit der Anwendung in keinster weise beeinträchtigen.

Vielmehr lassen sich in einem solchen Cluster auch ganze Update oder Change Prozesse einbinden. Durch die eingebaute Versionierung in die Container Images ist es möglich. Das Cluster in Production, Staging, Test und Development zu unterteilen und entsprechend den eingehenden Traffic an die gewünschten stellen zu Routen. Hierdurch lässt sich der Grundgedanke von continuous deployment sehr gut umsetzen.

Verbreitete Container Orchestration Tools:

© 2023 Markus Brunsch