Docker Seminare Release 2.0-2020 - Joe Brandes

Die Seite wird erstellt Kenneth Adler
 
WEITER LESEN
Docker Seminare Release 2.0-2020 - Joe Brandes
Docker Seminare
    Release 2.0-2020

        Joe Brandes

             06.02.2020
Docker Seminare Release 2.0-2020 - Joe Brandes
Docker Seminare Release 2.0-2020 - Joe Brandes
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
Docker Seminare Release 2.0-2020 - Joe Brandes
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 - Joe Brandes
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
Docker Seminare Release 2.0-2020 - Joe Brandes
Docker Seminare, Release 2.0-2020

    Rendered 06.02.2020

2                                   Inhalte:
Docker Seminare Release 2.0-2020 - Joe Brandes
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 - Joe Brandes
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 - Joe Brandes
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 - Joe Brandes
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