Einführung in Docker

von Steve Liedtke

Virtualisierung im Umbruch

Virtualisierung ist eine Nachbildung eines Hard- oder Softwareobjekts

  • durch Abstraktionslayer
  • ermöglicht Emulation
  • transparente Aufteilung

Docker auf dem Vormarsch

Docker bietet Vorteile gegenüber den bisherigen Virtualisierungssystemen

Virtualisierung durch Container

  • Applikationen werden in losen, abgeschlossenen Umgebungen ausgeliefert und betrieben
  • Container laufen parallel auf einem Host
  • Container laufen direkt gegen den Kernel

Technische Erklärung

Vergleich: VM vs Docker

Quelle: pcwelt.de

Docker Engine

Quelle: docs.docker.com

Dockerfile

  • "Bauanleitung" für Images/Container
  • Jedes Dockerfile benötigt einen Befehl für den Start (siehe letzte Zeile)
FROM python:3.7
COPY . /app
WORKDIR /app

CMD python /app/app.py

Images

  • Ein Image besteht aus mehreren Read Only Schichten
  • Ein Image kann auf einem anderen Image basieren

Image Beispiel (Dockerfile)

FROM tomee:8-jdk-7.0.1-plus

RUN ["rm", "-fr", "/usr/local/tomee/webapps/ROOT"]

COPY ./target/myapp.war /usr/local/tomee/webapps/ROOT.war

CMD ["catalina.sh", "run"]

Image Beispiel

FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py

Container

  • Container baut auf Image auf
  • Besteht zusätzlich aus einer Read/Write Schicht

Registry

  • Eine Registry ist ein Server auf dem Docker-Images gespeichert werden
  • Docker-Hub (Default)
  • Im Eigenbetrieb durch Drittanbieter, wie z.B. Nexus Sonatype
  • Im Eigenbetrieb als Docker-Container

Volumes

  • Read/Write Schicht eines Containers wird beim Löschen eines Containers mitgelöscht
  • Um Daten vom Container auf den Hostsystem zu hinterlassen, auch wenn der Container gelöscht wird, benutzt man Volumes
  • Pro Container 0-n Volumes möglich

Network

  • Docker bietet ein Netzwerkmechanismus Container Network Model (CNM)
  • CNM erlaubt die Nutzung verschiedener Netzwerk-Treiber
  • Built-in Treiber-Typen: bridge, overlay, host, none
docker network ls

Netwerk-Treiber 'bridge'

  • Privates Netzwerk
  • Alle Hosts dieses Netzwerkes können miteinander kommunizieren
  • Externer Zugriff über exportierte Ports

Netwerk-Treiber 'none'

  • Kein Netzwerk-Zugriff
  • Sinnvoll für reine Batch-Anwendung, die im Hintergrund laufen

Netwerk-Treiber 'host'

  • Kein Unterschied zwischen Host- und Container-Netzwerk
  • Wenn Anwendung im Container auf Port 80 ausgeführt wird, dann ist sie auch über den Host auf Port 80 erreichbar

Community und Enterprise Edition

  • Docker Engine - Community (kostenlos)
    • Basis-Features (Management Images, Container, Volumes, Networks)
  • Docker Engine - Enterprise
    • Zugriff auf zusätzliche/zertifizierte Container/Plugins
    • Erweiterung des Container-Managements, u.a. LDAP/AD Integration
    • 'Security Scanning' und 'Vulnerability Monitoring'
  • Vergleich der Versionen

Installation

Unter Linux

Unter Mac

Docker Desktop: Download für Mac

Unter Windows 10

Docker Desktop: Download für Windows

Container managen

Container auflisten

docker ps --all

docker ps -a

Container starten

docker run -d -p 80:80 nginx

docker run
    --restart=always
    -v /data/mydatabase:/var/lib/mysql
    -d
    --name mydatabase
    mariadb:10.4.8
						
Run Reference

Run parameter

  • -e: Umgebungsvariablen
  • -m: Max. genutzter Arbeitsspeicher
  • --rm: Container wird nach Stopp automatisch gelöscht
  • -u: Setzt Username oder UID
  • --link: Verlinkt einen anderen Container
  • --hostname: Setzt den Hostname des Containers

Image laden

docker pull mariadb:10.4.8
docker pull mariadb

Container starten/stoppen

docker start mydatabase

docker stop mydatabase

Container löschen

docker rm mydatabase

docker rm -f mydatabase

Zugriff auf Container

docker exec -i -t mydatabase /bin/bash

Container-Logs einsehen

docker logs -f mydatabase

Container-Daten aufräumen

Einsicht genutzen Festplatten-Speichers:
docker system df
Nicht genutzte Daten (Container/Images) löschen:
docker system prune -a

Images managen

Docker Image bauen

docker build . -t myapp

Docker Image bezeichnen

docker tag myapp registry.steveliedtke.de/myapp:1.0

Gegen private Registry authentifizieren

docker login registry.steveliedtke.de

docker logout registry.steveliedtke.de

Image von privater Registry laden

docker pull registry.steveliedtke.de/tvelocity/etherpad-lite:1.6.5

Image zu privater Registry hochladen

docker push registry.steveliedtke.de/myapp:1.0

Image vom Host entfernen

docker rmi registry.steveliedtke.de/myapp:1.0

Image basierend auf laufenden Container erstellen

docker commit myapp registry.steveliedtke.de/myapp:1.1

Docker Compose

Eins ist klar ...

  • 'docker run' Befehle enthalten viele Parameter
  • Es ist schwierig den Überblick zu behalten, wenn mehrere Container verlinkt sind

Docker Compose

  • Mit Docker Compose kann über eine .yml Datei der Start mehrere Container als Services bestimmt werden
  • Das Starten dieser Services erfolgt nicht über 'docker' sondern per 'docker-compose'

docker-compose.yml Beispiel

version: '3'
services:
  etherpaddb:
    image: mysql:5.7.22
    container_name: etherpaddb
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
    ports:
      - "3306:3306"
  etherpad:
    image: registry.steveliedtke.de/tvelocity/etherpad-lite:1.7.0
    container_name: etherpad
    restart: always
    depends_on:
       - etherpaddb
    environment:
      - ETHERPAD_ADMIN_PASSWORD=admin
      - ETHERPAD_DB_HOST=etherpaddb
      - ETHERPAD_DB_PASSWORD=root
    ports:
      - "80:9001"

Installation von docker-compose

  • Bereits Teil von Docker Desktop for Windows/Docker for Mac
  • Muss bei Linux separat installiert werden
  • Installation über pip (z.B. auf Raspberry Pi)
  • Installation als Container

Starten einer docker-compose.yml (Services)

docker-compose up -d

Stoppen von Services

docker-compose down

Log-Einsicht der Services

docker-compose logs -f

Docker Orchestrierung

Und was mache ich hiermit?

Docker Orchestrierung

Docker Swarm

  • Mit Docker Swarm kann ein Cluster mit mehreren Hosts aufgebaut werden
  • Swarm bietet die folgenden Eigenschaften:
    • Multi-host Networking (Treiber: overlay)
    • Scaling
    • Load balancing
    • Service Discovery

Kubernetes

Anwendungsbeispiele aus der Praxis

Lokale Nutzung

  • Datenbanken installieren
  • Webanwendungen lokal starten (z.B. Swagger UI)
  • Nodered für lokal auszuführende Skripte
  • Node/Grunt Ausführung zum Bauen dieser Web-Folien
  • GUI Anwendungen
  • u.v.m.

GUI Anwendungen

Webanwendung verschiedener Subdomains mit HTTPS

  • versch. Webanwendungen (Jenkins, Sonar, Website mit Tomcat)
  • ein Server
  • mehrere DNS A- oder CNAME-Einträge zeigen auf Subdomains (also jenkins.example.org, nexus.example.org, etc.)
  • Gewünscht: Einfache Einrichtung und möglichst sicher

Docker auf Kleinstrechner

  • Raspberry Pi als Alleskönner
    • Hausautomatisierung
    • Media System
    • Retro-Gaming-PC
  • Docker wird unter Raspbian unterstützt
  • Es gibt auch andere Images, die Docker unterstützen (z.B. Hypriot)
  • Achtung: Images müssen ARMv6-kompatibel sein (siehe unterstützte Architekturen)

Docker für die Softwareentwicklung

  • Häufig läuft die zu entwickelnde Anwendung auf einem anderen Betriebssystem
  • → Manche Fehler entdeckt man erst auf dem Test-/Produktivsystem
  • Lösung: Lokale Tests/Automatisierte Tests laufen gegen ein Docker-Container
  • Im Idealfall kann das gleiche Image auf dem Zielserver auch genutzt werden

Mal eben was ausprobieren

  • Vor Docker musste ich mich häufig durch Installations-Guides quälen
  • Nun über Docker Befehle oder compose-yml sehr schnell Up and Running

Docker in Produktion

Bedenken

  • Docker daemon benötigt root Berechtigungen
  • Docker >0.5.2 nutzt für die REST-API einen UNIX-Socket statt TCP auf 127.0.0.1
    • Damit können UNIX-Permission Checks für Zugangseinschränkungen genutzt werden
  • Docker REST-API kann über HTTP verfügbar gemacht werden
  • Weitere Sicherheitsaspekte werden in der Doku von Docker durchleuchtet

Resourcen Management

  • Arbeitsspeicher
    • Begrenzen der Arbeitsspeichernutzung für einzelne Container
  • Festplattenspeicher
  • CPU-Nutzung

Container Monitoring

Log Management

  • Zugriff auf Log-Files über docker logs
  • Zusammenfassung der Logs verschiedener Container über zentrales Logsystem
    • z.B. Elastic Stack (ELK)

Vielen Dank für eure Aufmerksamkeit!

Quellen