Docker Seminare Release 2.0-2020 - Joe Brandes
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
Inhalte: 1 Willkommen 3 1.1 Docker Versionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.1 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.2 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1.3 macOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2 Fachbegriffe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3 Technik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.4 Sicherheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2 Erste Beispiele 11 2.1 Beispiel Hello World! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.2 Basis-Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3 Beispiel MariaDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.4 Beispiel Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.5 Beispiele WordPress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.6 Vertrauenswürdige Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.7 Faktoren für Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3 Erste Administration 17 3.1 Images, Container . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.2 Volumes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.3 Overlay-Dateisysteme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.4 Netzwerke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.5 Konfiguration Daemon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.6 Sicherheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 4 Dockerfile 21 4.1 Kurzanleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 4.2 Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.3 Image erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.4 Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4.4.1 Beispiel 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4.4.2 Beispiel 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4.4.3 Beispiel 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 4.4.4 Beispiel 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 5 Docker Kommandos 27 i
5.1 docker help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 5.2 docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 5.3 docker image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 5.4 docker container . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 6 docker-compose 39 6.1 YAML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 6.2 Technik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 6.3 docker-compose.yml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 6.4 Volumes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 6.5 Mini-Swarm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 7 Basis-Images 45 7.1 Übersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 7.2 Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 7.3 Eigenes Basisimage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 7.4 Alpine Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 7.4.1 Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 7.4.2 BusyBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 7.4.3 Hilfen / Dokumentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 7.4.4 Paketverwaltung apk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 8 Docker Registry 53 8.1 Registry Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 8.2 Registry Distro-Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 8.3 Docker Hub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 9 Literatur 57 9.1 Docker - Praxisbuch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 9.2 Skalierbare Container . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 9.3 Linux-Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 9.4 Hyper-V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 10 Linksammlung 65 10.1 Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 10.2 Best-Pracises / How-Tos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 10.3 Kubernetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 10.4 Cheat Sheets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 10.5 Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 10.6 Videos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Stichwortverzeichnis 69 ii
Docker Seminare, Release 2.0-2020 (Wer sofort mit den Docker Seminarunterlagen loslegen will: Einführung) Hinweis: Status 06.02.2020: Nachtrag: mein Schreibtisch war zu „voll“! Überarbeitung - auch wegen Semi- narauslastung - erst ab KW 8 (17.02.2020) Seit Mitte 2017 erstelle ich neue Seminarunterlagen in restructuredText (RST) und wandele bestehende Dokumen- tationen und Seminarbegleitungen in RST um. Bemerkung: Infos zu restructuredText1 Für gelegentliche „Typos“, die schon verhanden waren oder beim Konvertieren entstanden sind, bitte ich um Verständ- nis. Bitte einfach unter Angabe der Kapitel-Info an mich übermitteln. Hierfür Danke im Voraus. Für Kenner meiner Seminarunterlagen hier kurz die wichtigsten Gründe für die teils aufwändigen Arbeiten: • Flexibilität: Word- (.docx), LibreOffice- (.odt) und PDF-Dokumente lassen sich zwar einfach erstellen! Aber solche Doks lassen sich leider überhaupt nicht geeignet und sauber in HTML (gegliedert / oder eine Seite), JSON, XML, Manpages, Texinfo oder gar EPUB wandeln! Oder umgekehrt! • Metainfos: Meta-Techniken, Fußnoten oder Indizes lassen sich nicht einheitlich in den unterschiedlichen Formaten pflegen. • Versionsmanagement: Eine Versionsverwaltung wie Git (Plattform: github.com) arbeitet am effizientesten mit einfachen Textdokumen- ten. Auch manuelles „Diffen“ ist mit Rohtexten eine mächtige und einfache Technik, während bei Word/PDF- Dokumenten immer sehr aufwändige und unübersichtliche Techniken eingesetzt werden müssen. Conclusio: ein einziges grundlegendes Dokumentformat restructuredText und Werkzeuge (RstTools, DocUtils, Pandoc oder Sphinx) zum sauberen Erzeugen der gewünschten Dokumentformate (HTML, SingleHTML, Latex, PDF, EPUB, ODT, DOCX,. . . ) Ihr Trainer Joe Brandes Hier folgen jetzt Meta-Infos zur Dokumentenversionspflege: Version 2.0-2020 Language de Description Unterlagen zu Docker Seminaren Trainer Joe Brandes. Erstellt mit restructuredText / Sphinx / sphinx_rtd_theme! Keywords Docker, Seminarunterlage, J. Brandes Copyright Joe Brandes Author Joe Brandes License GNU General Public License, either version 2 of the License or any later version. 1 https://de.wikipedia.org/wiki/ReStructuredText Inhalte: 1
KAPITEL 1 Willkommen Manche meiner RST-Unterlagen sind im Laufe der Jahre zu kleinen Büchern gewachsen. Das möchte ich mit dieser Unterlage nicht (er)schaffen. Und die Autoren haben mir/uns die Arbeit „Buch“ ja auch schon abgenommen! Diese Unterlage sollte eher als „Cheat Sheet“ / „Roter Faden“ verstanden und genutzt werden! Und jetzt viel Spaß mit Docker. . . 1.1 Docker Versionen Docker Software gibt es für nahezu alle Betriebssysteme. Und in unseren Seminaren wollen wir die OS- Implementierungen versuchen in Gänze zu erfassen - aber: aktuell ist Docker einfach heimisch auf Linux-Plattformen! 1.1.1 Linux geplante Installationen: • Debian (eig. Standard-OS für Services im Internet) Install-Anleitung auf docs.docker.com: https://docs.docker.com/install/linux/docker-ce/debian/ • CentOS (Vertreter Red Hat OS - seit 2019 der Platzhirsch für Container) Install-Anleitung auf docs.docker.com https://docs.docker.com/install/linux/docker-ce/centos/ • openSUSE (Vertreter Novell SLES) Installation: (Versionen vorher checken!) per zypper installieren oder über Build-Service Virtualization/Container https://software.opensuse.org/package/docker 3
Docker Seminare, Release 2.0-2020 Probleme möglich: z.B. Netzwerk/DNS - genauer: Bei Nutzung von Docker-DNS-Servicen - andere/normale funzen! siehe z.B.: Robin Winslow - fix docker2 Hinweis: Bitte ü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 Im letzten Aufruf müssen Client und Server aufgelistet sein. Im Seminar wird auch der Standarduser für docker berechtigt werden, um die tägliche Seminar- und Schulungsarbeit zu erleichtern. Hierfür muss manchmal die Gruppe docker neu erstellt werden groupadd docker # falls noch nicht vorhanden und nicht mit dockerroot (CentOS) ˓→verwechseln usermod -aG docker standarduser Gefahr: Docker mit Standarduser kann ein großes Sicherheits darstellen! Darstellungen hierzu folgen! 1.1.2 Windows Anm.: im 1400 Seiten zweiten Container-Werk von O. Liebel ist Docker für Windows komplett heraus! Und der Nano-Server findet ebenfalls nicht statt! Aber so ginge es los. . . wir bnenötigen Windows 10 Pro oder Enterprise - siehe Hyper-V mit MobyLinuxVM! Installarchiv für die Docker für Windows (Hyper-V) Technik am Besten über Umweg docs.docker.com Docker für Windows3 oder über Portal zu Docker für Windows4 Hinweis: Legacy Tech: Docker Toolbox Alte Alternative (LegacyTech): Docker Toolbox für Windows (dann arbeitet man mit VirtualBox zusammen!) https://docs.docker.com/toolbox/overview/#ready-to-get-started https://docs.docker.com/toolbox/toolbox_install_windows/ 2 https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns/ 3 https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe 4 https://store.docker.com/editions/community/docker-ce-desktop-windows 4 Kapitel 1. Willkommen
Docker Seminare, Release 2.0-2020 1.1.3 macOS (noch mehr außer Konkurrenz als Docker für Windows ;-) Die Installationsdatei (DMG) für macOS finden Sie unter folgender Adresse: Docker für Mac5 1.2 Fachbegriffe 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: 128 (bei overlay2, devicemapper; s.u.) Container-Hosts: 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! • Stacks - Administration von Service-Gruppen • Cluster - Vorraussetzung für Services und Stacks; Docker Nomenklatur: Swarm; s.a. Python-Skriptool docker-compose • Kubernetes - Google Open Source für Container-Verwaltungen; 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) ;siehe: Liebel Kap. 2.3ff 1.3 Technik Weitere Fachbgegriffe und kurze Erläuterungen: docker Client-Server-Modell Linux: docker /dockerd; bei Windows/MacOS „komplizierter“ Docker-Client und Server kommunizieren über eine HTTP-RESTful API (für eine sichere Kommunikation siehe Docker Security HTTPS6 Einfacher Test der HTTP-Technik: curl -s --unix-socket /var/run/docker.sock http://localhost/images/json 5 https://store.docker.com/editions/community/docker-ce-desktop-mac 6 https://docs.docker.com/engine/security/https/ 1.2. Fachbegriffe 5
Docker Seminare, Release 2.0-2020 Abb. 1: Virtuelle Layers (Bild: Liebel - Skalierbare Container-Infrastrukturen für Ihr Unternehmen) 6 Kapitel 1. Willkommen
Docker Seminare, Release 2.0-2020 Das erzeugt einen einen unleserlichen (serialisierten) Infostrom, der sich mit dem Tool jq besser analysieren lässt: curl -s --unix-socket /var/run/docker.sock http://localhost/images/json | jq Tipp: Paket jq nachinstallieren! Anm.: für CentOS benötigt man EPEL-Repo! Bei diesen Ausgaben gleich auch die Syntax der JSON-Files beachten (Klammerungen, Aufzählungen mit Kommata). Docker Images Windows siehe Windows Server Core, Nano Server, IIS, ASP.NET; Anm.: Nano Server nur für Windows Server 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. Docker Registry: https://index.docker.io/v1/ Registry finden: docker info | grep -i registry Alternative Registries: • Quay (https://quay.io/ ) • Google Registry (https://cloud.google.com/container-registry/ ) • Amazon (https://aws.amazon.com/de/ecr/ ) Anm.: Werden im Seminar - bis auf Weiteres - keine Rolle spielen (siehe auch nötige Accounts, ggfs. Kosten, . . . ) 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! Virtuelle Maschinen und Container (Bild: Liebel - Skalierbare Container-Infrastrukturen für Ihr Unternehmen) Container Lösungen (Wikipedia Containervirtualisierung7 ) • Klassiker: FreeBSD Jails (ca. 2000), Solaris Zones (ca. 2005), OpenVZ (ca. 2005; siehe Virtuozzo von Parallels) • LXD für LXC (ca. 2008; Linux Containers oder Lightweight Linux Container) - Ausgangsbasis für Docker • rkt (sprich: Rocket) - von CoreOS (bzw. Produkt Container Linux) • VMware Photon • 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, 7 https://de.wikipedia.org/wiki/Containervirtualisierung 1.3. Technik 7
Docker Seminare, Release 2.0-2020 aus „Docker Daemon“ wurde Docker Engine; ab Version 1.12 mit eingebauter Swarm Technik: Swarm Mode Schwerpunkt auf Applikationsvirtualisierung und nicht auf abgespeckte VMs Tipp: Darstellung runc als eigenständiges Container-Tool bei Liebel (S. 85ff.) Container Formate • Docker, CoreOS/rkt, LXD/LXC, Photon, . . . • OCF (Open Container Format) der OCI (Open Container Initiative - www.opencontainers.org8 Namespaces Ressourcen von Kernel lassen sich isolieren - Prozesse erhalten quasi eigene Umgebung Tipp: Übung mit uname -r und grep -i pretty_name /etc/os-release Aufrufen in Host und Con- tainern! 1.4 Sicherheit Faktoren für die Sicherheit der Container-Techniken: 8 https://www.opencontainers.org/ 8 Kapitel 1. Willkommen
Docker Seminare, Release 2.0-2020 • Herkunft der genutzten Images • Wegen der Kernel-syscall Techniken (siehe namespaces) problematisch! Tipp: Bitte seccomp >= Version 2.2.1 Anm./Empfehlung zu Thema namespaces: # cat /boot/config-$(uname -r) | grep CONFIG_SECCOMP= CONFIG_SECCOMP=y # rpm -qa | grep seccomp libseccomp2-2.3.2-lp150.1.9.x86_64 joeb@opensuse:~/rst/docker> Links: • seccomp9 • seccomp Profile10 • seccomp default Profile syscalls blocks11 Empfehlungen: • Implementierungen mittels cgroups (Control Groups für Nutzung von Limits) • Applikationen in Container möglichst nicht mit root • Fähigkeiten der Images einschränken • User-Namespace aktiv • seccomp/SELinux/Apparmor • keine SUID im Container • aktuelle Kernel • Container-Host härten, aktualisieren, patchen • Container-Host Zugriffe einschränken • Netzwerk sichern / konfigurieren Hinweis: Also: SELinux und auch Firewalltechnken (Netfilter/iptables, firewalld, . . . ) bedenken. Zu diesen vertiefenden Themen in Produktionsumgebungen an dieser Stelle keine weiteren Ausführungen. 9 https://docs.docker.com/engine/security/seccomp/ 10 https://github.com/moby/moby/blob/master/profiles/seccomp/default.json 11 https://docs.docker.com/engine/security/seccomp/#significant-syscalls-blocked-by-the-default-profile 1.4. Sicherheit 9
Docker Seminare, Release 2.0-2020 10 Kapitel 1. Willkommen
KAPITEL 2 Erste Beispiele Wir wollen ein Gefühl für die Docker-Technik bekommen - „Learning by Doing“ Fertige „Hello World“ Beispiele (inkl. Dockerfile Nutzungen) nach „Öggl/Kofler“ (siehe Literatur) Tipp: Anm.: möglichst erst später im Seminar - wir wollen uns herantasten • apache2/php • node.js • python Hier beispielhaftes Dockerfile für das Hello-World apache2/php Image: Quellcode 1: Dockerfile apache2/php 1 FROM php:7-apache 2 ENV TZ="Europe/Amsterdam" 3 COPY index.php /var/www/html Mehr dazu aber - wie bereits gesagt - erst später! 2.1 Beispiel Hello World! Kein Seminar oder Scripting ohne ein „Hello World!“ Beispiel! Erste Aufrufe also: 1 docker run hello-World 2 docker ps -a 3 docker images 11
Docker Seminare, Release 2.0-2020 2.2 Basis-Images Beispielhafte Suche nach offiziellen Basis-Images: Docker Hub - Offizielle Basis Images12 z.B. Ubuntu https://hub.docker.com/_/ubuntu also: docker run -it ubuntu Bestehende Container nutzen: docker start -i (oder die ID) Anm.: bei Namen funzt Completion Besser beim Erstellen der Container auf Namen achten: (hier für Container und Docker-„Maschine“) docker run -it --name meinubuntu -h meinubuntuhostname ubuntu Gleichzeitiges Ausführen von Kommando in laufendem Container: docker exec -it meinubuntu /usr/bin/top 2.3 Beispiel MariaDB Das Image stellt mit dem MariaDB-Service einen Background Prozesse zur Verfügung! Anm./Erinnerung: Container ohne Prozess(e) wird gleich wieder beendet! (siehe: hello-world) docker run -d --name mariadb-test1 -e MYSQL_ROOT_PASSWORD=geheim mariadb Stoppen eines Containers: docker stop mariadb-test1 Containerinfos auslesen: docker inspect maria-db-test1 Beachten: MariaDB Datenbank Verzeichnis /var/lib/mysql liegt im Docker-Container! docker inspect maria-db-test1 | less und die Zeilen mit Mounts analysieren. Die Datenbank (wenn diese läuft) mit MySQL/MariDB-Client checken: docker exec -it mariadb-test1 mysql -u root -p Den Container analysieren: 12 https://hub.docker.com/search?q=&type=image&image_filter=official&category=base 12 Kapitel 2. Erste Beispiele
Docker Seminare, Release 2.0-2020 docker exec -it mariadb-test1 /bin/bash # Aufrufe: cat /etc/os-release ps ax mysqld --version exit Das Logging übernimmt Docker für den Hintergrund-Daemon Mysqld: docker logs mariadb-test1 Jetzt erweitern wir das Beispiel mit eigenem Volume im Userdir Home: mkdir /home/joeb/varlibmysql # manuelles mkdir (ggf.) nicht nötig! docker run -d --name mariadb-test2 \ -e MYSQL_ROOT_PASSWORD=geheim \ -v /home/joeb/varlibmysql/:/var/lib/mysql mariadb So jetzt haben wir einen neuen Container mariadb-test2 mit den DB-Dateien im Homedir eines Users. Hinweis: Diese Umleitung für Volumes kann bei Nicht-Linuxen problematisch sein! Jetzt noch ein Container - hier mit Portumleitungen: docker run -d --name mariadb-test3 \ -v /home/joeb/varlibmysql/:/var/lib/mysql \ -p 13306:3306 mariadb Und jetzt klappt der Zugriff auch direkt über den Docker-Host: mysql -u root -p --port 13306 --protocol=tcp 2.4 Beispiel Networking Mit Ports kann man also (in)direkt auf die Dockerdienste / Dockerprozesse zurgreifen. Besser ist es allerdings mit eigenen Dockernetzwerk die nötigen Container zu verbinden. Anm.: bitte (immer) vorher alle beteiligten „MariaDB-Container“ stoppen. Neues Netzwerk erstellen und und neuen MariaDB-Container mit PhpMyAdmin nutzen: docker network create test-net docker run -d --name mariadb-test4 \ -v /home/joeb/varlibmysql/:/var/lib/mysql \ --network test-net mariadb docker run -d --name pma -p 8080:80 \ -e PMA_HOST=mariadb-test4 \ --network test-net phpmyadmin/phpmyadmin Anm.: beim letzten Aufruf ist der volle Name für das PhpMyAdmin-Image zu beachten. Siehe: PhpMyAdmin Image auf Docker Hub13 13 https://hub.docker.com/r/phpmyadmin/phpmyadmin 2.4. Beispiel Networking 13
Docker Seminare, Release 2.0-2020 Docker-Netzwerke erledigen selbstständig die Namensauflösungen! Aber: es werden die mit der Option -- name erstellten Bezeichner verwendet. 2.5 Beispiele WordPress Vor der Bereitstellung von WordPress benötigen wir eine MySQL/MariaDB-Docker-Instanz und ein passendes Do- ckernetzwerk. Infos zum Wordpress Image siehe: Wordpress Image auf Docker Hub14 Auf dem Docker Hub Portal zu Wordpress finden sich auch die Erläuterungen für die speziellen WordPress Umge- bungsvariablen (siehe Parameter -e). Hier die vollständigen Konfigurationen. . . Lokale Verzeichnisse für DB und WordPress-Website: (Anm.: ich habe gerne ein Hauptverzeichnis für die Docker- Dirs, die Unterverzeichnisse würde Docker heute auch selber anlegen!) mkdir -p /home/joeb/docker/varlibmysql mkdir /home/joeb/docker/wp-html Test-Netzwerk: docker network create test-net docker network list DB MariaDB bereitstellen: (bei Tests auf Name –name achten - Nummerierungen) docker run -d --name mariadb-test5 \ -e MYSQL_ROOT_PASSWORD=geheim --network test-net \ -v /home/joeb/docker/varlibmysql/:/var/lib/mysql mariadb Und jetzt noch WordPress: docker run -d --name wp-test1 --network test-net \ -v /home/joeb/docker/wp-html:/var/www/html -p 8081:80 \ -e WORDPRESS_DB_PASSWORD=geheim \ -e WORDPRESS_DB_HOST=mariadb-test5 wordpress Und natürlich lässt sich auch der PhpMyadmin Zugriff bereitstellen: docker run -d --name pma -p 8080:80 \ --network test-net -e PMA_HOST=mariadb-test5 phpmyadmin/phpmyadmin Hinweis: Bitte immer auf die Ports achten! Soweit ein kleiner Überblick mit praktischen Beispielen. 2.6 Vertrauenswürdige Images Wir nutzen bisher einfach öffentliche Images aus möglichst offiziellen Quellen. 14 https://hub.docker.com/_/wordpress 14 Kapitel 2. Erste Beispiele
Docker Seminare, Release 2.0-2020 Wie sieht es aber mit echt vertrauenswürdigen Images aus? Eigenes Basis-Image Wir erstellen/installieren ein Template-System und erstellen hieraus einen Tarball. Dieses lässt sich dann auf dem Docker-Host wieder Importieren. Image-Erzeugung per Skript Beispiel: YUM-Based mit Skript online15 Images from Scratch Siehe Docker Registry: Offizielles Image Scratch16 SUSE/SLES sle2docker Auf Ruby basierendes spezielles Tool mit speziellen Registries für Suse-Plattformen. 2.7 Faktoren für Security Ganz wichtige aber eben auch ganz dicke Bretter. . . • AppArmor (Application Armor) • SELinux (Security Enhanced Linux) - wollen wir für Test auf permissive Status ermitteln mit: sestatus oder ls -Z (bei CentOS; bei Debian, openSUSE sollte SELinux deaktiv sein) (Auszug/Zeile:) Current Mode: enforcing Ausschalten mit setenforce 0 Dauerhafte Konfiguration in /etc/sysconfig/selinux • Netfilter/iptables (bzw. Dienste firewalld, ufw) Anm.: auch immer mal verantwortlich bei vermeintlichen Docker Technik Problemen! 15 https://raw.githubusercontent.com/docker/docker/master/contrib/mkimage-yum.sh 16 https://hub.docker.com/_/scratch 2.7. Faktoren für Security 15
Docker Seminare, Release 2.0-2020 16 Kapitel 2. Erste Beispiele
KAPITEL 3 Erste Administration Die komplette Administration ergibt sich erst durch längere Praxis und Erfahrungen mit den mannigfachen Docker- Aufrufen und Tools. Hier eine erste kleine Übersicht. . . 3.1 Images, Container Liste der heruntergeladenen bzw. selbst erstellten Images: docker images Container analysieren: docker ps # laufende Container docker ps -a # alle Container docker ps -a s # alle Container mit Größenangaben Beachten bei den Größenangaben: virtuell - mehrere Container können gleiche Images nutzen. Gefahr: Die Löschkommandos gerne ohne Rückfragen! Wie bei Linux-Konsolen eben üblich! Container löschen: docker rm docker rm Die IDs der Container kann mit Parameter -q erhalten und so ergeben sich praktische Aufrufe zum Löschen von Containern: 17
Docker Seminare, Release 2.0-2020 docker ps -a -q docker ps -a -q -f ancestor=hello-world # alle Container von Image hello- ˓→world docker rm $(docker ps -a -q -f ancestor=hello-world) # löschen docker rm $(docker ps -aq) # alle Container löschen!!! Images löschen: docker rmi hello-world 3.2 Volumes Die Volumes werden beim Löschen von Containern nicht mitgelöscht, was ja auch ganz im Sinne der technischen Nutzung ist (siehe Aktualisierung von Containern). Verzeichnis für Volumes (bei Linux): /var/lib/docker/volumes Zu beachten in aktuellen Beispielen entweder keine Volumens genutzt (siehe docker inspect) oder die Volumes anders gemountet! . . . tbc. . . 3.3 Overlay-Dateisysteme Die Struktur aus (von unten nach oben): • Read-only Schichten – bootfs mit Kernel und cgroups – Basis Image (z.B. Alpine) – Application Image (z.B. Webserver Apache oder Nginx) – weitere Application-Layers • Read-Write Container Schicht (quasi on top) Jetzt wird aus einem Image ein Container! Copy-On-Write (COW) Zugriff durch die Schichten und in oberster Schicht (rw-Container) Kopie anlegen, für Daten aus den unteren ro- Schichten. Ermitteln des Storage-Overlay-Systems: docker info | grep Storage Durch die Schichten Übersicht Overlay-Systeme: • vfs (nur für Testing/Debugging) • aufs (ältester Docker Storage Driver; Advanced Multi-layered Unification Filesystem) Anm.: nur noch selten vertreten; siehe: Knoppix 18 Kapitel 3. Erste Administration
Docker Seminare, Release 2.0-2020 • overlay2 (die modernisierte overlay Variante und Docker-Standard) Anm.: Kernel >= 4.0 nötig! • btrfs (siehe openSUSE/SLES) Achtung (siehe Suse Installationen): Literatur empfiehlt noch keinen produktiven Einsatz! • zfs performant, hoher RAM-Verbrauch, Lizenzfragen; hinterfragen: Ubuntu nutzt zfs • devicemapper in allen Distros verfügbar; muss mit direct-lvm eingebunden werden (nicht: loop-lvm) Hier mal eine Grafik zur OverlayFS(2) Technik: Abb. 1: OverlayFS(2)-Modell (Bild: Liebel - Skalierbare Container-Infrastrukturen für Ihr Unternehmen) Siehe hierzu auch Ordnerstrukturen: /var/lib/docker/overlay... 3.4 Netzwerke Spater hierzu mehr - hier: 101 Netzwerke auflisten: docker network ls # auflisten docker network inspect bridge # analysieren 3.5 Konfiguration Daemon Verschiedene Möglichkeiten für die Docker Daemon Konfiguration: • Beim Starten über die Kommandozeile - siehe dockerd --help • Docker config: /etc/sysconfig/docker (z.B. DOCKER_OPTS="") 3.4. Netzwerke 19
Docker Seminare, Release 2.0-2020 • Systemweite config: /etc/docker/daemon.json • Benutzer config: ~/.docker/config.json Tipp: Möglichst nicht mischen/kombinieren! 3.6 Sicherheit Container sind zwar durch Namespaces isoliert. Doch das ist bei Weitem nicht derselbe Schutz, wie es bei echten Virtualisierungen erreicht werden kann. Technische Ansätze zur Isolierung zum Host: • Namespaces (siehe UIDs, GIDs, PIDs pro Container) • Mount-Namespaces auf Kernelebene (sicherer als chroot) • eigener Netzwerkstack Gefahr: Docker Prozess verlangen nach root Siehe Rechte für ls -l /var/run/docker.sock srw-rw---- 1 root docker 0 7. Jan 12:35 /var/run/docker.sock Aus Vereinfachungs- und Seminargründen entscheiden wir uns dennoch für usermod -aG docker joeb Ansätze zur Verbesserung der Sicherheit: • Docker Security17 • Introduction to User Namespaces in Docker Engine18 17 https://docs.docker.com/engine/security/security/ 18 https://success.docker.com/article/introduction-to-user-namespaces-in-docker-engine 20 Kapitel 3. Erste Administration
KAPITEL 4 Dockerfile Bis jetzt haben wir fertige Images (siehe hub.docker.com) genutzt und mit diesen Images die Container erstellt. Hinweis: Später: mit docker-compose werden mehrere Container kombiniert eingerichtet! Die meisten Images waren auch ordentliche Vorlagen, aber z.B. in Ubuntu würde man vielleicht gerne das Paket iproute2 nachinstallieren, . . . usw. Also wollen wir jetzt unsere eigenen Images erstellen und bedienen uns eines Dockerfile, das alle nötigen Anweisun- gen enthält! 4.1 Kurzanleitung • Ordner für Image erstellen • ggf. Dateien im Ordner bereitstellen (z.B. Skripte, Webdateien/Ordner) • Datei Dockerfile im Ordner erzeugen und Inhalt/Konfiguration für Image festlegen • mit docker build ein neues Image lokal erzeugen • 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 ($) • Eigenes Docker Repository Links: • Automatic Builds19 19 https://docs.docker.com/docker-hub/builds/#set-up-build-rules 21
Docker Seminare, Release 2.0-2020 • Docker Registry20 4.2 Syntax Schlüsselwörte für ein Dockerfile als Tabelle: Schlüsselwort Bedeutung ADD kopiert Dateien in das Dateisystem des Images CMD führt Kommando beim Start des Containers aus COPY kopiert Dateien aus Projekverzeichnis in das Image ENTRYPOINT führt Kommando beim Start des Containers aus ENV setzt eine Umgebungsvariable EXPOSE gibt die aktiven Ports an FROM gibt das Basis-Image an LABEL legt Zeichenkette fest RUN führt das Kommando aus USER Account für RUN, CMD und ENTRYPOINT VOLUME gibt Volume-Dirs an WORKDIR Arbeitsverzeichnis für RUN, CMD und ENTRYPOINT Erläuterungen: • Reference Dockerfile21 • Best Pracitces Dockerfile22 Kurze Analyse / Erläuterungen: ADD v. COPY - scheinen ja dasselbe zu tun, aber ADD kann. . . • . . . auch mit URL umgehen • . . . auch (wie COPY) Verzeichnisinhalte komplett kopieren • . . . mit TAR-Archiven arbeiten/entpacken (gzip, bzip2, xz) Beide können mit –chown=user:group Parameter umgehen. In Kürze: COPY nur für einfaches Kopieren einer lokalen Datei. CMD v. 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 4.3 Image erstellen Vorgehen für Beispiel 2 (s.u. einfacher Webserver) 20 https://docs.docker.com/registry/ 21 https://docs.docker.com/engine/reference/builder/ 22 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ 22 Kapitel 4. Dockerfile
Docker Seminare, Release 2.0-2020 mkdir -p /home/joeb/projektverzeichnis/samplesite cd /home/joeb/Projekverzeichnis touch samplesite/index.html samplesite/style.css # HTML/CSS-Site nach Gusto touch Dockerfile # siehe Dockerfile Beispiel docker build -t joebrandes/testwebserver . # Image erzeugen / taggen docker run -d -p 80:80 -p 443:443 -h webtest \ # Container erzeugen --name testwebserver joebrandes/testwebserver Die normale (und https-gesicherte) Seite sollte sich jetzt im Browser öffnen lassen! 4.4 Beispiele Ein paar Beispiele aus Öggl/Kofler. . . 4.4.1 Beispiel 1 Beispielhaftes erstes Dockerfile: Quellcode 1: Dockerfile nach Öggl/Kofler (S. 63) 1 # Datei Dockerfile 2 FROM ubuntu:18.04 3 LABEL maintainer "kontakt@kofler.info" 4 RUN apt -get update && \ 5 apt-get install -y joe && \ 6 apt-get clean && \ 7 rm -rf /var/lib/apt/lists/* 8 CMD ["/bin/bash"] Im Seminar analysieren - Wert legen auf Zusammenfassung für RUN mit && Konstruktion! 4.4.2 Beispiel 2 Beispiel für einfachen Webserver: Quellcode 2: Dockerfile für Webserver nach Öggl/Kofler (S. 69) 1 # Datei Dockerfile 2 FROM ubuntu:18.04 3 4 LABEL maintainer "kontakt@kofler.info" 5 LABEL description "Test" 6 7 # Apache installieren, und unnötige Dateien aus dem Paket - Cache 8 # gleich wieder entfernen 9 RUN apt-get update && \ 10 apt-get install -y apache2 && \ 11 apt-get -y clean && \ 12 rm -rf /var/cache/apt /var/lib/apt/lists/* 13 14 # HTTPS -Unterstützung aktivieren 15 RUN a2ensite default-ssl && a2enmod ssl (Fortsetzung auf der nächsten Seite) 4.4. Beispiele 23
Docker Seminare, Release 2.0-2020 (Fortsetzung der vorherigen Seite) 16 17 ENV APACHE_RUN_USER=www-data \ 18 APACHE_RUN_GROUP=www-data \ 19 APACHE_LOG_DIR=/var/log/apache2 20 21 EXPOSE 80 443 22 23 # gesamten Inhalt des Projektverzeichnisses 24 # samplesite nach /var/www/html kopieren 25 COPY samplesite/ /var/www/html 26 27 CMD ["/usr/sbin/apache2ctl" , "-D" , "FOREGROUND"] 4.4.3 Beispiel 3 Alpine Linux mit Apache2 Hier sind wir durch Recherchen zu Alpine Linux und diversen Dockerfile Analysen herausgefordert worden (Anm.: Apache als Prozess am Laufen halten im Container!) Quellcode 3: Dockerfile für Alpine Linux mit Apache2 1 FROM alpine 2 3 LABEL maintainer "dummy@aol.com" 4 LABEL description "Test Alpine und Apache" 5 6 7 RUN apk update && apk upgrade && \ 8 apk add apache2 libxml2-dev apache2-utils && \ 9 rm -rf /var/cache/apk/* 10 11 # war zwischendurch nötig: 12 # RUN mkdir /run/apache2 13 14 ENV APACHE_RUN_USER=apache \ 15 APACHE_RUN_GROUP=www-data 16 17 EXPOSE 80 443 18 19 COPY samplesite/ /var/www/localhost/htdocs 20 21 CMD ["/usr/sbin/httpd", "-DFOREGROUND"] 4.4.4 Beispiel 4 Als ausführlicheres Dockerfile-Beispiel liefern Öggl/Kofler für „Pandoc“: Quellcode 4: Dockerfile pandoc Installationen nach Öggl/Kofler (S. 73ff.) 1 # Datei Dockerfile 2 FROM haskell (Fortsetzung auf der nächsten Seite) 24 Kapitel 4. Dockerfile
Docker Seminare, Release 2.0-2020 (Fortsetzung der vorherigen Seite) 3 4 # Pakete installieren 5 RUN apt-get update -y && \ 6 apt-get install -y -o Acquire::Retries=10 \ 7 --no-install-recommends \ 8 texlive-latex-recommended \ 9 texlive-latex-extra \ 10 texlive-fonts-recommended \ 11 texlive-lang-german \ 12 texlive-pstricks \ 13 imagemagick \ 14 unzip \ 15 python3 \ 16 ghostscript \ 17 less && \ 18 apt-get clean && \ 19 rm -rf /var/lib/apt/lists/* 20 21 # Pandoc installieren 22 RUN cabal update && \ 23 cabal install pandoc-2.1.1 && \ 24 ln -s /root/.cabal/bin/pandoc /usr/bin/pandoc 25 26 # Mitteleuropäische Zeitzone 27 # (siehe https://serverfault.com/questions/683605) 28 RUN cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime 29 30 # Fonts für LaTeX installieren 31 # ADD rheinwerkfonts.tgz /usr/local/share/texmf 32 # RUN texhash 33 34 # Volume /data, bei docker run mit dem Arbeitsverzeichnis 35 # verbinden, also: docker run -v $(pwd):/data 36 WORKDIR /data 37 VOLUME ["/data"] 38 39 ENTRYPOINT ["/bin/bash"] Die Kollegen richten also - wie ich mit SphinxDoc - eine Umgebung ein, in der sie mit Hilfe von Markdown und dem Werkzeug pandoc dann HTML als auch LaTeX-Versionen für Print/PDF generieren können. 4.4. Beispiele 25
Docker Seminare, Release 2.0-2020 26 Kapitel 4. Dockerfile
KAPITEL 5 Docker Kommandos Auflistung von Docker Befehlen: Docker Befehle23 Wir haben schon einigen Docker CLI Kommandos genutzt. Jetzt sollen komplettere Aufstellungen folgen. Die Aufrufe sind nach Kategorien gegliedert. Die Aufrufe lassen sich teilweise in langer und kurzer Schreibung auf- rufen: docker container ps -a # oder auch kürzer docker ps -a Das hat auch mit historischen Entwicklungen innerhalb der Docker-Versionen zu tun! Eine neue und saubere Komma- nostruktur wurde mit Version 1.13 eingeführt. Tipp: Paket docker-bash-completion in der Shell nutzen: also fleißig mit Tab-Tab vervollständigen! Wir beginnen aber wie immer mit der eingebauten Hilfe. . . 5.1 docker help Onlineportal für Docker CLI: https://docs.docker.com/engine/reference/commandline/cli/ Tipp: Die Befehle (z.B. docker events) lassen sich einfach in URL an Stelle von cli ersetzen! Und natürlich kann man auch jederzeit mal die interaktive Docker Hilfe nutzen. 23 https://docs.docker.com/engine/reference/commandline/docker/ 27
Docker Seminare, Release 2.0-2020 Quellcode 1: docker help (teilweise Zeilen gekürzt) 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 (Fortsetzung auf der nächsten Seite) 28 Kapitel 5. Docker Kommandos
Docker Seminare, Release 2.0-2020 (Fortsetzung der vorherigen Seite) 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: Quellcode 2: 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 wurden auch klassische Man-Pages für die docker-Kommandos implementiert, die man einfach über mit „-“ (Bindestrich) zusammengesetzte Aufrufe erhält: man docker-start 5.1. docker help 29
Docker Seminare, Release 2.0-2020 5.2 docker Allgemeine Docker Kommandos: Kommandos Funktionalität docker container . . . Hauptbefehl: Container verwalten docker events laufend (!) Aktionen des Docker-Systems anzeigen docker info Status Docker-System docker image . . . Hauptbefehl: Images verwalten docker login/logout am Docker-Account an-/abmelden docker network . . . Hauptbefehl: Docker-Networking verwalten docker node . . . Haupbefehl: Docker Swarm Knoten verwalten docker search Images (unter docker.io) suchen docker secret . . . Hauptbefehl: Secrets für Services docker service . . . Hauptbefehl: Services verwalten (siehe Cluster) docker stack . . . Hauptbefehl: Stack (Gruppe von Services) verwalten docker stats laufend (!) CPU, MEM anzeigen lassen docker swarm . . . Haupbefehl: Swarm einrichten / verwalten docker system . . . Haupbefehl: Infos zu Docker System docker version Docker Version(en) anzeigen lassen docker volume . . . Hauptbefehl: Volumes verwalten Es folgen ein paar individuelle Anmerkungen zu einzelnen docker-Kommandos. docker events Eine laufende Konsole - also gerne wieder mit mehreren Terminalfenstern arbeiten (siehe Tilix). # Alle Events in einem bestimmten Zeitraum: docker events --since '2019-01-01' --until '2019-01-10' # in den letzten 50 Minuten docker events --since '50m' # für ein bestimmtes Image (oder auch 'container=...') docker events --since '40m' --filter 'image=alpine' # Event types filtern: docker events --since '2019-01-01' --filter 'container=alpinejoeb' --filter ˓→'event=start' Die Ausgaben können formatiert (Parameter --format) ausgegeben werden (auch JSON). Anm.: Linux Kernel verteilen Privilegien (Capabilities) Hier: Docker Prozess im Host finden und CapEff finden: cat /proc/PID/status | grep CapEff Die Hex-Kodierung CapEff des Prozesse analyisieren: capsh --decode= Tools capsh in Paket libcap-progs (Suse) oder libcap (CentOS). docker info Die Infos zum laufenden Docker-System. Die Anzahl der laufenden Container anzeigen mit docker info | grep Running. docker search Einfache Suche: docker search ubuntu Anzahl Images (hier: ubuntu): docker search ubuntu | grep "\/ubuntu\ " | wc -l 30 Kapitel 5. Docker Kommandos
Docker Seminare, Release 2.0-2020 Filtern: docker search --filter=stars=7 --filter=is-official=true ubuntu docker stats Entspricht dem Linux-Klassiker top für die Shell. docker system Speichernutzung anzeigen lassen mit docker system df Aufräumen / „Echt Alles ;-) Tabularasa“ mit ‘‘ docker system prune‘‘ (--all --force) docker network . . . Hauptbefehl für Docker-Networking (siehe auch wieder docker network --help) Kurze Befehlsliste: docker network ... • create (Netzwerk erstellen) • connect • inspect • ls (Netzwerke auflisten) • prune (ungenutzte Netzwerke löschen; siehe docker-compose) Online: Infoseite Docker Networking24 5.3 docker image Docker Kommandos für Images: Kommandos Funktionalität docker image . . . Hauptbefehl: Images verwalten docker build neues Image mit Dockerfile docker images Images auflisten: docker image ls docker history Build-History eines Images docker inspect lokale Images analysieren docker pull Image herunterladen / aktualisieren docker push Image in Docker Repo hochladen docker rmi Image löschen docker save / load aus Images einen Tarball erzeugen docker tag Image-Namen bzw. -Tag anpassen docker pull Wenn nur ein Imagename angegeben wird, dann wird das Image mit Tag :latest gepullt! Images mit Tag:latest müssen nicht immer die aktuellsten Images sein! Kompletter Aufruf: docker pull [OPTIONS] REGISTRY:REG-PORT/IMAGE:TAG|@DIGEST Optionen: -a | --all-tags um alle Images(:tags) mit einem Imagenamen zu pullen (gesamtes Image- Repository) docker images oder auch docker image ls Mit Option --no-trunc komplettere Ausgaben und -q für quiet, was einfach die (kurzen) IDs ausgibt! 24 https://docs.docker.com/network/ 5.3. docker image 31
Docker Seminare, Release 2.0-2020 Alle Images auflisten: docker images -a REPOSITORY TAG IMAGE ID CREATED ˓→ SIZE mariadb 2bdd97ca79d9 6 days ago ˓→ 366MB joebrandes/testwebserver latest 9ff70d3871d4 7 days ago ˓→ 183MB 7c54877665f7 7 days ago ˓→ 183MB 6a247201e8a3 7 days ago ˓→ 183MB aef9419d7b92 7 days ago ˓→ 183MB c21c0c4fe351 7 days ago ˓→ 183MB a3ff1c7635da 7 days ago ˓→ 183MB 2bd50cd1f5b1 7 days ago ˓→ 86.7MB 86e536f3da5c 7 days ago ˓→ 86.7MB hello-world latest fce289e99eb9 2 weeks ago ˓→ 1.84kB wordpress latest 9ec2fcdda9ef 2 weeks ago ˓→ 420MB mariadb latest 4f2e75647d2a 2 weeks ago ˓→ 366MB ubuntu 18.10 d4452947e3fa 2 weeks ago ˓→ 73.7MB ubuntu 18.04 1d9c17228a9e 2 weeks ago ˓→ 86.7MB alpine latest 3f53bb00af94 3 weeks ago ˓→ 4.41MB Die hier aufgelisteten none:none Images enstehen durch das Layersystem von Images und belegen und verschwen- den keinen Platz im System! Problematisch sind Image die mit none:none bei normalem docker images (ohne -a) auftauchen: Dangling Images - verwaiste Einträge Finden von Dangling Images: docker images -f "dangling=true" Löschen / Aufräumen: per Filtern oder mit docker image prune docker images -f "dangling=true" -q | xargs -n1 docker rmi -f # oder einfach mit: docker image prune docker inspect oder auch docker image inspect Formatierte Ausgaben mit Parameter --format docker inspect --format='{{.Config.Cmd}}' alpine:latest [/bin/sh] # oder einfacher mit: docker inspect alpine:latest | grep -i Cmd 32 Kapitel 5. Docker Kommandos
Docker Seminare, Release 2.0-2020 Das lässt sich auch wieder aufbereiten (Tool jq): docker image inspect alpine:latest | jq -CS # C Color; S ˓→sortiert docker image inspect alpine:latest | jq -CS .[0].Config.Cmd # Zugriff auf Array [ "/bin/sh" ] Die Ausgabe von Docker Kommandos ist auch über Go-Templates möglich: (Go Templates25 ) 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" ] Diese Ausgabeformate lassen sich auch bei anderen cmd-Techniken nutzen (siehe docker container ls ...). docker save | load Speichert Images in einem Tarball - nicht mit dem Export / Import von Containern verwechseln docker save -o ~/alpine-out.tar alpine tar -tvf alpine-out.tar -rw-r--r-- 0/0 1511 2018-12-21 01:21 3f53bb00af943dfdf81...129d57d5991.json drwxr-xr-x 0/0 0 2018-12-21 01:21 a21b1050952cdc06771...57cae64904b/ -rw-r--r-- 0/0 3 2018-12-21 01:21 a21b1050952cdc06771...57cae64904b/ ˓→VERSION -rw-r--r-- 0/0 1184 2018-12-21 01:21 a21b1050952cdc06771...57cae64904b/json -rw-r--r-- 0/0 4672000 2018-12-21 01:21 a21b1050952cdc06771...57cae64904b/ ˓→layer.tar -rw-r--r-- 0/0 202 1970-01-01 01:00 manifest.json -rw-r--r-- 0/0 89 1970-01-01 01:00 repositories In layer.tar befindet sich das eigentliche Image mit den Ordnerstrukturen /, /bin, /usr, . . . Diese Sicherung lässt sich dann auf einem anderen Rechner wieder loaden. 5.4 docker container Docker Kommandos für Container: 25 https://golang.org/pkg/text/template/ 5.4. docker container 33
Docker Seminare, Release 2.0-2020 Kommandos Funktionalität docker container . . . Hauptbefehl: Container verwalten docker attach I/O eines Containers mit Terminal connecten docker commit neues Image aus Container docker cp Kopieren von Daten zwischen Container Host docker create Container erzeugen, aber nicht starten docker diff veränderte Dateien eines Containers erzeugen docker exec Kommando in laufendem Container ausführen docker export Container in Archiv speichern docker import Container aus Archiv erzeugen docker inspect Konfiguration und Status eines Containers docker kill Container sofort beenden docker logs Container-Loggings docker pause/unpause Container anhalten/fortsetzen docker port Container Ports auflisten docker ps Container auflisten docker rename Container umbenennen docker restart Container neu starten docker rm Container löschen docker run neuen Container erzeugen und starten docker start Container starten docker stop Container anhalten docker top Container Prozesse anzeigen docker update Container Optionen anpassen docker wait Container Ende erwarten docker attach Auf Container die man mit docker run -it oder docker start -a -i gestartet hat, kann man ja über die interaktive Konsole zugreifen. Andernfalls kann man mit docker attach diese Funktionalität nachholen. docker commit Man sollte besser über Dockerfile und Builds arbeiten, weil sonst die Aufbauten der Images nicht mehr nachvollziehbar sind! docker cp Manuelle Kopieren von Daten zwischen Container und Host, was normaler Weise automatisch beim Erzeugen von Images genutzt wird. echo "Testing" > /tmp/testdatei docker start alpinejoeb docker container cp /tmp/testdatei alpinejoeb:/ docker exec alpinejoeb cat /testdatei docker stop alpinejoeb docker diff Abweichungen zwischen Container und ursprünglichem Image auflisten. • A (added - hinzugefügt) • C (changed - geändert) • D (deleted - gelöscht) 34 Kapitel 5. Docker Kommandos
Docker Seminare, Release 2.0-2020 docker exec Befehle in einem laufenden Contaier aufrufen. Der Container muss aktiv sein / laufen. Wird eine Shell im exec benutzt und mit exit verlassen, dann läuft der Container weiter! docker export Beim Exportieren eines Containers werden alle Layer zusammengefasst! Man spricht vom flatten für Image Layer. Das ist beim docker save | load für Images gänzlich anders. Anm.: Daten in Volumes werden nicht berücksichtigt! docker images Bitte auf Plural achten! Tipp: docker images -q listet nur die IDs auf und kann somit gut zum Pipeling für andere Docker-Aufrufe genutzt werden! docker inspect Arbeitet mit Images und Containern und erzeugt Infos im JSON-Format. JSON anzeigen: Quellcode 3: docker inspect -s mariadb-test5 ... ... { "Id": "cd42b1a7c4542f76174f936e5a2060f1f87e3511d3fe5e07bb27e15a1ca74ea5", "Created": "2019-01-06T19:56:47.958915783Z", "Path": "docker-entrypoint.sh", "Args": [ "mysqld" ], "State": { "Status": "exited", "Running": false, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 0, "ExitCode": 0, "Error": "", "StartedAt": "2019-01-06T19:56:48.881461371Z", "FinishedAt": "2019-01-06T20:15:04.192413984Z" }, ... ... Analyse über Parameter -f (format) docker inspect -s -f "{{.State.Status}}" mariadb-test5 docker inspect -s -f "{{.State.FinishedAt}}" mariadb-test5 docker ps (kurz für: docker container ps) Filterung mit Kriterium: -f Filterungs-Schalter aus Hilfen zu den Tools docker-ps bzw. docker-container-ls|ps 5.4. docker container 35
Docker Seminare, Release 2.0-2020 Filter output based on these conditions: - ancestor=([:tag]|| image@digest ) containers created from an image or a descendant. - before=(|) - expose=([/]|/[]) - exited= an exit code of - health=(starting|healthy|unhealthy|none) - id= a container's ID - isolation=(default|process|hyperv) (Windows daemon only) - is-task=(true|false) - label= or label== - name= a container's name - network=(|) - publish=([/]|/[]) - since=(|) - status=(created|restarting|removing|running|paused|exited) - volume=(|) Formatierte / tabellarische Ausgaben mit Schalter --format: docker container ls -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Labels}}" docker container ls -a --format '{{printf "%-30s%-30s" .Names .RunningFor}}' # auch hier wieder JSON Formatierung möglich: docker container ls -a --format '{{json . }}' | jq Formatierungs-Schalter (siehe Go-Templates) gerne wieder per Hilfen zu den Tools docker-ps bzw. docker-container-ls|ps Valid placeholders for the Go template are listed below: - .ID - Container ID. - .Image - Image ID. - .Command - Quoted command. - .CreatedAt - Time when the container was created. - .RunningFor - Elapsed time since the container was started. - .Ports - Exposed ports. - .Status - Container status. - .Size - Container disk size. - .Names - Container names. - .Labels - All labels assigned to the container. - .Label - Value of a specific label for this container. For example '{{.Label "com.docker.swarm.cpu"}}'. - .Mounts - Names of the volumes mounted in this container. - .Networks - Names of the networks attached to this container. Exit Status aus Aufruf docker container ps -a Die Nummern in Angabe Exited (#) von Spalte STATUS beziehen sich auf Exit-Meldungen beim Verlassen, stoppen oder killen eines Containers. Eigene Docker Exit Return Code: • 125 Docker Daemon hat Fehler • 126 Container Kommando kann nicht aufgerufen werden • 127 Container Kommando konnte nicht gefunden werden Ansonsten orientiert sich das Exit-Coding an 36 Kapitel 5. Docker Kommandos
Sie können auch lesen