Für IT-Mitarbeiter von SZDS findet ab 03. Juni 2024 eine 5-Tage-Veranstaltung 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 mit Docker - bzw. den Container-Alternativen - und wird auch die technischen, theoretischen und sicherheitsrelevanten Themen für Applikationscontainer nicht vernachlässigen.
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: Heydenstraße 2, Braunschweig, Raum 2.11
Zeiten: Mo. 03.06 bis Fr. 07.06.2024 - jeweils 08.30 - 16.00 Uhr (bzw. nach Absprache)Digitale Seminarunterlagen: (siehe aber auch dieser Seminarbeitrag)
Extra Website Container mit aktuellen Ausarbeitungen rund um das Thema "Container mit Docker und Co"Trainer OneDrive: (für Unterlagen nach Seminar)
Freigabe für Trainingsunterlagen - hier: Screenshots zu Seminartage (als ZIPs)
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
Topics:
- Seminarintro
- Themen nach Vorabsprache
- Roter Faden
- Extrasite Docker
- Beitrag Vorseminar
- Beispielhafte Ankündigung
Seminarintro
Zum Seminarstart klären wir
- Orientierungsphase
- Pausenzeiten
- Seminarablauf - Technikumgebung Seminarraum
- TN-Themen
Bitte auch einfach im Seminar bei beliebigen Nachfragen oder Anregungen direkt auf mich zukommen.
Themenüberblick
Im Vorfeld des Seminars gab es eine lockere Seminarthemensammlung. Somit ergibt sich folgende Topic- und Themenliste:
- Container: Docker, Alternativen, Technik, Sicherheit, Workflows
- Docker Versionen: Engine, CE/EE, Docker Desktop
- Basis Images: Standard Linux Distros, Alpine Linux
- Docker Builds: Dockerfile - eigene Images
- Docker Tools: Portainer, Distrobox
- Docker Networking: Driver, DNS und Routing
- Datenpersistenz: Docker Volumes / Bind Mounts
- Docker compose: docker-compose.yml, Dockge
- Programmiersprachen / Entwicklungsumgebungen
- Private Registry für eigene Workflows, Privacy und Schutz der Entwicklungen
- Continuous Integration und Continuous Delivery/ Images für die CI/CD-Pipeline
- Orchestrierung mit Kubernetes (K8s)
- Themen von Trainee aus Orientierungsphase
Eine Abstimmung von Themen wird natürlich auch im Seminar berücksichtigt.
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
Und im Zuge dieser Herangehensweise kann es auch schon mal zu einer Wiederholung von Begriffen und Zusammenhängen kommen - [kr]eine Absicht ;-)
Extrasite Containerseminare Joe Brandes
Für die stets mit Infos aktualisierte Ausarbeitung zum Thema erstelle ich eine Extra-Website.
Anm.: Diese Ausarbeitungen werden mit Hilfe von RestructuredText und Sphinx erstellt und sind auch für andere Themengebiete verfügbar.
Portal: container.joe-brandes.de mit
- HTML-Versionen (HTML & SingleHTML)
- EPUB oder
Wenn eine Version mal nicht verfügbar ist, dann bitte einfach melden.
Beitrag Vorseminar 2023
Anfang Januar 2024 habe ich verschiedene Beiträge und Veröffentlichungen umgestellt. Im Rahmen dieses Seminars bedeutet das, dass ich die Inhalte lieber nach Topics statt nach zeitlichem Durchlauf im Seminar veröffentlichen möchte.
Für die Umstellung werde ich hier folgend die alte Darstellung verlinken und beibehalten. Der Beitrag entspricht ja auch immer noch ungefähr dem Seminarverlauf.
Allerdings werde ich in den alten Ausarbeitungen keine Aktualisierungen mehr vornehmen, damit ich nicht mehrere Beitragscodes/Inhalte anpassen muss.
Link zum Vorseminar Container mit Docker und Co
Ausarbeitungen 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 zum Seminar:
Technische Umsetzung mit Containern und Virtualisierungen sind die aktuellen 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, Amazon Web Services (AWS) oder den den Google Cloud Services (GCS).
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 Raspberry Pi oder Alternativen
- 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.
Auch solche Ausschreibungen und Ankündigungstexte unterliegen Änderungen/Anpassungen.
🔩Tech
Topics:
- Allgemeines
- Technik / Installationen / Windows
- PowerShell 101
- Paketmanager Software
- Fachbegriffe / Technik
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 (bis auf weiteres) Linux-Container.
Diese Ausarbeitung kann leider nicht alle nötigen Codes für unsere Umsetzungen sauber aufbereiten. Warum? Meine CMS-Umsetzungen (hier: Joomla) werden von mir mit so wenig Erweiterungen (Extensions) wie möglich eingesetzt. Für die geschützte Implementierung von Codezeilen in diesem Technikbereich müsste ich aber sehr aufwendig den Linux Shell Code (mit den realen OS Anweisungen!) vor dem CMS extra absichern und für die Ausgabe im Browser aufbereiten.
Stattdessen bekommen die Trainess die Quellcode für die Übungen über entsprechende Git Repositorys oder auch die Extra Docker Site! Manchmal finden sich auch Anmerkungen im Beitrag um hieran zu erinnern.
Beispiel: Code in Extra-Unterlagen Trainer J. Brandes
Technik / Installationen
Teilnehmer-PCs mit Intel-Systemen 12th Generation (Core-i5 12400 - 6 Core - 12 Threads):
- 500 GBWechsel-SSDs: System-Installationen Windows 11 + ggf. 240/120 GB (Data und/oder Zweit-Install)
Tipp für eigene Heimlabore/Tests: SSD für erste Installation auf 150 GB partitionieren/verkleinern - Rest freilassen für Parallelinstallation: Linux als Zweit-OS - 32 GB RAM
Beachten: Host-System (ca. 3 GB) und genug für alle weiteren Systeme! - Paketmanager für Softwareinstallationen mit Winget oder 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.
Grundinstallation: Windows 11 Education (23H2)
Anm.: saubere Grundinstallation mittels USB-Ventoy-Sticks zu Beginn des Seminars oder bereitgestellt durch Trainer pre-Seminar!
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 Windows-OS-Umgebung erhalten. Des Weiteren werden uns bei der Installation auch docker compose und eine einfache Kubernetes Installation bereitgestellt.
Umsetzung für den Docker Seminar Einstieg: Docker Desktop für Windows / WSL2 (ist so auch in Windows Home möglich!)
Die Umsetzung Docker Desktop für Windows: kann mit unterschiedlichen Linux-Umgebungen zum Einsatz kommen
- WSL2 - Windows Subsystem for Linux Version 2; wir nutzen Debian als WSL2 Distro - bitte vor allen weiteren Docker Installationen funktionsfähig bereitstellen!
Installation:wsl --install -d Debian
Anm.: die Nutzung von WSL2 funktioniert - im Gegensatz zum Hyper-V - auch mit Windows Home Editions! - Alternative: Docker Desktop für Windows mit einer VM (verlangt Hyper-V s. a. o.)
wie gesagt: besser heute immer zur WSL2 Lösung greifen
Weitere Alternativen:
- Einsatz des Windows Pro/Education eigenen Hyper-V für
Linux (oder auch Windows) Gastsysteme für Docker Tests - VirtualBox (von Oracle - was solls ;-) - war gut - ist gut) - Alternative Bereitstellung einer virtuellen VM für Docker-Umsetzungen auf Linux-VMs
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 mittelsbcdedit
beachten. Entsprechende technische Vorgehensweisen werden in einem Extra-Abschnitt beschrieben - Parallelinstallation eines Linux OS (Empfehlung: ebenfalls Debian)
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) also z.B. etwas Platz lassen und dort eine Parallelinstallation mit einer gewünschten Linux Distribution vornehmen! - 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.
Wir werden versuchen die Bandbreite an Lösungen im Seminar abzudecken.
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 sehr ordentlichen Start-Profile zur Verfügung.
Die Anleitungen werden im Seminar entsprechend kommentiert und erläutert.
Hier die Kurzanleitungen:
Wir benötigen die Software Git - z.B.
winget install --id Git.Git
- oder
choco install git
Danach stellen wir uns eine PowerShell Profilumgebung bereit:
- 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-Ordner: ,\jb_fonts )
Die Kommandozeile lässt sich mit der vorinstallierten ohmyposh oder mit einer Starship Variante nutzen. Die Software Starship müsste noch installiert werden.
- 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 in Ordner ~/.config
Alle weiteren manuell bereitgestelleten Konsolentools der Woche müssten einfach nur in in Profilordner ~/Documents/WindowsPowerShell/_jbtools
kopiert werden!
Docker Code Syntaxvervollständigung für die PowerShell
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 auskommentieren) Import-Module DockerCompletion
Infos mittels Github Repo für das Modul DockerCompletion: https://github.com/matt9ucci/DockerCompletion
Software für Seminar
Das ist einfach mal eine Auswahl und eine möglichst effiziente Bereitstellung mittels Paketmanagment unter Windows mit Winget oder Chocolatey-
- 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)
Wir bekommen auch Extensions für Docker / Docker Compose und Co. - 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 oder ist schon bei vorinstallierten Systemen parat. Bei häufigeren Einrichtungen von Entwicklungsumgebungen möchte man das natürlich gerne noch effizienter gestalten.
Das führt uns wieder zum Paketmanagement mit
- Winget
- Chocolatey
- Scoop
unter Windows. Im folgenden erläutere ich kurz die beiden erstgenannten Paketmanager für die es jeweils gute Gründe Pro und Contra gibt.
📦 Winget
Paketmanager Microsoft Winget
Microsoft stellt mit winget ein Basistool für paketorientierte Softwareverwaltung bereit. Als Techniker auf System mag ich on-Board Technik. Ich versuche also ohne extra Softwareinstallationen auszukommen.
Auf aktuellen Windows 11 (oder auch Windows 10 Systemen) sollte winget funktionsfähig bereit sein. Ansonsten gerne mal Store aktualisieren oder ggf. Internet Recherche.
Schnellanleitung für Paketinstallationen mit winget Paketmanagement:
# ====================================================================== # Winget CLI nutzen/testen # ====================================================================== winget list
winget search docker
winget show --id Git.Git # ======================================================================
winget install --id Docker.DockerDesktop
winget install --id Mozilla.Firefox winget install --id eloston.ungoogled-chromium winget install --id ONLYOFFICE.DesktopEditors winget install --id Notepad++.Notepad++ winget install --id Microsoft.VisualStudioCode winget install --id Git.Git winget install --id 7zip.7zip winget install --id Microsoft.PowerToys winget install --id Microsoft.PowerShell # winget install --id IDRIX.VeraCrypt (bitte in Admin-Console in Admin-Account) winget install --id KeePassXCTeam.KeePassXC winget install --id FastStone.Viewer winget install --id VideoLAN.VLC
Anm.: man sollte auf einem System immer nur einen Paketmanager nutzen.
📦 Chocolatey
Paketmanager Chocolatey.org
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
Topics:
- Docker Inc. - der Standard
- Docker Desktop für Windows
- Fachbegriffe
- Technik
Docker bzw. Firma Docker Inc.
Für die Bereitstellung von Containern gibt es diverse Alternativen (siehe podman.io - Red Hat). Ich zitiere an dieser Stelle einfach aus dem aktuellen Docker Praxisbuch von Bernd Öggl und Michael Kofler (Rheinwerk Verlag):
Langer Rede kurzer Sinn: Wir behandeln in diesem Buch sowohl Docker als auch
Podman. Dennoch gilt für uns Docker als der »Goldstandard«.Praxisbuch Docker (2024) - Bernd Öggl und Michael Kofler (Rheinwerk Verlag)
Docker Software gibt es für nahezu alle Betriebssysteme. Und in unseren Seminaren wollen wir die OS-Implementierungen versuchen in Gänze zu erfassen.
Zur Erinnerung: Docker ist heimisch auf Linux-Plattformen! Die Fa. Docker.Inc bietet an:
- Verschiedene (pure) Docker Engines - klassisch: docker-ce (Community) oder docker-ee (Enterprise)
im Seminar werden wir diese bzw. die in den Distros (siehe docker.io Packages bei Debian/Ubuntu) bereitgestellte Version einsetzen - Verschieden Docker Desktops für Windows, Mac und auch Linux
- Tools: Docker Compose, Build-Tools, Extensions
- Docker Hub - zentrale Bereitstellung und Austausch von Images
- Docker Scout - Image Analyse und Einschätzung von Security Risks
Geplante Docker Technikumsetzungen:
- Docker Desktop for Windows
Tipp: Software-Installationen mittels Winget Toolwinget
- wird im Seminar gezeigt!
Oder Installation / Setup über Download auf https://docs.docker.com/docker-for-windows/install/
Anm.: Scrollen bis "Install Docker Desktop for Windows desktop app" und dort Link zur Installer-exe mit ca. 500 MB Download - Debian 12 Bookworm (das eigentliche Community Standard-OS für Services im Internet)
Hier: eigene versionierte Paket docker.io aus Debian-Repos (wie auch für Ubuntu)
Installation auf virtuellen Maschinen oder als Parallelinstallationen.
Alternative: Install-Anleitung auf docs.docker.com: https://docs.docker.com/install/linux/docker-ce/debian/
Keine praktischen Umsetzung mehr:
- CentOS 7, 8, 8 Stream, 9 Stream (Vertreter Red Hat OS)
Anm.: nach Company Red Hat Anpassungen der Lebenszyklen fragliche Unterstützung - ich setze CentOS nicht mehr ein...
Aktuell: EOL CentOS 7 am 30. Juni 2024 - das war es dann mit LTS-Philosophie - siehe Link zu Red Hat CentOS Stream continious Delivery ;-) - openSUSE (Vertreter Novell SLES) - SUSE trennt sich aus professionellen Erwägungen von Standards und geht über auf immutable Systems (ALP)
Anm.: Build-Service Virtualization/Container https://software.opensuse.org/package/docker (Versuchspaket: Virtualization:containers)
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 Linux-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!
Docker Desktop for Windows
Installation: Spezielles Installationsarchiv der Docker Entwicklerteams für eine Windows-Umgebung mit
- Kombination mit WSL2 von Windows 10/11
- Hyper-V-Rolle
Anm.: Für den Download war früher ein Docker Account nötig!
Die Software Docker Desktop ist nur für Privat, Education und kleinere Firmen kostenlos einsetzbar!
Installation/Erinnerung:
- einfach
choco install docker-desktop
- oder auch
winget install docker.docker-desktop
. (in 2024ff mal bitte winget versuchen) - Standard-User von Windows müssen Mitglied der Lokalen Gruppe docker-users sein!
Also die Lokale Benutzer- und Gruppenverwaltung (lusrmgr.msc) oder einfach
net localgroup docker-users <user> /add
Die Docker-Desktop-Installation ist über ein Managment-Symbol in der Systemleiste/Taskleiste verwaltbar. Die Konfiguration der Docker-Umgebung kann angepasst werden (z.B. Anzahl CPU Kerne).
Vorteil der Desktop Installationen von Docker (s.a. unter Linux oder Mac): wir haben gleich einige andere Docker-Tools (siehe docker-compose, Kubernetes, ...) mit an Bord!
Die Docker Aufrufe sollte man mittels PowerShell durchführen. Ein Aufruf von
docker version
zeigt dann die genaue Ausgangssituation nach einer Standardinstallation:
Client: Cloud integration: v1.0.35+desktop.10 Version: 25.0.2 API version: 1.44 Go version: go1.21.6 Git commit: 29cf629 Built: Thu Feb 1 00:24:09 2024 OS/Arch: windows/amd64 Context: default Server: Docker Desktop 4.27.1 (136059) Engine: Version: 25.0.2 API version: 1.44 (minimum version 1.24) Go version: go1.21.6 Git commit: fce6e0c Built: Thu Feb 1 00:23:17 2024 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.28 GitCommit: ae07eda36dd25f8a1b98dfbf587313b99c0190bb runc: Version: 1.1.12 GitCommit: v1.1.12-0-g51d5e94 docker-init: Version: 0.19.0 GitCommit: de40ad0
Wir nutzen hier eine Docker Linux WSL2 Engine (Host bzw. Server - also Linux Container) und einen Docker Windows Client!
Wir könn(t)en den Docker Desktop auch auf die Nutzung von Windows Containern umschalten und umgekehrt (Anm.: ggf. benötigen wir einen Neustart).
Container 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-Skriptooldocker-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 Beitrag: 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)
- ...
🐋 Docker101
Topics:
- Erste Befehle
- Erstes Image / Erster Container
- Hilfe in Docker
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
Tags aus Registry für Images auflisten
Wenn wir uns für die Tags eines Image interessieren können wir bei der Nutzung des Docker Hub einfach die Weboberfläche hub.docker.com nutzen.
Hier besteht allerdings auch das Problem, wenn wir uns für die Tags interessieren. Im Grunde benötigen wir einen Webrequest und müssen dann auch noch das unhandlichen JSON Ergebnis clever händeln. Das folgende Skript zeigt die Ausgabe aller Tags für das Offizielle Image Ubuntu. Die Schleife wird für die "Quasi Seiten" benötigt, die durch den Webrequest erzeugt werden.
Tipp aus https://www.googlinux.com/how-to-list-all-tags-of-a-docker-image/
i=0 while [ $? == 0 ] do i=$((i+1)) curl https://registry.hub.docker.com/v2/repositories/library/ubuntu/tags/?page=$i 2>/dev/null | jq '."results"[]["name"]' done
Bei nicht offiziellen Images muss man die Bezeichnung Library durch den Hersteller des Images ersetzen: aus library/ubuntu wir portainer/portainer-ce.
Und das Tool curl ist natürlich wieder einmal nicht eins-zu-eins in der Windows Umgebung / PowerShell nutzbar!
Basis-Image ubuntu:22.04
Jetzt mal ein echtes Image in Form eines offiziellen Ubuntu-Basis-Image aus der Docker Registry (aus dem Docker Hub) mit dem Tag 22.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:22.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 (bei Linux mit Paket docker-bash-completion
volle Unterstützung)!
Erinnerung: also bitte immer fleißig tab-ben und das Modul Docker-Completion nutzen (oder Alternativen).
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
oder docker help
oder docker --help
(Empfehlung: letztere Variante)
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.
📦 Image+Cont
Topics:
- Zusammenspiel: Images und Container
- Beispiel: offizielles Image MariaDB
- Beispiel: Portainer mit Dockermanagement Dashboard
- Eigene Basisimage erstellen
Zusammenspiel: 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 und Unterlage im Seminar
Der Container in einem Schritt: (Achtung: jedes weitere docker run ...
erzeugt immer wieder neue Container!)
docker run -it --name ubu1 ubuntu:18.10
Die Umsetzungen, die in docker run
implementiert sind der Reihe nach im Einzelnen:
- docker pull ubuntu:18.10
Image ubuntu:18.10 aus Registry holen, wenn noch nicht lokal verfügbar! - docker create -i -t --name ubu1 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, Schalter nach Creation Container (oft) nicht mehr notwendig.
Das Attachen an Container kann man auch nutzen, wenn man einen Container mal einfach ohne die Schalter gestartet (siehe: start oder run) hat.
- docker attach ubu2
Zugriff auf Container-Terminal von ubu2
Und für die äußerliche Nutzung von Containern hilft immer der Subbefehl exec.
Achtung: bei vielen 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: (folgender Befehl gesperrt geschrieben - mit Lücken! - wegen CMS Security Technik)
docker e x e c ubu2 c a t / etc / os-release
Tipp zum Verlassen des Containers: Terminal mit Tastenkombination 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 werden gleich wieder beendet - siehe: hello-world!
Für die Recherche von Parameter und vor Allem den Umgebungsvariablen (ENV) des Image bitte immer eine Recherche für das Image durchführen:
https://hub.docker.com/_/mariadb (Offizielles MariaDB Image auf Docker Hub)
Beachten: Herstellerabschnitt der URL ist hier ein Unterstrich _ ! Es handelt sich also um ein Offizielle Image! Die Entwicklergemeinschaft für MariaDB hat auch noch eine weiterführende KB (Knowledge Base) Seite mit ausführlichen Erläuterungen zu den Konfigurationsmöglichkeiten und Beeinflussungen für das Image MariaDB. Insbesondere führt die Darstellung der Environment Variables aus, dass es abwärtskompatible Bezeichnungen gibt: (Beispiel) MYSQL_ROOT_PASSWORD oder MARIADB_ROOT_PASSWORD.
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 # führt in aktuellen MariaDB Images zu Fehler wegen mysql CLI Link missing
docker e x e c -it mariadb-test1 mariadb -u root -p # das Standard-CLI Tool von MariaDB direkt nennen /usr/bin/mariadb
# Den Container analysieren:
docker e x e c -it mariadb-test1 /bin / bash
cat /etc / os-release
p s ax
mariadb --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 bzw. dem Publishen (Veröffentlichen) des DB-Ports an die Host-Maschine:
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 (aus Containern) dient (siehe Kurzübersicht) der Befehl 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).
Beispiel: Portainer - Image für Dockermanagement / Dashboard
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!
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.
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 werden da immer wieder mal hinschauen! Aber: bitte nicht die CLI-Nutzung vernachlässigen!
Eigenes Basisimage
Stichwort: Vertrauenswürdige Images oder auch die Fragestellung: Wo bekommen wir die Images her, mit denen wir unsere Container beginnen?
Hiweis: jedes lokale erstellte Image kann später immer nur über eine Registry genutzt werden! Aus diesem Grund folgen entsprechende Übungen meist erst nach der Beschäftigung und Nutzung von eigenen Registries.
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: debootstrap
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ß!
🐋 Dockerfile
Topics:
- Dockerfile - Einführung
- Dockerfile - die Datei
- Dockerfile - Beispiele
Images für Webserver und mit Installationen
Dockerfile - Einführung
Bis jetzt haben wir fertige Images (siehe hub.docker.com) genutzt und mit diesen Images die Container erstellt.
Die meisten Images wären auch ordentliche Vorlagen, aber z.B. würde man gerne das Paket iproute2 (für CLI ip address show, ...) nachinstallieren, … usw.
Also wollen wir jetzt unsere eigenen Images erstellen und bedienen uns eines Dockerfile, das die nötigen Anweisungen enthält!
Kurzanleitung
- Arbeits-Ordner für Image-Bauprozess erstellen
- ggf. Dateien/Unterordner im Arbeits-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 mitdocker run
oderdocker create
und danndocker 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 (sehr wichtig im Firmenumfeld)
Links:
Im Folgenden jetzt weitere Infos zu docker-Builds (Dockerfile) und mehr zu den Anweisungen und technischen Umsetzungen.
Dockerfile - die Datei
Das Dockerfile hat eine eigene Syntax und eigene Konventionen.
Schlüsselworte für ein Dockerfile (Directives) als Tabelle:
Schlüsselwort | Bedeutung |
---|---|
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 - sonst nehmen wir ADD.
Dasselbe Dilemma findet sich bei den Erklärungen für CMD und ENTRYPOINT.
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 Beispiele orientieren sich am Buch "Docker - Das Praxisbuch für Entwickler und DevOps-Teams von Bernd Öggl, Michael Kofler" aus dem Rheinwerk-Verlag. Die beiden Autoren haben über die Jahre diverse Auflagen dieses Fachbuchs herausgebracht! In 2024 sind sie bei der mittlerweile 4. Auflage angelangt und diese Version gibt es auch englischsprachig!
Alle Beispiele werden ausführlich mit den gelernten Docker-Techniken containerisiert und getestet. Die Beispiele finden sich auch in den digitalen Trainerunterlagen (Git Repo) für die Trainees.
Dockerfile - Beispiel 01 - PHP 8.2 + Apache + Debian - Quick...
Einfaches Images mit PHP 8 und Apache2 Webserver basierend auf Basisimage mit dieser Kombination:
FROM php:8.2-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. Man sollte wieder eine Recherche zum Image auf dem Docker Hub durchführen.
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
.
Dockerfile - Beispiel 02 - Ubuntu 22.04 mit Package iproute2
Mit Basisimage Ubuntu (Tag: 22.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:22.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 iproute2 && \
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.
Dockerfile - Beispiel 03 - Ubuntu mit Apache2 inkl. https
Wieder wird das Basisimage ubuntu:18.04 genutzt: Webserver Apache2 mit http/https-Unterstützung und einer kleinen (von mir vorbereiteten) Beispiel-Website.
FROM ubuntu:22.04
LABEL maintainer "Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. ";
LABEL description "Test mit Dockerfile"
# 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"]
Jetzt das Building mit bekanntem Aufruf: (Erinnerung - bitte an den Punkt am Ende denken ;-) docker build -t joebseminar/mywebserver:1.0 .
Dann kann man das Image nun geschickt für die äußere Netzanbindung über Ports mappen:docker run --hostname webserver --name mywebserver \
-p 8080:80 -p 8443:443 \
joebseminar/mywebserver:1.0
Jetzt lässt sich die Beispielseite über einen Browser erreichen.
In meinen Trainingsunterlagen findet sich auch noch ein Beispiel mit einem schlanken Alpine Webserver. Hierfür sollten wir uns aber erst einmal diese spezielle Linux Distro näher anschauen.
⚙️ Alpine
Topics:
- Distribution Alpine Linux
- Shell / BusyBox
- Paketverwaltung apk
- Alpine mit Webserver Apache2
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 / Busybox
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:
Kommando | Funktion |
---|---|
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
Dockerfile - Beispiel 04 - 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.
🗃️ Volume+Netz
Topics:
- Hintergrund zu Volumes und Networking
- Volumes und Mounts
- Docker Netzwerke
- Übung: 3 Container mit Netz und Mounts (WordPress)
Hintergrund zu Volumes und Networking
Docker Container - oder mal wieder allgemein gesprochen Container - fungieren in einem abgesonderten Raum für ihre OS-Umgebung. Das ist jetzt mal sehr umgangssprachlich ausgedrückt.
Alle Vorgehensweise mit Containern haben das praktisch bestätigt. Um was genau geht es?
- Container Daten:
Ohne Mehraufwand und Konfigurationen sind die Daten unserer Dienste im Container! Das bedeutet bei einer Interpretation von Containern als Wegwerftechnik aber auch, dass wir bei einem wiedererzeugten Container aus einem Image unsere Daten verlieren würden! - Container vernetzen:
Wenn wir mit einem einzelnen Container kommunizieren wollen, dann lösen wir das über Portweiterleitungen - kein Problem! Wie allerdings können Container untereinander kommunizieren?
Im Folgenden soll es um die Lösungen zu diesen Problemstellungen gehen.
Volumes und Mounts
Die Grundidee ist immer gleich: die Daten unserer Container - z.B. Webverzeichnis eines Webservers - müssen außerhalb vom Container gespeichert sein! Diese Ides bezeichnet man als Volumes. Volumes lassen sich unter Docker als Mounts oder Docker Volumes nutzen und können unterschiedlich erstellt und gebunden sein.
Eine Übersicht in Kürze:
Bind Mounts (Link docs.docker.com - Storage - Bind Mounts)
Die Daten liegen außerhalb des Container in der Verzeichnisstruktur des Docker Hosts - z.B.
-v /var/dc-test-www:/var/www/html
Der Parameter -v
kündigt die Zuweisung an. Links vom :
ist das lokale Verzeichnis /var/dc-test-www
und rechts der Standardordner /var/www/html
des Containerservice (hier Webserver Apache2) zu finden.
Docker Volumes (Link docs.docker.com - Storage - Volumes)
Wie der Name schon andeutet kümmert sich hier die Docker Technik um die Verwaltung der gewünschten Datenspeicher. Die Konfiguration und Verdrahtung der Volumes kennt unterschiedliche Herangehensweisen.
- Mit dem Docker Befehl
docker volume create ...
werden Docker Volumes manuell erzeugt und dann über den Schalter -v den Docker Containern mitgeteilt. - Mit der Dockerfile Direktive Volume kann man nur Volumes innerhalb des Containers erzeugen!
Link docs.docker.com Reference Builder Volume
Beimcreate
oderrun
für den Container kann man dann aber Mount-Points mit Parameter--mount
spezifizieren.
Link docs.docker.com - Reference run - Volume mounts and Bind mounts - Mit der Docker Compose Direktive
volumes:
in derdocker-compose.yml
werden echte Docker Volumes erzeugt und (persistent) nutzbar gemacht.
Nur echte Docker Volumes lassen sich mit docker volume ls
auflisten - die Mounts sind hier nicht aufgelistet!
Die Volumes lassen sich wieder mit docker volume inspect ...
analysieren.
Wenn man mit docker-compose Container genutzt hat und dann beim docker-compose down
noch den Schalter -v
anhängt werden automatisch alle Volumes der docker-compose.yml gelöscht.
Die Analyse von Docker Volumes bei Nutzung von Docker Desktop für Windows ist nach ganz so einfach, da die Verdrahtung der Docker Volumes im Windows WSL2 Subsystem manchmal mehr Analyse verlangt um die Ordnerstruktur für die Volumes zu finden.
Beispiel eines Standard Docker Volume für eine Portainer Datenstruktur unter Linux:
(Volume: portainer_data)
/var/lib/docker/volumes/portainer_data/_data/
Dasselbe Portainer Volume portainer_data auf einem Docker Desktop für Windows Volume: \\wsl.localhost\docker-desktop-data\data\docker\volumes\portainer_data\_data
Trick für Docker Desktop für Windows mit WSL2:
Einhängen (hier Debian WSL2 Machine) mit einem Docker Container basierend auf Debian Image:docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -i sh
(nsenter ruft Shell sh in anderem Namensraum auf)
Jetzt lässt sich eine Volume Technik direkt mit dem Standardpfad /val/lib/docker/volumes/... aufrufen!
Docker Networking
Jeder Container verfügt standardmäßig über Netzwerkfähigkeit. So verbinden wir uns ja über Portweiterleitung funktionstüchtig mit Containerdiensten. Die Docker Technik manipuliert die OS-spezifische Netzwerktechnik mit Paketfilter und Firewall Techniken (Linux/Unix: iptables).
Wie immer bietet die Docker Dokumentation einen sehr guten Einstieg und Übersicht in die Docker Netzwerktechnik.
Für die Vernetzung von Containern nutzen wir später auch automatisierte Container Deployments - wie z.B. Docker Compose. Für den Einstieg allerdings wollen wir uns die bereitstellbaren Netzwerktechniken in Docker manuell erarbeiten und nutzen.
Eine erste Übersicht über die verfügbaren Docker Netzwerke erhalten wir mit docker network ls
.
❯ docker network ls NETWORK ID NAME DRIVER SCOPE 2be710ddb5b4 bridge bridge local 8c5ab405882d host host local 8eb9e8218f21 none null local
Der Netzwerk Driver bridge stellt das Standardnetzwerk für Container dar. Der host Driver entfernt die Trennung (Isolation) zwischen Container und Docker Host. Die Netzwerke lassen sich wie immer mit docker netwok inspect ...
analysieren.
Tipp: Für die vertiefenden Ananlysen und Verständnisse rund um Docker Networking sollte man sich komplett in der Linux Docker Host Umgebung orientieren. Unter Windows mit dem Docker Desktop für Windows ist eben alles immer ein wenig Anders.
Übung: WordPress - drei Container mit Netzwerk und Bind Mounts
Wir komplettieren die Container-Techniken und verdrahten unsere Container
- Erstellung eines gemeinsamen Netzwerks - docker network create ...
- Nutzung von Bind Mounts - Ordnerbindungen zwischen Container und (lokalem) Dockerhost
HINWEIS: die u. a. lokalen Ordnerpfade legen nahe, dass die Übung in dieser Form (Mount-Binds) auf Linux Docker Host Umgebung stattfinden sollte!
Wir erstellen uns ein neues Docker Netzwerk: (Anm.: wenn nicht angegeben --driver bridge )
docker network create test-net
Übersicht über die Docker Netzwerke:
docker network ls
Inspektion (Eigenschaften) unseres neuen Netzwerks: (Hier: Subnet 172.18.0.0 / 16 )
docker network inspect test-net | jq
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)
Und schon kann es mit der Produktion der Container losgehen...
Tipp: ich würde erst einmal mit den ersten beiden Containern für WP und 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.
🐋 Compose
Topics:
- Docker Compose - Einführung
- Docker Compose - Technik und Kommandos
- Datei docker-compose.yml
mit Beispielen
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)
Docker Compose - Technik
Anm.: bei Docker Desktop für Windows/Linux ist docker compose bereits verfügbar. Auch bei Standardinstallationen unter Linux (pure Docker Engine wird die Docker Compose Technik heute gleich bereitgestellt!
Technischer Hintergrund:
In Docker-Technik kann man die docker compose
Techniken auch mit docker stack deploy Techniken - also: Swarm Services - vergleichen/ausführen und man arbeitet quasi mit einem Minimal-Swarm von einer Docker-Instanz! Das kann man auch in den entsprechenden (Portainer) Dashboards beobachten/betrachten.
In 2019/2020 hat Docker verkündet zukünftig die eigene Swarm-Technik mit Kubernetes (K8s) zu ersetzen.
Anmerkungen:
- Das alte
docker-compose
Python-Skript kann Problemchen bereiten (Python!) - docker compose - als Docker Subbefehl compose - wird direkt seit Jahren mit Docker Technik ausgeliefert.
- Wir beschränken uns - an dieser Stelle - auf
docker compose
(also: Komponieren)
und behalten uns die Swarm-/K8s-Techniken (also: Orchestrierungen) für später auf.
Online / Links:
- Docker Compose: Entwicklung / Versionen / Evolution
- Webportal zu docker compose: Docker Compose
- Releases / Downloads GitHub: docker-compose Releases
- Installationen / Bereitstellungen: Docker Portal: docker compose install
Obsolet / Alt / Manuelle Bereitstellung docker-compose Script:
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
Kommandos:
docker-compose
<commands> bzw. docker compose
<commands>
- config (Analyse)
- up -d | down (up normalerweise immer kombiniert mit -d)
Wichtig: bei Kombination von down mit -v Schalter werden auch Volumes mitgelöscht - 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:
Das CMS WordPress benötigt folgende Komponenten:
- WordPress Software - PHP Technik mit Datenbankanbindung
- Webservice
- Datenbank
Im folgenden Beispiel wird WordPress und der Webservice (Webserver) durch das Image wordpress:latest bereitgestellt.
# Datei test/docker-compose.yml version: '3' services: db: image: mariadb:latest volumes: - vol-db:/var/lib/mysql environment: MYSQL_RANDOM_ROOT_PASSWORD: 1 MYSQL_DATABASE: wp MYSQL_USER: wpuser MYSQL_PASSWORD: geheim2 restart: always wordpress: image: wordpress:latest volumes: - vol-www:/var/www/html ports: - "8082:80" environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wpuser WORDPRESS_DB_NAME: wp WORDPRESS_DB_PASSWORD: geheim2 restart: always volumes: vol-www: vol-db:
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 zweiten docker compose Beispiel (Joomla-Installation) können wir die Nutzung von Docker Volumes sehen. Für die saubere Anwendung der Techniken ist immer eine Analyse der genutzten Images (hier: joomla) notwendig. Auf dem Docker Hub - oder in weiterführenden Beiträgen - erklären die jeweiligen Entwickler immer die Nutzung der Images und aller nötigen Parameter (hier: link bzw. bei compose dann links) oder Umgebungsvariablen (env).
Anm. für Trainer/Training: bitte ggt. aktuelle Versionen aus Github Repos beachten.
# Datei: joomla/docker-compose.yml services: joomla: image: joomla links: - joomladb:mysql ports: - 8080:80 volumes: - webdatanew:/var/www/html environment: JOOMLA_DB_HOST: joomladb JOOMLA_DB_PASSWORD: example joomladb: image: mysql:8.0 volumes: - mysqldatanew:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: example volumes: webdatanew: mysqldatanew
Hier wurde also die (für die Persistenz von Projekten) nötigen Docker Volumes mit den Namen webdatanew:
und mysqldatanew:
deklariert und (oben) genutzt!
Tipp/Hinweis: quasi wie Laufwerke!
Außerdem gibt es einen exklusiven Account für die Joomla-DB, die im MariaDB-Container genutzt wird. Nach Infos zum Image hat die Standard-Datenbank für diese Vorgehensweise den DB-Namen joomla. Für die Konnektion bei der Installation benötigt man also:
- Host: joomladb
- DB: joomla
- DB-User: root
- DB-Password: example
Übung:
Wenn man das CMS Joomla - mit den hier vorgegeben Werten - durchinstalliert, darf man bei der Info zum DB-Server einfach den Hostname joomladb 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: 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 sollten immer die Techniken nutzen, mit denen Docker uns Datenträgermangements außerhalb der Container für persistente Daten anbietet. Denn nie vergessen: Container sollten immer weggeschmissen werden können, um dann neu basierend auf einem Image schnell und sauber wieder erzeugt werden zu können!
📤 Registry
Topics:
- Registry - Allgemein
- Registry:/Image:Tag
- Docker Hub
- Lokale Docker Registry
Registry - Repository, Image:Tag
Klärung der wichtigen technischen Zusammenhänge:
Registry - Allgemein
Die Standard-Registry der Docker-Umgebung analysiert man mit: docker info | grep -i registry
Das ist normalerweise der Docker-Hub : https://index.docker.io
Registry in Versionen 1 (veraltet) - aktuell Version 2 und man arbeitet in 2024 an Version 3 - siehe Tags für die Docker Registry (Distribution)
Später wollen wir auch eine Private Registry betreiben (z.B. localhost:5000), um unsere Images privat zu verwalten!
Online kann man den Docker Hub über das Webportal analysieren: hub.docker.com!
Empfehlung (ggf.): später mal einen Account anlegen für eigene Ablagemöglichkeiten auf Docker Hub und Sicht auf technische Analysen von Images (Sicherheitschecks)!
Allerdings sind die Standardinfos des sogenannten Docker Scouts mittlerweile auch ohne Accounts sichtbar.
In der Konsole eine 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
Docker Hub
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.
Docker Befehle für den Hub:
docker login | logout
Authentifizierung hinterlegt (!) in
/etc/docker/key.json
Lokale 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 (in Skriptsprache Go)
- V3 - in Entwicklung Alpha-Status Anfang 2024
Desweiteren starten wir erst einmal mit einer Insecure Registry - also ohne verschlüsselte Transporte.
Übersicht über die Bereitstellungen für Docker Registry:
- Registry Software auf Github https://github.com/docker/distribution
Anm.: wird hier nicht genutzt. - Registry als Docker Image vom Docker Hub https://hub.docker.com/_/registry
Anm.: mit beliebiger Distro nutzen. - Software in Linux-Distributionen - und wieder: bitte die Version der Registry vorher klären
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 bei Docker Compose mit:
docker-compose up -d
Konfiguration für Zugriff auf Registry:
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!
Mit der config.yml
kann die Registry Konfiguration dann auch angepasst bzw. überschrieben werden.
Links zur Docker Registry:
- https://github.com/docker/distribution/blob/master/docs/configuration.md
- https://docs.docker.com/registry/configuration/
Registry als Distributions-Package
Die Umsetzung kann (z.B.) mit den folgenden Paketen erfolgen:
docker-distribution-registry # openSUSE
docker-registry # Debian 12 Bookworm
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).
📑 JSON
Topics:
- JSON Format
- Tool jq
- jq Error in Windows CLIs
JSON - (siehe: docker inspect
)
Bei der Analyse von Images und Containern hilft das docker [...] inspect
Kommando ergeben sich JSON Codes. Die Ausgaben entstehen also 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
Im Seminar praktische Tests und Empfehlungen für saubere Ausgabe, Formatierungen und Filterungen: jq
(ggf. 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 kann sicherheitstechnisch einen Nachteil darstellen.
JSON-Tool jq
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) - zur weiteren Hilfe gerne auch grafische Werkzeuge wie JSONCrack (s.u.)
Image Inspektion - nur Info zum Creation Date/Time ausgeben:
docker image inspect hello-world:latest | jq '.[0].Created'
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.)!
jsoncrack.com - Free Online Editor
Für die Visualisierung und Analyse von JSON-Daten: https://jsoncrack.com/editor
Mittlerweile gibt es auch eine VS Code Extension jsoncrack (VS Code Marketplace Link Jsoncrack)
[Error in 2024 - Again!] failed to get console mode for stdout...
Und wieder hat bei einer Docker Version unter Windows in der PowerShell und anderen Windows CLI (genauer: Docker Desktop mit der entsprechenden Docker Engine) der Fehlerteufel bei der Pipeline-Nutzung - bzw. der Nutzung von stdout - zugeschlagen.
Hier die aktuelle Fehlerbeschreibung in Docker Threads: https://github.com/docker/for-win/issues/13891
Der Fehler taucht bei verschiedenen Anwendungen auf:
# FUNKTIONIERT: docker version --format '{{.Client.Version}}' 25.0.2
FUNKTIONIERT NICHT: $foo = docker version --format '{{.Client.Version}}' $foo failed to get console mode for stdout: Das Handle ist ungültig. 25.0.2
Insbesondere dann eben beim Pipeling, was in Zusammenhang mit jq
Nutzung extrem nerven kann!
docker images docker/*-extension | more
# oder bei alle jq Pipelines!
Für jq Analysen kann man (z.B.) docker inspect Ausgaben in temporäre JSON Dateien exportieren (Out-File) und dann die störende erste Zeile mit der Fehlermeldung mit einem Einzeiler entfernen:
Get-ChildItem *.json | ForEach-Object { (get-Content $_) | Where-Object {(1) -notcontains $_.ReadCount } | Set-Content -path $_ }
# oder in Short / Aliasen
gci *.json | % { (gc $_) | ? { (1) -notcontains $_.ReadCount } | sc -path $_ }
Das kann natürlich nur ein temporärer Workaround sein - wir warten (unter Windows) auf die Fehlerbehebung dieses Verhaltens. Unter Linux tauchen keine Probleme auf!
🐧 Debian
Topics:
- Distrowahl Debian
- Engine vs Docker Desktop on Linux Distros
- Docker Engine on Debian
- Docker Desktop on Debian
Debian Auswahl Linux Distribution
Wir haben eine riesige Auswahl an Linux Distributionen und auf nahezu allen Distros können wir Docker und Co - also Docker Compose, Podman bis hin zu Kubernetes - installieren.
Wie wählt man also aus? Die meisten Firmen sind über die Jahre bei Distros hängengeblieben. Fragen Sie mal bei Firmen, die viele Jahre CentOS geschäftsmäßig eingesetzt haben und jetzt vor teils großen Problemen stehen.
In meinem Seminarumfeld orientiere ich bei Firmenschulungen an den dortigen Umgebungen: wird Red Hat eingesetzt machen wir Red Hat, wird Suse eingesetzt machen wir Suse...
Für meine Schulungen habe ich mich nach den Erfahrungen der letzten Jahre (s. a. o.) nach folgenden Unterscheidungskriterien orientiert:
- Enterprise Distros - die teuere (nicht kostenlose) und oft nicht mal quell-offenen Distributionen - Marktführer in diesem Segment: RHEL, SLES
Analyse: ich will zwar genau wissen, wie diese Distros funtkionieren; aber: Einsatz in Seminaren oder auch persönlichem Umfeld nur eingeschränkt möglich oder clever! - Company driven Distros - Linux Distributionen, die maßgeblich von Firmen und deren Interessen unterstützt werden
Auswahl: Red Hat CentOS oder auch Fedora, Suse openSUSE / Tumbleweed, Canonical Ubuntu
Analyse: ich bin als Techniker wieder sehr interessiert; aber: die Abhängigkeit von Entwicklungen und die Willkür bei Entscheidungen sowie die LTS Zuverlässigkeit ist zumindest sehr getrübt - Community Driven Distos - also Linux Distributionen, die ausschließlich mit Open Source Charakter im Netz gepflegt und entwickelt werden - Communities eben!
Auswahl: Debian - seit über 3 Jahrzehnten der Ursprung für viele Derivate; mit Debian 12 Bookworm Öffnung für Firmware Unterstützungen aktuellerer Hardware!
Andere Nennungen:
Arch - die Rolling Release Variante mit Top Softwareunterstützung; im Grunde aber Nischendasein mit hohem Nerd-Potential ("BTW - i use Arch")
Gentoo - der absolute Programmierer/Coder Dream und wer hat eigentlich Bock und Zeit mal eben 3 Stunden auf den neu kompilierten Firefox zu warten?
Die Wahl fällt bei mir also seit sehr langer Zeit auf Debian und wir wollen in unseren Docker Seminaren ebenfalls von Debian profitieren.
Aus Vereinfachungsgründen lasse ich häufig Standardinstallationen von Debian inklusive Standard Desktop Environment Gnome durchführen. Mit Desktop Umgebung lassen sich vielen Übungen dann einfacher direkt mit der Debian Maschine durchführen.
Installation als VM auf Hyper-V
Die technische Umsetzung der Installation geschieht entweder auf Extra-Maschinen, aber meist einfach mittels Virtualisierung auf dem Trainings-PC der Teilnehmer. Weil für die Docker Desktop Installationen später eine komplette Virtualisierungstechnik innerhalb der Debian-VM verfügbar sein muss, sollte man sich auf den gewählten Virtualisierern mit dem Thema Nested Virtualization vertraut machen! Entsprechende Anleitungen werden für die Trainees im Seminar verfügbar gemacht und/oder folgen in dieser Ausarbeitung.
Kurzanleitung Debian 12 Bookworm als Hyper-V VM
- Generation 2 wählen - wiederholbare Probleme mit Generation 1 seit geraumer Zeit
Anm.: das ist schade, weil VM-Exporte mit UEFI manchmal Schwierigkeiten machen können. - Netzwerk: zur Installation erst einmal Default Switch
- DVD Iso an SCSI-Controller hängen
- Prozessoren: nach techn. Möglichkeiten (4)
- Arbeitsspeicher: nicht dynamisch
- Sicherheit: Deaktivierung von "Sicherer Start"
- Firmware: Bootsequence auf DVD
Wenn eine funktionsfähige Debian Distro verfügbar ist starten wir mit der puren Bereitstellung von Docker auf Debian Linux als Docker Engine.
Docker Engine vs. Docker Desktop
Ich empfehle für den Einstieg immer die individuelle Installation der klassischen Docker Engine. Diese Umgebung sollte man dann testen und und hat eine halbwegs vorbereitete Maschine für den nachinstallierbaren Docker Desktop.
Die Firma Docker empfiehlt die Installation des Docker Desktop aus folgenden Gründen:
- Einheitliche Entwicklerplattform auf Windows, Mac und Linux über den Docker Desktop
- GUI mit Erweiterungen und Zusatzfunktionalitäten der Docker Technik und Docker Umgebung
- Eine mögliche One-Klick-Installation inklusive der Docker Engine - da werde ich allerdings immer unruhig ;-)
- Einfache Aktualsierung und Behebungen für Security Topics (siehe auch Docker Scout)
Ich lasse die Topics hier einfach mal stehen. Wir werden uns mit der sozusagen Rohinstallation der Docker Engine beschäftigen, weil serverseitig das auch die Standardvorgehensweise ist. Im Idealfall zeige ich auch die sehr ressourcenarme Umsetzung einer Docker-Umgebung mit LXC-Containern auf ProxmoxVE.
Docker Engine mit Debian Linux
Früher oder 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.
Dokumentation Docker für die Installation Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
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!
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:
sudo docker run hello-world
- für sudo-lose Docker-Nutzung wird User Mitglied der Gruppe docker:
sudo usermod -aG docker $USER
(und Neustart)
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 jetzt schon eine "Nested VM" benötigen - also eine VM mit eigener Virtualisierungsfähigkeit. Das ist mit Hyper-V oder anderen Virtualisieren kein Problem, benötigt aber weiter Konfigurationen!
Übungen:
Unsere bisherigen Tests und Übungen mit dem Docker Desktop für Windows jetzt mit der vollen Linux Umgebung nachvollziehen. Und endlich funktionieren auch die ganzen Spielereien mit dem JSON-Tool jq
in der Konsole!
Docker Desktop mit Debian Linux
Der Docker Desktop soll - anders als die Docker Engine - eine Virtuelle Maschine nutzen. Hierzu muss für die Linux Umgebung die Anforderung hierfür erfüllt sein.
Die Anleitungen findet man unter https://docs.docker.com/desktop/install/linux-install/.
Erster Test: lsmod | grep kvm
- in einer Standard Hyper-V VM erhalten wir hier leider keine gewünschte Rückmeldung!
Über die PowerShell aktivieren wir die Unterstützung von Nested Virtualization!
Set-VMProcessor -VMName vmname -ExposeVirtualizationExtensions $true
(Bitte vnname anpassen!)
Wir kontrollieren die gemachte Einstellung:
Get-VMProcessor -VMName tpl-deb12docker | fl
(in der PowerShell)
lsmod | grep kvm
(in der VM - bekommen wir Ausgaben dann OK und Fortsetzung der Installation)
Für die Nutzung der KVM-Technik sollte der User noch Mitglieder der Gruppe kvm werden:
sudo usermod -aG kvm $USER
(siehe ggf. vorher welche Gruppe /dev/kvm zugewiesen ist)
Hinweis: bei virtuellen Maschinen - insbesondere mit Desktop Environments - funktionieren die Aktualisierungen der Gruppenzugehörigkeiten (oft) erst nach einem Neustart der VM.
Für die Integration des Docker Desktop in die Gnome Shell (siehe später Docker Desktop Icon in Oberer Gnome Leiste) muss man AppIndicator und KStatusNotifierItem per Klicks in der Gnome Shell hinzufügen. Das ist in der Anleitung entsprechend verlinkt.
Danach einfach das DEB-Paket herunterladen und installieren. Der Docker Desktop lässt sich einfach über den Desktop starten.
Spätestens jetzt ist der Context der Docker-Umgebung wichtig.
docker context ls (zeigt die genutzte Umgebung
Im Screenshot kann man die Gnome Integration für den Docker Desktop sehen. Bei gestartetem Docker Desktop ist der Kontext dann auch auf desktop-linux geändert. Es handelt sich um komplett getrennte Docker Arbeitsbereiche.
🖥️ VMs
Topics:
- Microsoft Hyper-V
- Parallelinstallation anderer Virtualisierer
- Oracle VirtualBox
- ProxmoxVE (Debian + KVM/qemu + LXC Container)
Microsoft Hyper-V
Beim Microsoft Hyper-V sollte man erinnern, dass es sich um einen Typ-1 Hypervisor handelt. Das bedeutet - vereinfacht gesagt - dass der laufende Windows Host Rechner im Grunde schon eine "Virtuelle Maschine" darstellt. Und dieser Umstand muss dann ggf. auch bei der Parallelinstallation anderer Virtualisierer (siehe Typ-2 Hypervisor wie VirtualBox) bedacht werden. In vielen Fällen haben die Entwickler der alternativen Virtualisierer dem Umstand der Hyper-V Präsenz bereits Rechnung getragen.
Der Hyper-V lässt sich per Klick und Neustart installieren/aktivieren. Der sogenannte Client Hyper-V - also der Hyper-V auf den Windows 10 / 11 Systemen - stellt netterweise gleich einen schönen "Router/Switch" zur Anbindung von Testnetzwerken zur Verfügung: Default Switch. Auf Windows Server Installationen des Hyper-V muss ein solcher Netzwerk-Switch inklusive DHCP und Routing manuell erstellt werden oder durch eine geeignete VM repräsentiert werden.
Hyper-V und (z.B.) VirtualBox parallel
Da die Installation und Nutzung mit Hyper-V das Host-OS Windows bereits als Virtualisierung realisiert ist, sollte 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 oder PowerShell):
bcdedit /set hypervisorlaunchtype Off
Dieser Befehl stellt Hyper-V aus - benötigt dann Neustart.
bcdedit /v
Der Befehl zeigt die Konfiguration unseres Windows (bzw. von Parallelinstallationen).
bcdedit /set hypervisorlaunchtype Auto
So stellt man Hyper-V wieder an - benötigt wieder Neustart.
Oracle VirtualBox
Anm.: Aktuell nehme ich als Start wohl den Hyper-V und dann sollte man bei paralleler Installation mit Hyper-V mit bcdedit
operieren (s.u.).
Auch VBox verfügt über eine sehr ordentliche Lösung für Teilnetzversorgung von virtuellen Testrechnern. Die NAT-Netzwerktechnik von VBox lässt sich darüberhinaus auch sehr einfach konfigurieren.
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\...
Früher hatte ich die folgenden 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 zur Darstellung von Firewall und SELinux Problematik
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)
ProxmoxVE : Debian + KVM/qemu + LXC Container
Virtualisierung mit VMs und LXC-Containern - Plan für Seminare: Praktische Installation und Inbetriebnahme auf zweitem Trainingssystem.
Für mich ist ProxmoxVE in den letzten Jahren zum unverzichtbaren Virtualisierer geworden. ProxmoxVE basiert auf Debian und nutzt im Grunde bordeigene / Linux-eigene KVM/qemu Technik für die Virtualisierung.
KVM/qemu
Auf Linux Systemen benötigt man keine Zusatzsoftware zum Virtualisieren. Man nimmt einfach die bordeigene KVM/qemu Lösung und motzt das Ganze noch mit ein paar GUIs nach Wunsch auf - die Nerds lassen Letzteres auch gerne weg.
LXC Container
Zusätzlich stellt ProxmoxVE neben vollwertigen VMs mit LXC auch eine besondere Container-Technik bereit. In Kürze könnte man LXC auf der ProxmoxVE Plattform als Mischung aus vollständigen virtuellen Maschinen und Containern wie mit Docker erklären. Solche LXC Container lassen sich basierend auf entsprechenden Container Templates in Sekunden zu vollwertigen ausrollen. Die Container Templates (CT) gibt es nicht nur für alle Standard Distros sondern auch schlüsselfertig in Form der Turnkey Container für ein fix und fertige Dienstleistung: z.B. als turnkey-gitea fertige Git Repo-Server Lösung Gitea.
Man kann einen LXC Container debian-12-standard auch einfach mit einer Docker Engine ausstatten und hat eine sehr schlanke Docker Lösung im Netz.
ProxmoxVE ist bis herunter zum RaspberryPi (ARM Hardware!) als Installation verfügbar, was andeutet, wie ressourcensparend die Software arbeitet.
📚 Infos
Inhalt / Topics:
- Literatur
- Links
- Screenshotauswahl Vorseminar
📖 Literatur
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
Skalierbare Container
Oliver Liebel
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
Docker - Praxisbuch
Autoren: Bernd Öggl und Michael Kofler
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 und eine 4. Auflage in 2023 - auch in Englisch verfügbar!
[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
Linux-Server: Das umfassende Handbuch
Inkl. Samba, Kerberos, Datenbanken, KVM und Docker, Ansible u.v.m. (Ausgabe 2021) mit einem eigenen Kapitel "Docker Container"
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!
Und natürlich erhebt diese Liste keine Anspruch auf Vollständigkeit!
🔗 Linksammlung
Linksammlung
Die folgende Linksammlung natürlich ohne Anspruch auf Vollständigkeit ;-) und mit dem Versuch einer Gliederung.
Tipp: Erst nach dem Seminar stöbern! Und los geht es…
Docker
- Docker Portal
- Docker Documents - Infoportal
- Docker Enterprise Edition (Docker EE vs. CE)
- Docker Community Edition (CE) - Release Notes
- Docker für Windows - Release Notes
- Docker Hub
- Docker Hub - Offizielle Basis Images
- Intro to Docker - A Slideshow
- Docker - What is a Container
- Docker Engine Referenz CLI
- Install Docker on WSL2
Docker Registry
- https://github.com/docker/distribution/blob/master/docs/configuration.md
- https://docs.docker.com/registry/configuration/
Best Practises & HowTos
- Jonny Langefeld - How to Docker
- Simplilearn Slideshare
- Wie funktionieren Docker Container
- Edureka - Deep Dive in Docker
Tools
Ausgabeformatierungen
- Go Programming Templates
- jq Tutorial
- jq Manual (s.a.
man jq
) - jq Ubuntuusers
- jsoncrack.com
Diverses
Cheat Sheets
Security
- Docker Security
- Introduction to User Namespaces in Docker Engine
- Series of Articles regarding Container security fundamentals - Part I - Exploring containers as processes
Other Parts: II - Isolation & namespaces ; III - Capabilities ; IV - Cgroups ; V - AppArmor and SELinux ; VI - seccompVI - seccomp
seccomp
exit-Codes
- Technik chroot: Exit Codes with special Meaning
- Docker run Exit Status: Docker reference run
Videos
- Youtube - KodeCloud - Docker for Beginners: Full Course
- Youtube Docker Recherche
- Youtube Docker Kanal
- Youtube - Docker Basics (Live Stream)
- Youtube Recherche: Difference Virtualization and Container
- Youtube Heise - Docker Praxis mit Linux
- Youtube Edureka
- Youtube Simplilearn
🖼️ Screenshots 2020
Screenshots Vorseminar 2020
Beispielhafte Screenshots aus einem Vorseminar aus Jahr 2020. Die Trainees meiner Seminare bekommen tägliche Screenshots der Seminarwoche (ca. 200 - 300 pro Tag) für die ausführliche bildhafte Dokumentierung unserer Übungen und Recherchen.
Es folgt die klassische Auflistung nach Tagen im Seminar...
🔜 Orchestrierung
Topics:
- coming soon - Rausschmeißer ;-)
Und jetzt wollen wir noch (kurz) über Orchestrierungen sprechen!
Übersicht: (ohne Anspruch auf Vollständigkeit)
- Docker Swarm - Stacks und Services von Docker
- Kubernetes (K8s) - der "Steuermann" von Google
- Mesos - von Apache Foundation
And the winner is ... K8s
Wir schauen uns aber zum Seminarende nur mal kurz das "Original" an ...
Docker Swarm
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".
Kubernetes
...
...tbc...
...
Viel Spaß und Erfolg beim "Containern" wünscht Ihnen
Ihr Trainer Joe Brandes