An der VHS Braunschweig findet vom 13. bis 17. Februar 2023 ein Bildungsurlaub zum Thema "Container mit Docker und Co" statt.

Virtualisierungstechniken nehmen in den IT-Infrastrukturen eine immer größere Bedeutung ein. Manche sprechen bei Containern von der nächsten "Evolutionsstufe" der Virtualisierung. Dieses Seminar widmet sich der Praxis von Containern mit Docker - bzw. den Container-Alternativen - und wird auch die technische, theoretischen und sicherheitsrelevanten Themen für Applikationscontainer nicht vernachlässigen.

docker 800px

Sie werden die Administration von Docker/Containern erlernen und den unterschiedlichen Einsatz von Docker für Projektumgebungen kennen lernen. Und natürlich werden auch die netzwerk- und sicherheitsspezifischen Aspekte nicht zu kurz kommen.

Hier die Rahmendaten unseres Seminars:

Ort: VHS Braunschweig, Heydenstraße 2, Raum 2.11
Termine: Mo., 13.02. bis Fr., 17.02.2023; jeweils 08.30 - 16.00 Uhr

Ich werde unsere Seminarthemen an dieser Stelle ausführlich begleiten und die Infos rund um Container mit Docker und Co nachhaltig verfügbar machen.
Ihr Trainer Joe Brandes

 

Intro

Seminarintro

Orientierungsphase, Pausenzeiten, Seminarablauf, TN-Themen

Roter Faden

Diesen Begriff hört man in meinen Seminaren häufiger ;-). Gemeint ist hier: Das grundsätzliche Verständnis der fraglichen IT-Techniken. Am Besten gleich so, dass man auch nach einer Zeit ohne Beschäftigung mit diesen Techniken sehr schnell wieder in Fahrt kommt.

Unter einem roten Faden versteht man ein Grundmotiv, einen leitenden Gedanken, einen Weg oder auch eine Richtlinie. „Etwas zieht sich wie ein roter Faden durch etwas“ bedeutet beispielsweise, dass man darin eine durchgehende Struktur oder ein Ziel erkennen kann.

Quelle: Wikipedia - Roter Faden

Diese Ausarbeitung und Seminarankündigung

Diese vorliegende Seminarausarbeitung soll und kann nur einen seminarbegleitenden "Faden" darstellen. Die Techniken rund um Container und Virtualisierungen sind in stetigem Wandel und Entwicklungen unterworfen, denen ich hier nicht immer hinterherrennen werde.

Der aktuelle Anreißer bzw. Seminarankündigungstext:

Virtualisierungstechnik ist der aktuelle Dauerbrenner in der IT.

Die Techniken bieten eine große Bandbreite: von kleinen technischen Umgebungen im Rahmen von SW-Development bis zu den großen "Cloud"-Lösungen wie Microsoft Azure oder den Amazon Web Services (AWS).

Die Umsetzungen basieren dabei auf Virtuellen Maschinen (VMs) und/oder den sogenannten Containern. Die Techniken drängen aktuell auch in die "Private IT":

  • VMs und Container auf dem NAS
  • SW-Entwicklungsumgebung per Container auf dem Raspberry Pi
  • Web-Oberflächen für das Smart-Home

Die Liste ließe sich beliebig verlängern.

In unserem praxisorientiertem Seminar wollen wir uns mit Installationen und Einrichtungen der
Virtualisierungstechniken und Container-Managements einen intensiven Einblick in diese Techniken verschaffen.

 

Unterlage für TN Dockerseminare Joe Brandes

Hand-Outs Trainer J. Brandes - Ausarbeitungen Online / Offline zu Docker:  Anm.: erstellt per RestructuredText

docker pcs 800px

Portal: docker.joe-brandes.de - wenn verfügbar (;-) mit

  • HTML-Versionen (HTML & SingleHTML)
  • PDF oder
  • EPUB

 

 

Tag 01

Montag, 13.02.2023, 08.30 - 16.00 Uhr

Orientierungsphase, Teilnehmer-Themen

Allgemeines

Wir setzen verschiedene Betriebssyteme für eine komplette Sicht auf die verschiedensten Einsätze von Docker-Containern auf unterschiedlichen Betriebssystemen und Netzwerkumgebungen ein.

Für unsere Seminarumgebungen starten wir gerne mit den für TN meist gewohnten Windows Umgebungen und Installationen. Man sollte allerdings nicht verschweigen, dass die meisten weiterführenden und professionellen Umgebungen gänzlich Linux-basiert sind. Und wird sprechen hier ja auch nur von unserer Arbeits-Betriebssystem-Umgebung. Die Container des Seminars sind Linux-Container.

Technik / Installationen

Teilnehmer-PCs mit Intel-Systemen (Core-i5 7400):

  • Wechsel-SSDs:
    500 GB (System-Installs) + ggf. 240/120 GB (Data und/oder Zweit-Install)
    Tipp: SSD für erste Installation auf 150 GB partitionieren - Rest freilassen für Parallelinstallation: Linux als Zweit-OS
  • 16 GB RAM
    Beachten: Host-System (ca. 2 GB) und alle weiteren Systeme!
  • Softwareinstallationen mit Paketmanager Chocolatey
    Unser Seminar ist ein Konsolenseminar und dann wollen wir auch gleich die meisten nötigen Installationen mit der Konsole (PowerShell) und mächtigen Konsolen-Tools umsetzen.

VM-Host Grundinstallation: Windows 10 Pro (22H2)

Anm.: saubere Grundinstallation mittels USB-Ventoy-Sticks zu Beginn des Seminars.

Für die Docker-Umsetzung werden wir mit dem Docker Desktop für Windows beginnen, weil wir so den schnellsten Einstieg in Kombination mit einer (meist) gewohnten OS-Umgebung erhalten. Des Weiteren werden uns bei der Installation gleich noch docker compose und eine einfache Kubernetes Installation bereitgestellt.

Techniken: Hyper-V (leider nicht in Windows Home Editions) und Docker Desktop für Windows / WSL2 (auch in Home)

Einsatz des Windows Pro eigenen Hyper-V für

  • Linux (oder auch Windows) Gastsysteme für Docker Tests
  • Host für Docker für Desktop VM

Docker Desktop für Windows mit

  • WSL2 - Windows Subsystem for Linux 2
    Empfehlung - funktioniert auch mit Windows Home Editions!
  • Alternative: Docker Desktop für Windows mit eigener VM (verlangt Hyper-V s. a. o.)

In Window Home installieren wir einfach sauber WSL2 Support und dann den Docker Desktop für Windows!

VirtualBox (von Oracle - was solls ;-) - war gut - ist gut)

Die Installation von VirtualBox parallel zu Hyper-V auf dem Trainings-Windows-System ist auch möglich. Dann muss man bei paralleler Installation mit Hyper-V ggf. die Umsetzung mittels bcdedit beachten.

Entsprechende technische Vorgehensweisen werden in einem Extra-Abschnitt beschrieben.

Parallelinstallation: Linux OS

Für einen Einblick im Seminarverlauf für eine echte Linux-OS-Umgebung zum Dockern können wir uns auf unserem SSD-Installmedium (s.o. Windows) etwas Platz lassen und dort eine Parallelinstallation mit einer gewünschten Linux Distribution vornehmen!

Für einen schnellen Überblick installiert man sich einfach Linux-VMs im Hyper-V oder nutzt die WSL2-Technik.

Wünschenswert: ProxmoxVE Installation auf Zweitsystem

Eine fantastische (und kostenlose) Virtualisierungstechnik basierend auf Debian und KVM/qemu Technik. Insbesondere die Container/VM Technik LXC ist für viele technische Wünsche unserer Woche extrem attraktiv.

Software für Seminar

Das ist einfach mal eine Auswahl und eine möglichst effiziente Bereitstellung mittels Paketmanagment unter Windows mit Chocoloatey

  • Notepad++ (NP++ Link)
    Texteditor (für TypoScript, Konfigurationsdateien oder auch HTML/CSS/JS
    Empfehlung: 32-Bit-Variante installieren für volle Kompatibilität zu allen NP++ Plugins
  • Microsoft Visual Studio Code (MS VS Code Link)
    Profi-Tool aus dem Hause Microsoft für verschiedene Betriebssysteme (Anm.: auch ohne Admin-Rechte installierbar)
  • 7-Zip (7-Zip Link)
    Packer / Entpacker
  • Windows Terminal
    einfach die bessere Umgebung für die PowerShell (oder auch andere Shells
  • Git (Git Link)
    Software Versionierung - über Git kann man sehr einfach komplette Umgebungen und Techniken versionieren / bereitstellen (klonen)
  •  ...

Die Software wird von mir auch gerne schon fertig lokal zum Installieren verteilt, um Zeit zu sparen. Bei häufigeren Einrichtungen von Entwicklungsumgebungen möchte man das gerne noch effizienter gestalten. Das führt uns zum Paketmanagement mit Chocolatey unter Windows.

Profitipp: Chocolatey zur Installation der gewünschten Tools

Schnellanleitung Softwareinstallationen mit Chocolatey Paketmanagement:

# Chocolatey bereitstellen:
# ======================================================================
# in Admin-PowerShell Copy&Paste von Chocolatey Seite
# https://chocolatey.org/install
# einfach die Copy&Paste Zeile mit Maus anklicken und in der
# PowerShell Konsole mit rechter Maus wieder einfügen
# ======================================================================
# Chocolatey nutzen/testen
# ======================================================================
choco outdated 
choco list --local-only
# https://community.chocolatey.org/packages
# Wichtig: Admin-PowerShell nutzen
# mit Schalter -y keine Rückfragen beim Installieren # ======================================================================
choco install docker-desktop -y
choco install microsoft-windows-terminal choco install firefox chromium opera choco install notepadplusplus choco install vscode choco install 7zip choco install powertoys choco install git
choco install jq choco install nodejs choco install python3

Und natürlich installiert man sich nur die wirklich benötigte Software. Für die Softwareverwaltung reichen dann einfache Befehle choco install | list | upgrade ... mit der Windows PowerShell.

Docker Versionen

Docker Software gibt es für nahezu alle Betriebssysteme. Und in unseren Seminaren wollen wir die OS-Implementierungen versuchen in Gänze zu erfassen. Und Docker ist einfach heimisch auf Linux-Plattformen!

Die Fa. Docker.Inc bietet an:

  • Community Edition (docker-ce)
    im Seminar werden wir diese bzw. die in den Distros (siehe docker.io Packages bei Debian/Ubuntu) bereitgestellte Version einsetzen
  • Enterprise Edition (EE)
  • Testversion CE Edge

Geplante Docker Technikumsetzungen:

Hinweis für Linux Betriebssysteme: (bei Windows übernimmt Docker Desktop für Windows diese Aufgaben)

Bitte immer überprüfen, ob der Docker Daemon läuft und enabled ist für Standard-Target/Runlevel!

Alle Aufrufe (hier folgend) und dann auch für docker müssen mit root-Rechten durchgeführt werden.

systemctl status docker.service
# systemctl start docker.service
# systemctl enable docker.service
docker version
# docker als standarduser:
usermod -aG docker standarduser>

Im Docker Aufruf docker version müssen Client und Server aufgelistet sein.

Im Seminar soll auch der Standarduser für Docker berechtigt werden, um die tägliche Seminar- und Schulungsarbeit zu erleichtern: usermod -aG docker standarduser

Hinweis: Docker mit Standarduser kann ein großes Sicherheits darstellen! Darstellungen hierzu und ausführliche Inbetriebnahmen zu Docker auf Linux OS folgen!

PowerShell

Da wir unseren Einstieg in die "Docker/Container Welt" in einer Windows OS-Umgebung durchführen, sollten wir uns mit der PowerShell als Konsole anfreunden.

Für einen schnellen Einstieg in die effektive Nutzung der PowerShell Konsole stelle ich ein Gitlab-Repo mit einem guten Start-Profile zur Verfügung.

Die Anleitungen werden im Seminar entsprechend kommentiert und erläutert.
Hier die Kurzanleitung: (wir benötigen die Software Git  - z.B. choco install git )

  • PowerShell öffnen
  • ExecutionPolicy setzen:
    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 
  • Gitlab Repo joebrandes für das WindowPowerShell Profil klonen:
    cd ~/Documents 
    git clone https://gitlab.com/joebrandes/WindowsPowerShell.git 
  • Font MesloLGS NF installieren (Font in Repo)
  • Starship installieren (z.B. winget install --id Starship.Starship oder natürlich mit choco install starship)
  • Starship aktivieren (in $PROFILE-Datei auskommentieren - siehe Dateiende) und Konfiguration kopieren

Alle Konsolentools der Woche müssen einfach nur in in Profilordner ~/Documents/WindowsPowerShell/_jbtools kopiert werden!

Für die Docker Code-Vervollständigungen installieren wir einfach ein passendes Modul DockerCompletion:

# Install from PowerShell Gallery
Install-Module DockerCompletion -Scope CurrentUser
# Import (bitte einfach in $PROFILE eintragen)
Import-Module DockerCompletion

Github Repo für das Modul DockerCompletion: https://github.com/matt9ucci/DockerCompletion

 

Fachbegriffe

An dieser Stelle mal gesammelt - mehr dazu im Seminarverlauf...

Basis-Begriffe:

  • Images - unveränderlich / ro
  • Container - basieren auf Images, nutzen ein Overlay-Dateisystem
    Container basiert auf Image; Container-Instanz ist R/W (Read/Write) Layer
    maximale Anzahl Layer: 127
  • Container-Host physikalische/reale oder virtuelle Maschine
  • Volumes - vom Container getrennte Verzeichnisse im Docker-Host-System

Vertiefung:

  • Services - Dienst/Aufgabe
    Um diese kümmert sich Docker selbst! Sogar auf welchem Docker-Host die Services laufen sollen!
  • Stacks - Administration von Service-Gruppen
  • Cluster - Vorraussetzung für Services und Stacks
    Docker Nomenklatur: Swarm; s.a. Python-Skriptool docker-compose 
  • Kubernetes - Google Open Source für Container-Verwaltungen
    Container Community lässt verlauten: läuft Docker Swarm den Rang ab!
  • Continouus Delivery / Continous Integration (CD/CI)
    Versuch der Eklärung: (semi-)automatisierte Verfahren (CI) von kleinteiligen Releases mit ebenfalls möglichst automatischen Deployment-Test (CD)
    Literatur - siehe: Liebel Kap. 2.3ff

Technik

Weitere Fachbgegriffe und kurze Erläuterungen:

  • docker Client-Server-Modell
    Linux: docker /dockerd; bei Windows/MacOS „komplizierter“
  • Namespaces
    Ressourcen von Kernel lassen sich isolieren
  • Docker Images Windows
    siehe Nano Server, IIS, ASP.NET; Anm.: Nano Server nur für Windows Server Hyper-V-Instanz!
  • Registry
    Image-Datenbank mit Service zum pullen und pushen von Images
    Im Produktionsbetrieb müsssen aus Sicherheitaspekten vertrauenswürdige und daher firmeninterne Registries genutzt werden.
    Beispielhafte Registry: https : //index.docker.io/v1/
    Registry finden: docker info | grep -i registry  
  • Repository
    Logische Unterteilung einer Registry
    Fundus mit mehreren Images (siehe Tags); siehe ubuntu:* (beliebige Ubuntu-Varianten)
  • keine init/systemd Techniken
    Was passiert bei mehr als einem Dienst pro Container?
  • Virtuelle VMs vs. Container
    die Container als „Leichtgewichte“ und ohne Prozesse-Lasten
    und Nutzung von VMs für Docker-Hosts!

Container Lösungen (Wikipedia Containervirtualisierung )

  • Klassiker: FreeBSD Jails, Solaris Zones, OpenVZ (siehe Virtuozzo von Parallels)
  • LXD für LXC (Linux Containers oder Lightweight Linux Container) - Ausgangsbasis für Docker
  • rkt (sprich: Rocket) - von CoreOS (bzw. Produkt Container Linux)
  • VMware Photo
  • Docker - März 2013 Fa. dotCloud - dann Oktober 2013 umbenannt in Docker Inc. mit Sitz in Berlin
    Neue Componenten (ab Version >= 1.11): containerd, runc, aus „Docker Daemon“ wurde Docker Engine;
    aber Version 1.12 mit eingebauter Swarm Technik: Swarm Mode (Anm.: bei Docker mittlerweile für Kubernetes eingestellt!)
    mit Schwerpunkt auf Applikationsvirtualisierung und nicht auf abgespeckte VMs
  • cri-o
    Containerlösung, die eigentlich für Kubernetes entwickelt wurde

Container Formate:

  • Docker, CoreOS/rkt, LXD/LXC, Photon, …
  • OCF (Open Container Format) der OCI (Open Container Initiative - www.opencontainers.org)
  • ...

Erste Docker Befehle

Für den ersten Tag werden wir einfach mal "Learning by Doing" genutzt - also einfach Docker Kommandos nach Vorgabe ausprobiert.

Hierbei wurden stets die entsprechenden Fachbegriffe weiter eingeführt:
Images, Container, Registry, Repository, Tags  

Allgemeine Docker Befehle

Die Versionen für Docker Client und Daemon anzeigen lassen: docker version  

Client:
Version: 18.09.0
API version: 1.39
Go version: go1.10.8
Git commit: e68fc7a215d7
Built: Mon Jan 14 12:00:00 2019
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.8
Git commit: e68fc7a215d7
Built: Mon Jan 14 12:00:00 2019
OS/Arch: linux/amd64
Experimental: false

Docker Versionen lassen sich kaum noch sauber über die Jahre verfolgen/analysieren - in Kürze:
klassische Bezeichner 1.x - 1.10 ... 1.12 ... 1.13 (quasi Version "17.03") ... 18.03 ... 19.03 ...

Die Konfigurationen/Einstellungen der Dockertechnik anzeigen lassen: docker info 

Dockers Hello World!

Wie in jedem "guten" Technikseminar: erst einmal Proof-of-Concept bzw. Funktion:

docker run hello-world
docker ps -a  # klassischer Aufruf
docker container ls -a   # Aufruf seit 1.12 / 1.13
docker images  # klassischer Aufruf
docker image ls  # wieder der modernere / stringentere Aufruf

Zeile 1: Image hello-world aus Registry pullen und starten
Zeile 2+3: alle beendeten Container anzeigen lassen (unterschiedlich gewachsene Syntax)
Zeile 4+5: Images anzeigen lassen, die sich in unserem Docker-System befinden

Basis-Image ubuntu:18.04

Jetzt mal ein "echtes" Image in Form eines offiziellen Ubuntu-Basis-Image aus der Docker Registry (aus dem Docker Hub) mit dem Tag 18.04.

Hier wollen wir das Image pullen und clever starten: Parameter -it (interaktiv / Terminal bereitstellen) und Namen für Container und Hostname bereistellen:

docker run -it --name meinubuntu --hostname meinubu ubuntu:18.04  

Wenn wir einen bereits vorhanden Container nochmals starten wollten:

docker start -i meinubuntu  

Anm.: das gewünschte "t" benötigen wir hier nicht, das weiß der Container schon (s.o.).

Testaufrufe mit uname -a zeigen innerhalb des (hier) Ubuntu-Containers und auf dem Docker-Host denselben Kernel: das ist ja gerade der Clou an Containern - sie nutzen dieselben Systemtechniken wie der Docker-Host!

Auch mal kurz Prozessanalyse im Container (ps ax - zeigt nur einen Prozess: /bin/bash ) und im Docker-Host kann man mit ps axf  die Prozesshierarchien und den /bin/bash-Prozess des Containers unter anderer PID im Docker-Host wiederfinden!

Basis-Image alpine:latest

Ein sehr spannendes Image:

  • sehr klein (ca. 6 MB Image!)
  • kompaktes, einfaches Paketverwaltungssystem (apk) und mit
  • Busybox eine sehr gute "Toolbox" für Linux-Standardbefehle (ip, ping, traceroute, ...)

Wir werden uns an anderer Stelle speziell dem Alpine Linux widmen.

Wir werden auch ein wenig aufräumen:
docker container rm <container-name>  (entfernt Container)
und mit
docker image rm <image-name>  (kann man Images entfernen; alt: docker rmi )

Docker Hilfe

Anm.: eingeschränkte Unterstützung bei Windows (siehe Linux mit Paket docker-bash-completion )!
Erinnerung: also bitte immer fleißig "tab-ben".

Wir haben schon einigen Docker CLI Kommandos genutzt. Jetzt sollen komplettere Aufstellungen folgen.

Onlineportal: Docker Kommandos

Die Aufrufe sind nach Kategorien gegliedert. Die Aufrufe lassen sich teilweise in langer und kurzer Schreibung aufrufen:

docker container ls -a # oder auch kürzer und klassisch mit
docker ps -a

Das hat auch mit historischen Entwicklungen innerhalb der Docker-Versionen zu tun! Eine neue und saubere Kommanostruktur wurde mit Docker Version 1.13 eingeführt.

Wir beginnen aber wie immer mit der eingebauten Hilfe…

Onlineportal: Docker Engine Referenz CLI

Und natürlich kann man auch jederzeit mal die interaktive Docker Hilfe nutzen: docker help  

Usage:	docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default "/home/joeb/.docker")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") ...info
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default ".../.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default ".../.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/home/joeb/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  builder     Manage builds
  config      Manage Docker configs
  container   Manage containers
  engine      Manage the docker engine
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Run 'docker COMMAND --help' for more information on a command.

Mit der Hilfe kann man sich auch weiter in die Kommando-Hierarchien begeben: docker container ps --help 

Usage:	docker container ls [OPTIONS]

List containers

Aliases:
  ls, ps, list

Options:
  -a, --all             Show all containers (default shows just running)
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print containers using a Go template
  -n, --last int        Show n last created containers (includes all states) (default -1)
  -l, --latest          Show the latest created container (includes all states)
      --no-trunc        Don't truncate output
  -q, --quiet           Only display numeric IDs
  -s, --size            Display total file sizes

Und ja: es handelt sich bei der Textausgabe der Hilfe nicht um einen Fehler!
Es wurde docker container ps --help aufgerufen - man erkennt dann die Aliase.

Und zuletzt (in den aktuellen Docker-Versionen) wurden auch klassische Man-Pages für die zusammengesetzten docker-Kommandos implementiert, die man einfach über mit "-2 (Bindestrich) zusammengesetzte Aufrufe erhält: man docker-container-start

 

Wir erarbeiten uns im Seminarverlauf Befehlsübersichten ("Cheat Sheet") und Hilfen zur Docker-Konsole.

 

  • Firewall AUSFirewall AUS
  • VBoxVMs klonenVBoxVMs klonen
  • docker versiondocker version
  • Docker HubDocker Hub
  • Port Forwarding für SSHPort Forwarding für SSH
  • man docker-runman docker-run
  • Ubuntu ContainerUbuntu Container
  • docker searchdocker search
  • docker ... inspectdocker ... inspect

 

Tag 02

Dienstag, 14.02.2023, 08.30 - 16.00 Uhr

Ausführliche Rekapitulation und ein paar "O-Töne Liebel", Teilnehmer-Fragen

Nachträge und Übugen zu JSON...
Anm.: unter Windows müssen wir mit anderen Ansätzen, Techniken und vor Allem Syntax arbeiten.

JSON - (siehe: docker inspect )

Bei der Analyse von Images und Containern hilft das docker [...] inspect Kommando.

Die Ausgabe entstehen in Form von JSON Dateien (Link Wikipdia)

Bitte denken Sie beim Bearbeiten von JSON-Dateien an Folgendes:

  • Kommas und Hochkommas
  • kein Komma mehr hinter dem letzten Listen- oder Dictionary-Element
  • Saubere eckige, geschweifte Klammern

Empfehlung für saubere Ausgabe, Formatierungen und Filterungen: jq   (noch nachinstallieren)

Das kann man auch für die verbesserte Ausgabe von manuellen HTTP-RESTful-Api Docker-Test mit "Webbrowser curl" nutzen:
curl -s --unix-socket /var/run/docker.sock http://localhost/images/json | jq    

Anm./Erinnerung: die Nutzung eines Unix-Sockets stellt sicherheitstechnisch einen Nachteil dar.

JSON und jq Ausgaben

Hinweis: bei CentOS mittels der EPEL-Repos Zugriff auf jq Paket.
Standardausgaben von docker inspect ... (JSON-Format) aufarbeiten und filtern mit jq.

Beispiel: (Kurzerläuterung: JSON als Array interpretieren)

Image Inspektion - nur Abschnitt ContainerConfig - Image ausgeben:

docker image inspect hello-world:latest | jq [.[0].ContainerConfig.Image]

Links zu Tool jq:

Die Ausgabe von Docker Kommandos ist auch über Go-Templates möglich: (Go Templates )

docker image inspect alpine:latest --format '{{.Config.Cmd}}'
[/bin/sh]
docker image inspect alpine:latest --format '{{json .Config.Env}}' | jq
[
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
]
# weitere Beispiele
docker inspect -s -f "{{.State.Status}}" mariadb-test5
docker inspect -s -f "{{.State.FinishedAt}}" mariadb-test5

Oder aber wir optimieren die Ausgabetabelle eines Docker-Befehls:
Formatierte / tabellarische Ausgaben mit Schalter --format:

docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Labels}}"

Besondere Erwähnung neben dem Format table sollte hier das Format json erfahren, was uns wieder zum Tool jq bringt (s.o.)!

Registry - Repository, Image:Tag

Klärung der wichtigen technischen Zusammenhänge:

registry scribble 800px

Registry

Die Standard-Registry der Docker-Umgebung analysiert man mit: docker info | grep -i registry 
Das ist normalerweise der Docker-Hub : https://index.docker.io/v1/    (Registry in Version 1 - es gibt aktuell auch schon V2)

Später wollen wir ggf. auch Private Registry betreiben (z.B. vm-opensuse-10:5000)

Online kann man den Docker Hub über das Webportal analysieren: hub.docker.com 
Empfehlung: später mal einen Account anlegen für eigene Ablagemöglichkeiten auf Docker Hub und Sicht auf technische Analysen von Images (Sicherheitschecks)!

In der Konsole:

Einfache Suche: docker search ubuntu 

Anzahl Images (hier: ubuntu): docker search ubuntu | grep "\/ubuntu\ " | wc -l  

Filtern: docker search --filter=stars=7 --filter=is-official=true ubuntu   

Die Images werden per docker pull aus der Registry geholt, indem man den Namen des gewünschten Repository bzw. Image angibt.

Repository, Image:Tag

Zusammenfassung aller Versionen (Tags) zu einem Image.

Offizielle Docker Images erkennt man am einfachen Namen (ohne /): ubuntu
Wird nur der Name genannt pullt Docker das Image ubuntu:latest 

Inoffizielle Repositories haben einen Schrägstrich im Bezeichner: phpmyadmin/phpmyadmin 
Der erste Teil ist die Docker ID auf dem Docker Hub (der Standard-Registry) und danach kommt der Image-Name.
Bei den Offiziellen Docker Images ist der formale komplette Name (z.B.): library/ubuntu

Images und Container

Übungen und Techniken: wie kommen wir über Images an nutzbare Container?!

Auszug aus Trainer-Cheat-Sheet (für Teilnehmer als LibreOffice Draw und als Download auf diesem Portal)

image container crop 800px

Der Container in "einem Schritt": docker run -it --name ubu1 ubuntu:18.04 

Achtung: jedes weitere docker run ... erzeugt immer wieder neue Container!

Die Schritte im Einzelnen:

  • docker pull ubuntu:18.10  
    Image ubuntu:18.10 aus Registry holen
  • docker create -i -t --name ubu2 ubuntu:18.10 
    erstellt Container ubu2 aus Image ubuntu:18.10 mit interaktiv- und tty-Schaltern!
  • docker start -a -i ubu2 
    startet Docker Container ubu2 attached und interaktiv

Das "Attachen" an Container kann man auch nutzen, wenn man einen Container mal einfach ohne die Schalter gestartet (start, run) hat.

  • docker attach ubu2 
    Zugriff auf Container-Terminal von ubu2

Und für die "äußerliche" Nutzung von Containern hilft immer

Achtung: bei den meisten Containern ist ja die Bash (oder Sh) der "Urprozess". Das heißt, das man mit dem Befehl exit natürlich auch den Container stoppt!

Befehl in Container ubu2 ausführen

docker e x e c ubu2 c a t / etc / os-release 

Stattdessen kann man das Terminal auch mittels Strg+P, Strg+Q terminieren - also ohne den Container zu stoppen.

Beispiel: Offizielles Image mariadb

Das Image stellt mit dem MariaDB-Service einen Background Prozesse zur Verfügung!
Anm./Erinnerung: Container ohne Prozess(e) wird gleich wieder beendet! (siehe: hello-world)

Wir starten einen Container für das offizielle Image mariadb:latest im detached-Mode (quasi: Hintergrund):

docker run -d --name mariadb-test1 -e MYSQL_ROOT_PASSWORD=geheim mariadb
# Stoppen des Containers:
docker stop mariadb-test1
# Containerinfos auslesen:
docker inspect maria-db-test1

Beachten: MariaDB Datenbank Verzeichnis /var/lib/mysql liegt (noch) im Docker-Container!

Die Datenbank (wenn der DB-Container läuft) gerne mit MySQL/MariaDB-Client checken:

docker e x e c -it mariadb-test1 mysql -u root -p
# Den Container analysieren:
docker e x e c -it mariadb-test1 /bin / bash
cat /etc / os-release
p s ax
mysqld --version
e x i t

Das Logging übernimmt Docker für den Hintergrund-Daemon Mysqld:

docker logs mariadb-test1.

Jetzt noch ein Container - hier mit Portumleitungen:

docker run -d --name mariadb-test3 \
     -p 13306:3306 mariadb

Und jetzt klappt der Zugriff auch direkt über den Docker-Host:

mysql -u root -h 127.0.0.1 --port=13306 --protocol=tcp -p

Anm.: bei Tests mit MySQL-Client-Zugriffen war es hier wichtig bei Angabe des Hosts die IP (127.0.0.1) zu nutzen und nicht den Reservierten Namen localhost.
Die Belegung von Ports ist immer zu hinterfragen, zu checken und bestenfalls zu kommentieren!

 

Was uns hier noch fehlt, sind Datenspeicher für die Datenbank außerhalb des Containers (Stichwort: Volumes) und eigene Netzwerke für das Verbinden mit weiteren Containern.

Für die Erstellung neuer Images dient (siehe) Kurzübersicht docker commit ... als Umsetzung. Das ist aber häufig keine saubere und gute Lösung für neue Images, da bei dieser Herstellung meist zu viele Schichten (Layers) und zu hohe Image-Größen entstehen.

Erkenntnis: Wir benötigen einen sauberen Build-Prozess mit docker build ... und Dockerfile Direktiven (Dateien).

Dockerfile (Einführung)

Bis jetzt haben wir fertige Images (siehe hub.docker.com) genutzt und mit diesen Images die Container erstellt.

Hinweis: mit docker-compose werden später mehrere Container kombiniert in einem Arbeitsschritt eingerichtet!

Die meisten Images wären auch ordentliche Vorlagen, aber z.B. in Ubuntu würde man vielleicht gerne das Paket iproute2 nachinstallieren, … usw.

Also wollen wir jetzt unsere eigenen Images erstellen und bedienen uns eines Dockerfile, das die nötigen Anweisungen enthält!

Kurzanleitung

  • Ordner für Image-Bauprozess erstellen
  • ggf. Dateien im Ordner bereitstellen (z.B. Skripte, Webdateien/Ordner)
  • Datei Dockerfile im Ordner erzeugen und Inhalt/Konfiguration für Image festlegen
  • mit docker build ein neues Image lokal erzeugen
    und dann mit docker run oder docker create und dann docker start  nutzen
  • mit docker push (ggf.) im Docker-Hub veröffentlichen (wörtlich zu nehmen: public)

Alternative Veröffentlichungstechniken für eigene Images:

  • GitHub für Dockerfile bzw. Ordner/Dateien für automatisierte Builds
  • Private Image Repository auf Docker Hub (ggf. $)
  • Eigenes (privates) Docker Repository

Links:

In einer Fortsetzung zu docker-Builds (Dockerfile) jetzt mehr zu den Anweisungen und technischen Umsetzungen...

Dockerfile - die Datei

Das Dockerfile hat eine eigene Syntax...

Schlüsselworte für ein Dockerfile (Directives) als Tabelle:

SchlüsselwortBedeutung
FROM gibt das Basis-Image an
LABEL legt Zeichenkette fest
RUN führt das Kommando aus
ADD kopiert Dateien in das Dateisystem des Images
COPY kopiert Dateien aus Projekverzeichnis in das Image
ENTRYPOINT führt Kommando beim Start des Containers aus
CMD führt Kommando beim Start des Containers aus
ENV setzt Umgebungsvariablen
EXPOSE gibt die aktiven Ports an
USER Account für RUN, CMD und ENTRYPOINT
VOLUME gibt/legt Volumes an
WORKDIR Arbeitsverzeichnis für RUN, CMD und ENTRYPOINT

Erläuterungen:

Kurze Analyse / Erläuterungen:

ADD vs. COPY - scheinen ja dasselbe zu tun,
aber ADD kann…

  • … auch mit URL umgehen
  • … auch (wie COPY) Verzeichnisinhalte komplett kopieren
  • mit TAR-Archiven arbeiten/entpacken (gzip, bzip2, xz)

Beide können mit –chown=user:group Parameter umgehen.

In Kürze: COPY nur für einfaches Kopieren einer lokalen Datei.

CMD vs. ENTRYPOINT - Startkommandos für Container

Wenn man Container mit mit docker run Komandos anfügt, dann …

  • … wird bei CMD das angefügte Kommando anstelle von CMD ausgeführt
  • … wird bei ENTRYPOINT das Kommando hinzugefügt

Jetzt wollen wir uns mal ein paar Beispiele erstellen und Images erzeugen (Image Building)

Dockerfile - Beispiele

Die folgenden einfachen Beispiele lassen sich beliebig im "Netz" oder auch auf den Docker-Portalen finden.

Die folgenden Verweise zeigen an, dass die Beispiele dem aktuellen Buch "Docker - Das Praxisbuch für Entwickler und DevOps-Teams von Bernd Öggl, Michael Kofler" aus dem Rheinwerk-Verlag entstammen. Die beiden Autoren haben ebenfalls seit Ende Januar 2020 eine neue Auflage dieses Fachbuchs herausgebracht!

Alle Beispiele wurden ausführlich mit den gelernten Docker-Techniken "containerisiert" und getestet.

Beispiel 01

Einfaches Images mit PHP 7 und Apache2 Webserver basierend auf Basisimage mit dieser Kombination:

FROM php:7-apache
ENV TZ="Europe/Amsterdam"
COPY index.php /var/www/html

Man erkennt die Festlegung einer Umgebungsvariablen und das Kopieren einer Datei in den Container.

Image erstellen mit (z.B.): docker build -t joebseminar/myphpapache:1.0 . 

Zu beachten ist hier der Punkt am Ende für den Basisordner (hier: dieser Ordner) des Build-Prozesses mit dem Dockerfile und der index.php .

Beispiel 02

Mit Basisimage Ubuntu (Tag: 18.04) ein Image mit Editor-Installation joe und Aufräumen  der Apt-Technik. Hier stellen wir auch eine Shell (hier: Bash) bereit, mit der wir später "-i / --interactive" und "-t / --tty" über ein Terminal kommunizieren können.

FROM ubuntu:18.04
LABEL maintainer "Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!;
RUN apt-get update && \
apt-get install -y joe && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
CMD ["/bin/bash"]

Zu beachten ist hier, dass durch das "einzeilige" RUN-Command die Image-Größe und die Layer-Erzeugung (hier: 1 Layer für RUN) optimiert wird.

Beispiel 03

Wieder wird das Basisimage ubuntu:18.04 genutzt: Webserver Apache2 mit http/https-Unterstützung und einer kleinen (von mir vorbereiteten) Beispiel-Website.

TODO: aktuelle Beispiele einpflegen! Würde ich ja machen, aber der Code wird leider immer von den Webservern als "unsauber" abgelehnt!

 

FROM ubuntu:18.04
LABEL maintainer "Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!;
LABEL description "Test"

# Apache installieren, und unnötige Dateien aus dem Paket - Cache
# gleich wieder entfernen
RUN apt-get update && \
apt-get install -y apache2 && \
apt-get -y clean && \
rm -r /var/cache/apt /var/lib/apt/lists/*
# HTTPS -Unterstützung aktivieren
RUN a2ensite default-ssl && a2enmod ssl

ENV APACHE_RUN_USER=www-data \
APACHE_RUN_GROUP=www-data \
APACHE_LOG_DIR=/var/log/apache2

EXPOSE 80 443
# gesamten Inhalt des Projektverzeichnisses
# samplesite nach /var/www/html kopieren

COPY samplesite/ /var/www/html
CMD ["/usr/sbin/apache2ctl" , "-D" , "FOREGROUND"]

Nach dem Building mit bekanntem Aufruf
docker build -t joebseminar/mywebserver:1.0 .  

muss das Image nur geschickt für die äußere Netzanbindung über Ports gemappt werden:
docker run --hostname webserver --name mywebserver \
  -p 8080:80 -p 8443:443 \
  joebseminar/mywebserver:1.0
  

Jetzt kann man die Beispielseite über einen Browser erreichen.

 

  • Image whalesayImage whalesay
  • docker mit Tilixdocker mit Tilix
  • Image mariadbImage mariadb
  • mysql-Client Testingmysql-Client Testing
  • docker builddocker build
  • https Port Forwardinghttps Port Forwarding

 

 

Tag 03

Mittwoch, 15.02.2023, 08.30 - 16.00 Uhr

Rekapitulation zu Docker Builds mit Dockerfile-Dateien, Teilnehmer-Fragen

Übungen (Forts.) zu Dockerfile

Weitere Beispiele für die Umsetzungen Image-Build-Prozess und Inbetriebnahmen über docker run ... und/oder docker start ...  

Hinweis auf meine Online-/Offline HandOuts für die Teilnehmer: RestructuredText-Dokumente für SphinxDoc Dokumenterstellungen (HTML, EPUB, PDF, ...)

 

Alpine Linux

Für das Linux zeichnet die Firma Gliderlabs verantwortlich.

Quellen:

Technisches:

  • als C-Standardbibliothek wird musl statt glibc genutzt
    das stellt häufig ein Problem bei zu kompilierenden Programmen dar
  • einfachere Auswertung von /etc / resolv.conf (keine domain und search Beachtung)
  • es existiert für Alpine Linux optimierte glibc (pkg-glibc )
  • als Init-System wird OpenRC statt systemd oder sysv-init genutzt
    erinnert eher als klassisches init-System und arbeitet mit /etc / inittab
  • Wichtig: OpenRC ist installiert! Arbeitet aber nicht! S.a. Logging (rsyslog nachinst.)
  • Linux Kommandos stammen von BusyBox

Alpine Linux lässt sich schnell ausprobieren:

docker run -it -h alpine --name alpine alpine

Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
cd784148e348: Pull complete
Digest: sha256:46e71df1e5191ab8b8034c5189e325258ec44ea739bba1e5645cff83c9048ff1
Status: Downloaded newer image for alpine:latest
/ # cat /etc / os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.8.2
PRETTY_NAME="Alpine Linux v3.8"
HOME_URL="http://alpinelinux.org"
BUG_REPORT_URL="http://bugs.alpinelinux.org"
/ #

Container-Analyse (in separater Shell natürlich): docker ps -s (Größen anzeigen) zeigt einen nur wenige Bytes großen Alpine-Container, basierend auf einem wenige Megabytes (!) großem Alpine-Image.

Shell

Die Shell ist standarmäßig /bin / sh bzw. /bin / ash (Teil von BusyBox)

Die Bash lässt sich nachinstallieren, was den Komfort erhöht, aber auch die Speichergrößen deutlich anschwellen lässt.

apk add --update bash bash-completion

BusyBox

Enthält ca. 140 Linux Standardkommandos, die als Symlinks zu busybox integriert sind.

Siehe: ls /bin /sbin -l 

Hilfe zu BusyBox: https://busybox.net/downloads/BusyBox.html

Hilfen / Dokumentation

Es gibt keine man-Pages oder den Pager less! Nachinstallationen wären aber möglich mit:

apk add --update man man-pages mdocml-apropos less less-doc
export PAGER=less
apk add --update bash-doc

Die man-Pages der Tools habe immer die -doc Paketendung!

Hilfe zu diesen Topics: siehe Alpine Doku 

Paketverwaltung apk

Das Verwalten von Paketen (Software) mit apk unter Alpine Linux:

KommandoFunktion
apk add <paketname> installiert Pakete
apk del <paketname> entfernt Paket
apk info (<paketname>) listet installierte Pakete auf (auch mit -L und --who-owns)
apk search <paketname> sucht Paket in Paketquellen
apk stats zeigt Anzahl Pakete
apk update zeigt, welche Pakete aktualisierbar sind
apk upgrade aktualisiert Pakete

Pakete in Roh-Alpine: apk info | sort 

/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
v3.8.2-19-g151c2021d6 [http://dl-cdn.alpinelinux.org/alpine/v3.8/main]
v3.8.2-18-gd7f33f856a [http://dl-cdn.alpinelinux.org/alpine/v3.8/community]
OK: 9546 distinct packages available
/ # apk info | sort
alpine-baselayout
alpine-keys
apk-tools
busybox
libc-utils
libressl2.7-libcrypto
libressl2.7-libssl
libressl2.7-libtls
musl
musl-utils
scanelf
ssl_client
zlib
/ #

Empfehlung: ein apk update vor irgendwelchen Installationen / Konfigurationen! Es gibt gut 9500 Pakete!

Tipp: In Dockerfile ein apk add --no-cache zum installieren nutzen:
es wird ein --update durchgeführt, aber nach dem Install wird das System wieder bereinigt!

# Datei Dockerfile
...
RUN apk add --no-cache \
build-base \
python-dev \
jpeg-dev \
zlib-dev \
ffmpeg \
&& pip install sigal \
&& pip install cssmin \
&& apk del build-base python-dev jpeg-dev zlib-dev

Paketübersicht online: https://pkgs.alpinelinux.org/packages

Hier waren jetzt auch die Paketquellen erkennbar; Anzeige mit: cat /etc/apk/repositories 

Alpine Linux mit Apache2 Webserver

Hier sind wir durch Recherchen zu Alpine Linux und diversen Dockerfile Analysen herausgefordert worden:
Anm.: Apache muss als Prozess am Laufen gehalten werden im Container - sonst ist der Container ja gleich wieder beendet!

 

FROM alpine

LABEL maintainer "Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!"
LABEL description "Test Alpine und Apache"

RUN apk update && apk upgrade && \
    apk add apache2 libxml2-dev apache2-utils && \
    rm -rf /var/cache/apk/*

# dieses run-Verzeichnis musste mal erstellt werden!
# RUN mkdir /run/apache2

ENV APACHE_RUN_USER=apache \
    APACHE_RUN_GROUP=www-data 

EXPOSE 80

COPY samplesite/ /var/www/localhost/htdocs

CMD ["/usr/sbin/httpd", "-DFOREGROUND"]

 

Anm.: die benutzte Beispielseite (HTML-Projekt in Ordner samplesite) als einfaches HTML5-Gerüst mit einfachem Prüftext.
Vorschlag: alternatives Dockerfile mit apk add --no-cache  Direktive bzw. komplette Umsetzung inklusive https/ssl.
Anm.: letztere Varianten gibt natürlich schon vorbereitet auf dem Docker Hub.

 

Docker mit Debian Linux

Früher später - ehrlich gesagt eher früher ;-) - stellt man fest dass viele Docker / Container Umsetzungen sich nur unter Linux wohl fühlen (also problemlos funktionieren). Insbesondere viele Versuche mit mehreren vernetzten Containern streiken gerne mal in einer improvisierten Container OS Umgebung.

docker debian engine install 800px

Den Einstieg führe ich of mit einer aktuellen stabilen Debian Installation durch (aktuell: Debian 11 Bullseye). Da greift man einfach mal zu einer virtuellen Umsetzung (in Seminaren oft Hyper-V unter Windows) und installiert Debian inklusive Gnome Desktop für eine erste einfache Bedienung. Später sind diese VMs natürlich ohne GUI und reine Serverinstallationen.

Wichtig: wir installieren die Docker Engine und nicht wie unter Windows mit WSL2 den Docker Desktop!

Sehr ordentliche und stets aktuelle Anleitungen liefert wieder die Docker Dokumentation:

Debian 10 / 11 - Installation Docker Engine 

Kurzanleitung:

  • Debian aktualisieren und nötige Tools / Pre-Installationen checken
  • Docker Repo für Debian inkl. Key hinzufügen
  • Debian Repos aktualisieren / neues Repo nutzen
  • Docker Engine (Docker CE) und weitere vorgeschlagene Paket installieren
  • Hello World testen

Nochmals: Bitte hier die Docker Engine installieren und nicht die Software Docker Desktop für Linux! Für den Docker Desktop für Linux würde man eine "Nested VM" benötigen - also eine VM mit eigener Virtualisierungsfähigkeit. Das ist zwar (z.B. mit Hyper-V) kein Problem, würde aber weitere Konfigurationen benötigen!

 

Übung: Drei Container mit Netz und Mounts

Wir komplettieren die Container-Techniken und verdrahten unsere Container mit

  • Netzwerken - docker network create ...
  • Mounts - Ordnerbindungen zwischen Container und (lokalem) Dockerhost

Wir erstellen uns ein neues Docker Netzwerk:

docker network create test-net

   (Anm.: wenn nicht angegeben --driver bridge  )

Übersicht über die Docker Netzwerke:

docker network ls

  

Inspektion (Eigenschaften) unseres neuen Netzwerks:

docker network inspect test-net | jq

   (Hier: Subnet 172.18.0.0 / 16 )

Im Seminar zeige ich gerne über mehrere Erstellungsphasen die nötigen Bauteile für das gewünschte Szenario (wenn es die Zeit erlautb):

  • Datenbank-Server (Image: mariadb)
  • WordPress (Image: wordpress)
  • PhpMyAdmin (Image: phpmyadmin/phpmyadm)

drei container planen 800px

Und schon kann es mit der Produktion der Container losgehen...
Tipp: ich würde erst einmal mit den ersten beiden Containern für WP/MariaDB Combi beginnen!

Container: MariaDB4WP

docker run -d --name MariaDB4WP \
    --network test-net \
--env MARIADB_USER=wpuser \
--env MARIADB_PASSWORD=geheim \     --env MARIADB_ROOT_PASSWORD=geheim \
--env MARIADB_DATABASE=wpexample \     -v /home/joeb/dockerdata/wpmysql:/var/lib/mysql \     mariadb:latest

Container: WP01

docker run -d --name WP01 \
    --network test-net -p 8081:80 \
    -e WORDPRESS_DB_PASSWORD=geheim \
    -e WORDPRESS_DB_HOST=MariaDB4WP \
-e WORDPRESS_DB_USER=wpuser \
-e WORDPRESS_DB_NAME=wpexample \     -v /home/joeb/dockerdata/wphtml:/var/www/html \     wordpress

Container: PMA01

docker run -d --name PMA01 \
     --network test-net -p 8080:80 \
     -e PMA_HOST=MariaDB4WP \
     phpmyadmin/phpmyadmin

Und die Tests - wie immer - mittels Browser im Docker-Host.

Dieses Beispiel soll zeigen, dass die gemeinsame Nutzung mehrerer Container viele Anforderungen und Tipparbeit kostet. Mit Hilfe weiterführender Techniken (siehe Docker Compose) wollen wir uns diese Arbeit erleichtern.

Als Nächstes werden wir dann die Container versuchen in einem Arbeitsschritt zu starten / zu komponieren.

  • Hilfe docker runHilfe docker run
  • Alpine LinuxAlpine Linux
  • CMD / ENTRYPOINTCMD / ENTRYPOINT
  • WordPress DockerfileWordPress Dockerfile
  • Drei Container Ein NetzDrei Container Ein Netz
  • PhpMyAdminPhpMyAdmin

 

Tag 04

Donnerstag, 16.02.2023, 08.30 - 16.00 Uhr

Rekapitulation, Teilnehmer-Fragen

 

docker-compose

Jetzt wollen wir die Bereitstellungen von weiter Containern verbessern. Mit docker run ... geht das zwar relativ einfach, aber wir wollen die Anweisungen für mehrere Container zentral organisieren.

Die docker-compose Technik betreibt die Container hierbei in ihrer nativen (puristischen) Weise: die Container werden beim Beenden entfernt!
Getreu dem Docker Motto: "Container sind zum Wegschmeißen!"

Konfigurationsformat: YAML

Die Konfiguration wird in der Textdatei docker-compose.yml bereitgestellt. Es handelt sich also um ein YAML gestylte Konfigurationsdatei.

Infoseiten zu YAML:

Für die Konformität der *.yml-Dateien (oder *.yaml) kann wieder ein ordentlicher Editor (siehe VS Code) mit entsprechender Unterstützung sorgen.

Hinweis: Die Einrückungen (mit Leerzeichen) müssen genau passen - sie bestimmen die Gliederungen!

Kurzanleitung:

  • Abschnitt mit -
  • Kommentar mit #
  • Liste mit Bindestrich - oder in [eins, zwei, drei]
  • Hash mit key: wert oder {name: Joe, nachname: Brandes}
  • Textblock (mit Zeilenumbrüche) mit |
  • Textblock (ohne Zeilenumbrüche) mit >

Beispiel:

# Datei sample.yaml
data:
  list:
    - item1
    - item2
  key1: >
    Dieser Text ist dem
    Schlüssel 'data.key1' zugeordnet.
  key2: |
    code line 1
    code line 2

YAML-Tool: shyaml

Anm.: ein Python-Script - Entwicklerlink zu shyaml

openSUSE: sudo pip install shyaml   
Anm.: z.B. bei CentOS muss erst Paket python-pip installiert werden!

Beispielaufrufe: shyaml get-value data.key1 < sample.yaml  oder alternativ
cat docker-compose.yml | shyaml get-value services.joomla.image  (s.u.: ergibt: joomla)
cat docker-compose.yml | shyaml get-value services.joomla.ports  (s.u. ergibt: -8083:80)

Technik

Technischer Hintergrund: (Anm.: bei Docker Desktop für Windows/Linux ist docker-compose bereits verfügbar)

In aktueller Docker-Technik kann man die docker-compose Techniken auch mit docker stack deploy Techniken - also: Swarm Services - ausführen und arbeitet quasi mit einem Minimal-Swarm von einer Docker-Instanz! In 2019/2020 hat Docker verkündet zukünftig die eigene Swarm-Technik mit Kubernetes (K8s) zu ersetzen.

Anmerkungen:

  • Das docker-compose Python-Skript kann Problemchen bereiten (Python!)
  • Wir beschränken uns - an dieser Stelle - auf docker-compose und behalten uns die Swarm-/K8s-/Orchestrierungs-Techniken für später auf.

Online / Links:

Einfache Downloads bzw. Installation: (alternative Bereitstellungen - siehe Webportal - sollten analysiert werden; Versionen beachten)
Anmerkung: seit geraumer Zeit lassen sich die Docker Compose Techniken entweder sehr viel einfacher installieren, oder aber docker-compose ist als Befehl docker compose bereits verfügbar - bitte die Anleitungen genau beachten!

curl -L https://github.com/docker/compose/releases/download/1.25.3/docker-compose-`uname -s`-`uname -m`
        -o /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose        # Originalanleitung mit /usr/local/bin - siehe $PATH

docker-compose <commands> bzw. docker compose <commands>

  • config (Analyse)
  • up -d | down (up normalerweise immer kombiniert mit -d)
  • events
  • kill (falls stop|down nicht funzt)
  • logs (Logging zeigen)
  • pause | unpause
  • ps (listet die Container auf)
  • images (listet die Images auf)

Beispiele: docker-compose.yml 

Was für die Docker Standardtechniken (docker run) das Dockerfile darstellt ist nun die Konfigurationsdatei docker-compose.yml für unser Tool docker-compose!

Tipp: schöne und aktuelle Docker Compose Beispiele auf https://github.com/docker/awesome-compose oder beim Dockerbuch von Öggl/Kofler.

Beispiel 01: Wordpress-Installation:

# Datei test/docker-compose.yml
version: '3.7'

services:
  db:
    image: mariadb:latest
    volumes:
      - /var/dc-wp-db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: geheim
    restart: always

  wordpress:
    image: wordpress:latest
    volumes:
      - /var/dc-wp-www:/var/www/html
    ports:
      - "8082:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: geheim
    restart: always

Dieses Hello WordPress!-Beispiel zu docker-compose zeigt die zusätzliche Intelligenz des docker-compose-Tools gegenüber den Basistools Docker. Nicht einmal Netzwerkkonfigurationen werden benötigt! Und in dieser Konfiguration wird (sehr einfach und unsicher) der Zugriff auf die Wordpress-DB mit dem MySQL-/MariaDB-root verdrahtet. Wir wollen später eigene DB-Accounts für die Web-/CMS-Projekte nutzen.

cd test # hier ist das docker-compose.yml
# mkdir /var/dc-test-www # Volume Wordpress HTML; kann man weglassen (!)
# mkdir /var/dc-test-db # Volume MariaDB Databases; kann man weglassen (!)
docker-compose up -d # Schalter -d bietet wieder detached mode - sonst habe ich Logging Konsole

Test hier einfach wieder mit Browser (URL): localhost:8082 und man schaut sich mal Docker Netzwerke und alle möglichen Container, Netzwerke (und später Volumes) an.
Hinweis: ohne Schalter -d sieht man - wie auch sonst bei Docker - das Logging der Dienste in der Konsole!

Danach kann man alles wieder beenden und löschen:

docker-compose down # es bleiben nur die Volumes!
rm -Rf /var/dc-test-db /var/dc-test-www # Volumes müssen manuell gelöscht werden

Übung: weiteren Container einbauen!
Einbau von PhpMyAdmin in die Technik wie in den manuellen Vorübungen mit einzelnen Docker-Run Aufrufen für die einzelnen Container.

Beispiel 02: CMS Joomla!

Mit einem 2. docker-compose Beispiel (Joomla-Installation) können wir die Nutzung von Docker Volumes sehen:

(Anm.: bitte aktuell Version aus Github Repo docbuc beachten)

# Datei: joomla/docker-compose.yml
version: '3.1'
services:
  joomla:
    image: joomla:apache-php7
    ports:
      - 8080:80
    volumes:
      - webdata:/var/www/html
    environment:
      JOOMLA_DB_HOST: mariadb
      JOOMLA_DB_NAME: dockerbuchuser
      JOOMLA_DB_USER: dockerbuch
      JOOMLA_DB_PASSWORD: joomlageheim
  mariadb:
    image: mariadb:10
volumes:
- mysqldata:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: geheim MYSQL_DATABASE: dockerbuch MYSQL_USER: dockerbuchuser MYSQL_PASSWORD: joomlageheim volumes: webdata:
mysqldata:

Hier wurde also die (für die Persistenz von Projekten) nötigen Docker Volumes mit den Namen webdata: und mysqldata: deklariert und (oben) genutzt!
Tipp/Hinweis: quasi wie Laufwerke - denke an C:

Außerdem gibt es einen exklusiven Account für die Joomla-DB, die im MariaDB-Container genutzt wird.

Übung: Wenn man das CMS Joomla - mit den hier vorgegeben Werten - durchinstalliert, darf man bei der Info zum DB-Server einfach den Hostname "mariadb" nutzen, obwohl man schnell herausfinden kann, dass der Container eigentlichen einen der kryptischen Hostnames hat (z.B. "6ad8549bb310"). Wie funktioniert das? Tipp: Inspektion!

Recherchen auf dem Docker Hub zeigen:
statt angebotenen docker-compose.yml Dateien sieht man stattdessen die stack.yml Dateien. Dieses kompatible (eigentlich identische) Format gehört zu der Docker Swarm Technik (Container Orchestrierung mit Docker Technik; aktuell in Ablösung befindlich - auch bei Fa. Docker - durch Kubernetes/K8s). 
Tipp: für die Nutzung als "stack.yml" die Version (z.B.) auf '3' stellen.

 

Wir wollen uns also jetzt mal die Techniken ansehen, mit denen Docker uns Datenträgermangements außerhalb der Container für persistente Daten anbietet..

Volumes

Volumes lassen sich unter Docker als Mounts oder Volumes nutzen und können unterschiedlich erstellt/gebunden sein.

  • Bind Mounts
    z.B. durch -v /var/dc-test-www:/var/www/html   
  • Docker Volumes
    • mit docker volume create ...  manuell erzeugen oder
    • als Direktiven volumes: in docker-compose.yml oder Dockerfile automatisch erzeugen

Nur echte Volumes lassen sich mit docker volume ls auflisten - nicht die Mounts!

Die Volumes lassen sich genauer mit docker volume inspect ... analysieren.

Wenn man mit docker-compose Container gearbeitet hat und dann beim docker-compose down noch den Schalter -v anhängt werden automatisch alle Volumes der docker-compose.yml gelöscht.

 

Übungen: Container Prinzip mit neuem Debian 11 VM mit Docker Engine

Wir haben eine vorbereitete VM (hier: Debian 11 Bullseye) einfach in einer Hyper-V Umgebung importiert (oder auch in einer VirtualBox-Umgebung integriert) und in Betrieb genommen.

Installations-Hinweise: https://docs.docker.com/engine/install/debian/ (auf dem Docker Docs Portal)

Wir installieren also die Docker Engine! (Nicht den Docker Desktop für Linux)

Für die Docker Compose Installation: https://docs.docker.com/compose/install/
Empfehlung: Docker Compose Plugin!

Recherchen und Installationen mit: apt search ... / apt show ... / apt install ...
Für ssh (ggf.) gleich den openSSH-Server nachinstallieren: apt install openssh-server 

Für die Inbetriebnahme unserer heute getesteten und entwickelten docker-compose-Container-Umgebungen müssen wir nur einen docker-compose-Ordner in den neuen Docker-Host kopieren und die komplette Technik mit einem einfachen docker-compose up -d  in Betrieb nehmen - fertig!

In der nächsten Stufe für die Container - der Orchestrierung von vielen und mehrfachen Containern auf mehreren Docker Hosts - kann diese Technik dann ebenfalls prinzipiell genau so einfach etabliert werden - ich find's Super ;-)

 

  • Hilfe docker-composeHilfe docker-compose
  • docker-compose up -ddocker-compose up -d
  • docker-compose.ymldocker-compose.yml
  • 3 Container per compose3 Container per compose
  • stack.ymlstack.yml
  • Docker VolumeDocker Volume

 

 

Tag 05

Freitag, 17.02.2023, 08.30 - 16.00 Uhr

Rekapitulation, Teilnehmer-Fragen

Topics / To-Do:

  • Linux-Alternativen:
    siehe Vorinstallationen Debian, CentOS 7 (ohne Gui), openSUSE Leap, ...
  • Nach all der Konsolentechnik: der Portainer
    ein wenig Oberflächenluxus für die Verwaltung mit portainer
  • Docker Desktop für Windows
    jetzt werden wir den Hyper-V benötigen
  • Eigene Basis Images
    Wir sollten uns auch Gedanken machen, um Basis-Images selbst zu erstellen, damit wir wirklich die volle Kontrolle über das Grundtechniken für unsere Container haben.
  • Registries
    Docker Hub Account / Private Docker Registry
  • Einblick in Orchestrierungen
    • Docker Swarm (auch wenn mittlerweile abgekündigt!)
    • MiniKube,
    • Kubernetes (K8s), Kubic (Suse), ...
    • siehe KodeKloud Video (gegen Ende ab ca. 1:54:44)
  • ... gibt so vieles auszubprobieren und zu Entdecken ;-)

Und los geht es ...

Portainer

Auf portainer.io - oder natürlich über den Docker Hub - kann man eine Container-Oberflächentechnik finden, die sich einfach und schnell als Container nutzen lässt.

Wichtig: das folgende Beispiel ggf. nicht mehr aktuell - bitte immer die aktuellen Anleitungen auf den entsprechenden Dokumentationen (hier: docs.portainer.io) beachten!  

Es war einmal ;-)

docker volume create portainer_data  
docker run -d -p 8000:8000 -p 9000:9000 \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data \  
    portainer/portainer 

   

Die Administrations-Oberfläche lässt sich dann auf dem Dockerhost über Port 9000 erreichen.

Portainer 800px

Hier sind die Standard-Konnektionen sichtbar für die Admininstrationspartner: von Docker/Local bis zur Azure Cloud.

Die neuen Portainer unterscheiden eine CE (Community Edition) und eine BE (Business Edition).

Wir haben uns ein wenig umgeschaut...

Docker Desktop for Windows

Installation: Spezielles Installationsarchiv für eine Windows-Umgebung mit Hyper-V-"Rolle" oder eine Kombination mit WSL2 von Windows 10/11.
Anm.: Für den Download war ein Docker Account nötig! Heute gerne einfach choco install docker-desktop.

WICHTIG bei Parallelinstallation mit anderen Virtualisierern (siehe hier Oracle VirtualBox in unserer Seminarwoche):
wenn Windows mit aktiviertem Hyper-V läuft können diese anderen Virtualisierer nicht mehr funktionieren, da das Windows auf dem sie laufen quasi selber eine virtuelle Instanz darstellt (Stichwort: Hyper-V ist Hypervisor Typ 1).

Lösung bei Parallelinstallationen: wenn nicht Hyper-V - sondern die anderen Virtualisierer genutzt werden sollen dann mit "administrativer" Konsole (cmd):

bcdedit /set hypervisorlaunchtype Off

   (stellt Hyper-V aus - benötigt Neustart)

bcdedit /v

  (zeigt die Konfiguration)

bcdedit /set hypervisorlaunchtype Auto

  (stellt Hyper-V wieder an - benötigt Neustart)

Installiert werden verschiedenste ISOs (docker-for-win.iso, config.iso, docker.iso) und ein eigenes Hyper-V-Netzwerk DockerNat. 
Virtuelle Docker-Linux-VM: klassisch MobyLinuxVM - aktuell als DockerDesktopVM in der der Hyper-V VM-Verwaltung sichtbar.

Die Docker-Installation wird über ein "Managment-Symbol" in der Systemleiste/Taskleiste verwaltbar.
Vorteil: wir haben gleich einige andere Docker-Tools (siehe docker-compose, Kubernetes, ...) mit an Bord!

Die Konfiguration der Docker-Umgebung kann angepasst werden (z.B. Anzahl CPU Kerne).

Die Docker Aufrufe sollte man mittels PowerShell durchführen. Ein Aufruf von

docker version

zeigt dann die genaue Ausgangssituation nach einer Standardinstallation:

Client: Docker Engine - Community
Version: 18.09.1
API version: 1.39
Go version: go1.10.6
Git commit: 4c52b90
Built: Wed Jan 9 19:34:26 2019
OS/Arch: windows/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.1
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 4c52b90
Built: Wed Jan 9 19:41:49 2019
OS/Arch: linux/amd64
Experimental: false

Wir nutzen hier eine Docker Linux Engine (Host bzw. Server - also Linux Container) und einen Docker Windows Client! Wir können den Docker Desktop auch auf die Nutzung von Windows Containern umschalten und umgekehrt (Anm.: ggf. benötigen wir einen Neustart).

 

Back to Linux/Container-Business... ;-)

Docker Registry

Wir wollen unsere eigene Docker Registry betreiben. Hierfür stehen verschiedene technische Umsetzungen zur Verfügung.

Die Registry steht in den Versionen V1 und V2 zur Verfügung. Vor den Bereitstellungen sollte man die entsprechenden Versionen recherchieren (siehe CentOS/RHEL mit V1).

Techniken Registry:

  • V1 - in Python implementiert
  • V2 - in Golang (Go)

Desweiteren starten wir erst einmal mit einer Insecure Registry - also ohne verschlüsselte Transporte.

Übersicht über die Bereitstellungen für Docker Registry:

Registry Image

Ein offizielles Registry-Image lässt sich auf dem Docker Hub finden (https://hub.docker.com/_/registry) und mit docker-compose nachhaltig implementieren.

Für eine bessere Ansprache der eigenen Docker Registry kann man z.B. hub.example.org oder andere FQDNs nach Wahl konfigurieren (DNS bzw. /etc / hosts).
Diese Adresse müssen wir natürlich auflösen lassen - am einfachsten über die /etc / hosts.
Hinweis: Bei der Nutzung Hyper-V Default Switch erhält man FQDNs und Namensauflösungen: hostname.mshome.net.
Aber: keine echtes DNS und Routing!

Empfehlung: für einfache erste Gehversuche kann man die Registry einfach mittels localhost:5000 ansprechen, was dann auch gleich die Voreinträge zu "insecure-registries" (siehe docker info) nutzt. Siehe auch die Ausführungen und ersten Anleitungen auf dem Docker Hub zur Registry.

Imagenutzung 1 - Manuell mit docker

Schnelllösung per docker run ... :

docker run -d -p 5000:5000 --restart always --name registry registry:2

    

Imagenutzung 2 - mit docker-compose

Wir benötigen nur ein Docker Compose Verzeichnis für die docker-compose.yml und schon kann es losgehen.

Docker Compose Ordner anlegen

mkdir ~/docker/registry && cd $_

und in Ordner wechseln.

Datei docker-compose.yml:

registry:
  image: registry:2
  container_name: registry
  restart: always
  ports:
    - 5000:5000
  volumes:
    - /srv/docker/registry:/var/lib/registry

Und los geht es:

docker-compose up -d

Damit jetzt auch der unsichere Zugriff auf die Registry möglich ist, muss Docker über

/etc/docker/daemon.json

entsprechend konfiguriert sein:
Anm.: siehe Ergebnis von

docker info
{
[ggf. Vorherige Einträge - diese Zeile weglassen;-)],
"insecure-registries": [ "hub.example.org:5000" ]
}

Testen der eigenen Registry:

docker pull ubuntu:16.04
docker tag ubuntu:16.04 hub.example.org:5000/ubuntu:16.04
# und jetzt pushen:
docker push hub.example.org:5000/ubuntu:16.04
# löschen der Images:
docker image rm ubuntu:16.04
docker image rm hub.example.org:5000/ubuntu:16.04
# und jetzt das Image aus eigener Registry holen:
docker pull hub.example.org:5000/ubuntu:16.04

Die genutzte Registry (quasi der Weg für das Image) erschließt sich also aus dem Image-Namen!

Analyse des Registry-Containers:

 

CODE EINFÜGEN (TO DO WEGEN SECURITY BLOCKS WEBTECH)

 

Mit der config . yml kann die Registry Konfiguration dann auch angepasst bzw. überschrieben werden.

Links zur Docker Registry:

Registry Distro-Package

Die Umsetzung erfolgt (z.B.) auf einem openSUSE-System mit dem Paket

docker-distribution-registry

Es muss mit systemctl entsprechend gecheckt

systemctl status registry

und gestartet

systemctl start registry

werden.

Auch hier muss wieder eine Konfiguration für insecure-registries nach obigem Beispiel für die Standard-Registry vorgenommen werden.
Über /etc/docker/daemon.json also enntsprechend konfiguriert:

{
[ggf. Vorherige Einträge - diese Zeile weglassen;-)],
"insecure-registries": [ "opensuse.mshome.net:5000" ]
}

Repositories einer Registry anzeigen lassen:

curl http://opensuse.mshome.net:5000/v2/_catalog

Hinweis: Tests erst einmal nur mit den jeweils lokalen Maschinen, sonst benötigt man ja vollständiges DNS und Routing!

Das Löschen von Images in privaten Registries ist extrem unhandlich und umständlich (Literatur: Liebel, Auflage 1, Kap. 6.4.4, S. 418ff).

Docker Hub Account

Anm.: hat auch Vorteile beim Einschätzen von Docker Hub Images

Erinnerung: die Docker Technik hält eine Konfiguration vor, wo sie standardmäßig die Registry erwartet:

docker system info | grep -i registry
Registry: https://index.docker.io/v1/

Das lassen wir auch erst einmal so. Auch um die verschlüsselte Kommunikation mit unseren Registries oder die Nutzung von Registry-Mirrors werden wir uns (ggf.) später kümmern.

Empfehlung: eigenen Account auf https://hub.docker.com/signup erzeugen für Repositories.

Docker Befehle:

docker login | logout

Authentifizierung hinterlegt (!) in

/etc/docker/key.json

 

Eigenes Basisimage

... s.a. Stichwort: Vertrauenswürdige Images

Hiweis: jedes lokale erstellte Image kann immer nur über eine Registry genutzt werden!

Tarball

Wir erstellen/installieren ein Template-System (hier: openSUSE) und erstellen daraus einen Tarball.

tar --numeric-owner --exclude=/proc --exclude=/sys --exclude=/.snapshots -cvf opensuse.tar /

Dieses lässt sich dann auf dem Docker-Host wieder Importieren.

docker import opensuse.tar joebrandes/opensuse:42.3

Image-Erzeugung per Skript

Beispiel (Docker Entwickler): YUM-Based mit Skript online
oder über das Moby-Project: wget https://raw.githubusercontent.com/moby/moby/master/contrib/mkimage-yum.sh

Aufruf:

bash mkimage-yum.sh joebrandes/centos

 

Debian / Ubuntu

Diese Systeme gehen mit einem eigenen Tool zum Extrahieren eines Tarball aus einem System an den Start:

debootstrap

Das Tool kann über das gleichnamige Paket installiert werden.

debootstrap --variant=minbase stretch ./rootfs
tar -C ./rootfs -c . | docker import - joebrandes/debian:9

Anm.: nach Test ca. 165 MB groß!

 

Und jetzt wollen wir noch (kurz) über Orchestrierungen sprechen!
Übersicht: (ohne Anspruch auf Vollständigkeit)

And the winner is ... K8s
Wir schauen uns aber zum Seminarende nur mal kurz das "Original" an ...

Docker (Mini) Swarm

Anm.: Ich habe mich entschieden dieses Kurzkapitel zu Docker Swarm hier zu belassen, obwohl man diese Orchestrierung aktuell (2023) so gut wie nicht mehr einsetzt. Nicht ohne Grund unterstützen auch die Docker Entwicklungen die Kubernetes Orchestrierungen.

An dieser Stelle also nur noch mal zum reinschnuppern: ein 1-Node-Swarm!

Mit

docker stack deploy

einen Cluster mit nur einem Docker-Mitglied nutzen.

Hinweis: Übungen mit

docker-compose

(s.o.) inkl. Volumes vorher aufräumen/löschen!

Docker-Schwarm initieren:

docker swarm init
docker swarm init                                      # Docker Swarm initieren
cd test                                                # hier ist das docker-compose.yml
mkdir /var/dc-test-www                                 # Dir Wordpress HTML erstellen
mkdir /var/dc-test-db                                  # Dir MariaDB Databases erstellen
docker stack deploy -c docker-compose.yml stacktest    # und los geht es...

docker stack rm stacktest                # alles (bis auf Volumes, Dirs) löschen!

Das Beispiel zeigt ganz schön die zusätzliche Abstraktionsebene beim Testen der Docker-Technik.

Testen der WordPress-Installation im Browser (URL):

172.20.0.2:8082

(bwz. 172. ...)

Also: die Portumsetzung quasi eine Netzwerk-Ebene weiter (siehe GW-Netzwerk)! Die richtige IP analysieren Sie über

docker network

Analyse (s.o.), oder auch einfach mit ip a s auf Docker Host.

Achtung: Der Docker läuft weiterhin im Swarm-Modus!

Beenden mit: docker swarm leave --force

Für Docker Swarm dann auch weitere Deploy-Einstellungen (später mehr bei Swarm):

  • deploy.mode
  • deploy.placement.constraint ; Regeln: node.id, node.hostname, node.role

Wenn später mehrere Node (Docker Host Swarm Mitglieder) gejoint werden (docker swarm join ...) müssen weitere Vorbereitungen und Konfigurationen beachtet werden: insbesondere die Nutzung von Zeitservice NTP, damit die Nodes genau gleich "ticken".

 

 

Unterlagen für TN nach/mit Seminar:

  • Dieser Beitrag auf fits.de bzw. pcsystembetreuer.de
  • Docker Infoseite Trainer Joe Brandes docker.joe-brandes.de
  • Screenshots Seminarwoche ("Diashow" zum Seminar)
    Screenshots nach Seminaren Link (siehe Screenshots Tag 05 erst nachträglich)
  • Diverse PDF / Workshops
  • Sicherungen / Backups der TN-VMs durch TN

Letzte TN-Fragen, Feedback-Bögen, TN-Bescheinigungen

 

  • Services in SecondsServices in Seconds
  • portainer.ioportainer.io
  • Docker Desktop für WindowsDocker Desktop für Windows
  • CentOS Image per SkriptCentOS Image per Skript
  • Private RegistryPrivate Registry
  • Orchestrierungen (Video: KodeKloud)Orchestrierungen (Video: KodeKloud)

 

VBox, Hyper-V, ...

Oracle VirtualBox

Anm.: Aktuell nehme ich als Start wohl den Hyper-V und dann muss man bei paralleler Installation mit Hyper-V mit bcdedit operieren (s.u.).

VirtualBox installieren und Grundkonfiguration herstellen -  (nach Neustart) testen/analysieren:

  • NAT-Netzwerk NATNetwork mit (im Idealfall) 
  • eigenen Subnetzen 10.0.X.0 / 24  (z.B.: X = TN-PC#) und
  • funktionstüchtigem DHCP für diesen Bereich/Scope

Vorschlag

  • Ordner E:\virtual-boxes erstellen
  • VBox-Konfiguration für "Voreingestellter VBox-Pfad": E:\virtual-boxes\Machines\...

Geplante Installationen VBox: (ISOs per Freigabe über Trainer-PC vorbereitet)

  • Debian Buster 11.6
    Standard-Install mit LVM und Vorschlag für Partitionen /var, /home, /tmp  
  • CentOS 7.7 (1908)
    Standard-Install "Server"
  • openSUSE Leap 15.4
    Wichtig/Empfehlung: bitte keine BtrFS-Partitionen nutzen!

VM Beispiel: CentOS 7

Installationspraxis mit TN: Erstinstallation einer VM aus dem "Hause Red Hat" - Netzwerk: NatNetwork (s.o.)

Diese VM kann als "Template" für geklonte Maschinen nutzen, die man dann in Sekunden in Betrieb nehmen kann.

Ein paar CentOS 7 Installationen / Konfiguration:

  • SELinux konfigurieren (siehe sestatus): permissive  über /etc/sysconfig/selinux  
  • Firewall Daemon ausschalten: systemctl stop firewalld.service ; systemctl disable firewalld.service 
  • Bereitstellung von EPEL (Extra Packages Enterprise Linux): yum install epel-release ; yum update 
  • Installation Tool jq  (JSON CLI): yum install jq 

Natürlich können später eigenen individuelle Anpassungen vorgenommen werden und im Produktionsumfeld sollten unsere Docker-Hosts natürlich so sicher wie möglich konfiguriert sein!

Secure Shell über NatNetwork

Gewünscht: ssh-Zugriff von Windows auf die NatNetwork-VirtualBox-VMs

Hierfür richten wir  per Port Forwarding einen lokalen Port (hier: 2222) für die NatNetwork-VM (hier: 10.0.17.5 Port 22) ein (siehe Screenshot).

Der entsprechende Zugriff per ssh-Client ist schnell per PowerShell getestet: ssh joeb @ localhost - p 2222 
Anm.: das muss ich gesperrt in der Website kodieren, weil sonst Schutzmechnismen meckern.

ssh-Clients für Windows:

  • ssh (z.B.) in der PowerShell
  • putty (der Klassiker)
  • MobaXterm (Empfehlung; Anm.: inklusive X-Server)

Docker Desktop for Windows

Installation: Spezielles Installationsarchiv für eine Windows-Umgebung mit Hyper-V oder WSL2
Anm.: Für den Download war ein Docker Account nötig!

Tipp: einfach per Chocolatey installieren mit choco install docker-desktop -y !

Die Docker Desktop für Windows Technik kann mit verschiedenen VM-Umgebungen umgehen:

  • WSL2 - Windows Subsystem Linux (Empfehlung - möglichst WSL2 zum Containern nutzen)
  • Hyper-V VM

Für die Docker Desktop for Windows VM werden verschiedenste ISOs (docker-for-win.iso, config.iso, docker.iso) und ein eigenes Hyper-V-Netzwerk DockerNat installiert.

Virtuelle Docker-Linux-VM: klassisch MobyLinuxVM - aktuell als DockerDesktopVM in der der Hyper-V VM-Verwaltung sichtbar.

Hyper-V und VirtualBox parallel

Da die Installation und Nutzung mit Hyper-V das Host-OS Windows bereits als Virtualisierung realisiert ist, muss man bei der parallelen Verwendung  mit anderen Virtualisierern (siehe hier Oracle VirtualBox) etwas beachten.

Wenn Windows mit aktiviertem Hyper-V läuft können diese anderen Virtualisierer nicht mehr - oder aber nur schlecht - funktionieren, da das Windows auf dem sie laufen quasi selber eine virtuelle Instanz darstellt (Stichwort: Hyper-V ist Hypervisor Typ 1). Die Software-Entwickler für VirtualBox oder auch Alternativen haben zwar diesen Umstand bedacht und versuchen damit so gut es geht umzugehen. Aber wir können auch einfach den Hyper-V bei unseren Windows-Starts verbannen und erhalten wieder ein Standard-Windows.

Lösung für Parallelinstallationen: wenn nicht Hyper-V - sondern die anderen Virtualisierer genutzt werden sollen dann mit "administrativer" Konsole (cmd):

bcdedit /set hypervisorlaunchtype Off

stellt Hyper-V aus - benötigt dann Neustart

bcdedit /v

zeigt die Konfiguration unseres Windows (bzw. von Parallelinstallationen)

bcdedit /set hypervisorlaunchtype Auto

stellt Hyper-V wieder an - benötigt wieder Neustart

 

ProxmoxVE Virtualisierung mit VMs und LXC-Containern

....

TO DO

....

Praktische Installation und Inbetriebnahme auf zweitem Trainingssystem.

 

 

Literatur

Literatur - oder auch: der Trend geht zum Zweitbuch ;-)

Die folgenden Docker Bücher liefern die Schwerpunkte zu unserer Seminarpraxis und den Übungen.
Hinweis: Texte und Anmerkungen zu den Büchern von Amazon bzw. Verlagen

Und natürlich liefert auch die Linksammlung viele Quellen für weitere Beschäftigungen.

Skalierbare Container

Oliver Liebel

  • cover-cont-aufl-2-800pxh
  • cover-cont-aufl-2-back-800pxh
  • docker-infra-00
  • docker-infra-01

Skalierbare Container-Infrastrukturen für Ihr Unternehmen

Skalierbare Container-Infrastrukturen: Das Handbuch für Administratoren und DevOps-Teams.
Inkl. Container-Orchestrierung mit Docker, Rocket, Kubernetes, Rancher & Co.

Gebundene Ausgabe: 1071 Seiten
Verlag: Rheinwerk Computing; Auflage: 1 (28. April 2017)
Sprache: Deutsch
ISBN-10: 3836243660
ISBN-13: 978-3836243667
Größe und/oder Gewicht: 18,4 x 6,9 x 25,6 cm

2. Auflage:

Verlag: Rheinwerk Computing; Auflage: 2 (26. Oktober 2018)
Gebundene Ausgabe: 1380 Seiten Sprache: Deutsch ISBN-10: 3836263858 ISBN-13: 978-3836263856

Und ich haue hier auch gleich noch die nächste Auflage raus - nur um zu zeigen, wie schnell das Rad der Technik sich hier dreht.

Aktuelle 3. Auflage:

Verlag: Rheinwerk Computing; Auflage: 2 (2020)
Gebundene Ausgabe: 1260 Seiten Sprache: Deutsch ISBN-13: 978-3-8362-7772-3

[Ankündigungstext Verlag Rheinwerk:] Die nächste Evolutionsstufe der Virtualisierung ist ein Pflichtthema für jedes Unternehmen, dem sich DevOps-Teams und Administratoren stellen müssen: Hochskalierbare und ausfallsichere Microservice-Umgebungen.

Mit diesem Handbuch verstehen Sie die Konzepte hinter den Technologien und können Container-Infrastrukturen auf Basis von Docker in Verbindung mit Swarm Mode, Kubernetes, Rancher, Mesos und DC/OS planen, aufbauen und orchestrieren. So stellen Sie Software schneller bereit und vereinfachen das Deployment und die Wartung Ihrer Infrastruktur – damit Ihre IT-Landschaft auch zukünftig den Anforderungen an Skalierbarkeit und Planungssicherheit gewachsen ist!

Statt einer weiteren Neuauflage mit diesem Schwerpunkt hat der Autor Liebel sich dann 2023 mit dem Thema "Skalierbare KI/ML-Infrastrukturen" beim Rheinwerk Verlag zu Wort gemeldet.

Docker - Praxisbuch

Autoren: Bernd Öggl und Michael Kofler

  • docker-kofler-00
  • docker-kofler-01

Docker: Das Praxisbuch für Entwickler und DevOps-Teams.

Docker: Das Praxisbuch für Entwickler und DevOps-Teams.
Gebundene Ausgabe: 431 Seiten
Verlag: Rheinwerk Computing; Auflage: 1 (24. August 2018)
Sprache: Deutsch
ISBN-10: 3836261766
ISBN-13: 978-3836261760
Größe und/oder Gewicht: 17,2 x 3 x 24,6 cm

Auch hier gibt es bereits eine 2. Auflage von Januar 2020 und eine 3. Auflage aus 2021!

[Ankündigungstext Verlag Rheinwerk:] Software-Container verstehen und produktiv einsetzen

Docker ist aus der modernen Softwareentwicklung nicht mehr wegzudenken. Ob Sie Entwickler oder Administrator sind, ob Sie gerade einsteigen oder bereits produktiv mit Software-Containern arbeiten: Dieses Buch zeigt Ihnen Docker und die Containerwelt.

Dabei lässt es Sie auch bei Troubleshooting und Orchestrierung nicht alleine. Inkl. Best Practices, umfangreichem Werkzeugkasten und vielen Tipps zu Projektmigration, Container-Sicherheit, Kubernetes und mehr.

Linux-Server

Linux-Server: Das umfassende Handbuch
Inkl. Samba, Kerberos, Datenbanken, KVM und Docker, Ansible u.v.m. (Ausgabe 2021) mit einem eigenen Kapitel "Docker Container"

  • linux-server-2018-00
  • linux-server-2018-01

Auflage 5 (23. November 2018) / Auflage 6 (2021)

Gebundene Ausgabe: 1300 Seiten
Verlag: Rheinwerk Computing; Auflage: 6 (2021)
Sprache: Deutsch
ISBN-13: 978-3-8362-8088-4

[Ankündigungstext Verlag Rheinwerk:] Wie Sie Linux-Server effizient nach den aktuellen Standards administrieren, vermittelt Ihnen dieses Buch. Von Hochverfügbarkeit über Sicherheit bis hin zu Scripting und Virtualisierung: Sie lernen Linux-Server distributionsunabhängig intensiv kennen.

Das Buch bietet Ihnen über benötigtes Hintergrundwissen hinaus zahlreiche Praxisbeispiele zu den häufigsten in Unternehmen eingesetzten Distributionen. Und dank Shell-Programmierung, Python, Ansible sowie den im Buch vorgestellten Tools und Automatisierungsskripten lassen Sie Ihre Rechner für sich arbeiten!

 

 

Vielen Dank für Ihre Super Rückmeldungen zum Seminar.
Viel Spaß und Erfolg beim "Containern" wünscht Ihnen
Ihr Trainer Joe Brandes

  Privates

... zu Joe Brandes

Sie finden auf dieser Seite - als auch auf meiner privaten Visitenkarte joe-brandes.de einige Hintergrundinformationen zu mir und meinem Background.
Natürlich stellt die IT einen Schwerpunkt in meinem Leben dar - aber eben nicht nur ...

joe brandes 600px

Private Visitenkarte / Technik: HTML & CSS /
  joe-brandes.de

  Jobs

... IT-Trainer & Dozent

Ich erarbeite und konzipiere seit über 25 Jahren IT-Seminare und -Konzepte. Hierfür stehen der "PC-Systembetreuer / FITSN" und der "CMS Online Designer / CMSOD". Ich stehe Ihnen gerne als Ansprechpartner für Ihre Fragen rund um diese und andere IT-Themen zur Verfügung!

becss 600px

BECSS Visitenkarte / Technik: HTML & CSS /
  becss.de

  Hobby

... Snooker & more

Wer einmal zum Snookerqueue gegriffen hat, der wird es wohl nicht wieder weglegen. Und ich spiele auch immer wieder gerne eine Partie Billard mit den Kumpels und Vereinskameraden. Der Verein freut sich über jeden, der einmal in unserem schicken Vereinsheim vorbeischauen möchte.

bsb 2011 600px

Billard Sport BS / Joomla 3.x /
  billard-bs.de

PC Systembetreuer ist J. Brandes - IT seit über 35 Jahren - Technik: Joomla 3.4+, Bootstrap 3.3.4 und "Knowledge"

© 2024 - Websitedesign und Layout seit 07/2015 - Impressum - Datenschutzerklärung
Nach oben