7. Basis-Images

Für die meisten Docker-Umsetzungen werden erst einmal vorbereitete Images genutzt.

7.1. Übersicht

Alle bisher benutzten Images in allen Beispielen basieren auf Grund-Images.

Diese Basis-Images werden per Docker Registry in Form von Repositories bereitgehalten. Später wollen wir uns von der Docker Registry trennen und werden unsere eigenen Registrys betreiben wollen.

Die Suche nach vertrauensvollen Basis Images: Docker Registry

Offizielle Docker Basis-Images

Offizielle Docker Basis-Images

Mit der Registrierung auf dem Docker-Hub haben Sie Einblick in die automatisierten Sicherheitsüberprüfungen für die verschiedenen Images in einem Repository (Reiter Tags).

Docker Account - Tags

Docker Account - Tags - Sicherheitslücken

Oder natürlich mit der Docker CLI: Docker CLI Search

Beispielaufrufe:

docker search ubuntu                                # Images ubuntu suchen
docker search --filter "is-official=true" ubuntu    # offizielle Images Ubuntu
docker search --filter stars=10 debian              # min. 10 Sterne

Die offiziellen Images haben einen einfachen Namen: also alpine und nicht testcom/alpine!

Hier ein paar der offiziellen Images (Anzahl gesamt: 16; Stand: Jan 2019)

  • Scratch

    für das Imagen „FROM scratch“

  • Alpine

    Ein Imaga-Build from scratch mit kleinem Linux-rootfs-TAR - der aktuelle Docker Builds Liebling!

    Werden wir noch häufiger nutzen und bedarf einer weiteren Vertiefung, da es andere Administrationsmechanismen (z.B. Paketverwaltung) nutzt, als die Standard-Linux-OS.

  • CentOS

    Image des RED HAT Community OS

  • Debian

    Image Debian

  • Fedora

    Image des RED HAT Fedora OS

  • Ubuntu

    Image von Canonicals Ubuntu

  • Busybox

    The Swiss Army Knife of Embedded Linux

  • Bash

    … nur die Bash

  • Amazon Linux

    Amazon Linux is provided by Amazon Web Services (AWS)

Beachten: der Unterstrich in den Links für die offiziellen Images.

Hier mal eine kleine Übersicht über die gängigen Image-Größen:

Distribution

Docker Image Größe

Alpine Linux

ca. 4 MByte

CentOS 7

ca. 210 MByte

Debian 9 (Stretch)

ca. 100 MByte

Ubuntu 16.04 LTS

ca. 110 MByte

Ubuntu 18.04 LTS

ca. 80 MByte

7.2. Tags

Über Repositories in der Docker Registry können unterschiedliche Images bereitgestellt werden, die man über ihre Tags genauer bestimmt.

Beispielhaft Übersicht (online - Images Centos): https://hub.docker.com/_/centos?tab=tags

Anm.: auf dieser Übersicht sehen angemeldet Docker Hub User auch immer die Sicherheitsanalysieren zu den Images!

Das lässt sich auch in der Kommandozeile zaubern: (Anm.: Tool jq genutzt für lesbare Darstellung)

curl -sL https://index.docker.io/v1/repositories/library/centos/tags | jq '.[].name'

"latest"
"5"
"5.11"
"6"
"6.10"
"6.6"
"6.7"
"6.8"
"6.9"
"7"
"7.0.1406"
"7.1.1503"
"7.2.1511"
"7.3.1611"
"7.4.1708"
"7.5.1804"
"7.6.1810"
...

Für eigene Images gerne ein eigenes Präfix für die Images nutzen: joebrandes/alpine:15.0

7.3. Eigenes Basisimage

(s.a. Vertrauenswürdige Images)

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

Tarball

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

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

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

docker import opensuse.tar joebrandes/opensuse:42.3

Image-Erzeugung per Skript

Beispiel: YUM-Based mit Skript online

Oder über Moby-Project:

wget https://raw.githubusercontent.com/moby/moby/master/contrib/mkimage-yum.sh
bash mkimage-yum.sh joebrandes/centos

Debian / Ubuntu

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

Das Tool kann über das gleichnamige Paket installiert werden.

debootstrap --variant=minbase stretch ./rootfs

tar -C ./rootfs -c . | docker import - joebrandes/debian:9

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

7.4. Alpine Linux

Für das Linux zeichnet die Firma Gliderlabs verantwortlich.

Quellen:

Technisches:

  • als C-Standardbibliothek wird musl statt glibc genutzt

    das stellt häufig ein Problem bei zu kompilierenden Programmen dar

    einfachere Auswertung von /etc/resolv.conf (keine domain und search Beachtung)

    es existiert für Alpine Linux optimierte glibc (pkg-glibc )

  • als Init-System wird OpenRC statt systemd oder sysv-init genutzt

    erinnert eher als klassisches init-System und arbeitet mit /etc/inittab

    Wichtig: OpenRC ist installiert! Arbeitet aber nicht! S.a. Logging (rsyslog nachinst.)

  • Linux Kommandos stammen von BusyBox

Alpine Linux lässt sich schnell ausprobieren: docker run -it -h alpine --name alpine alpine

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

Container-Analyse (in separater Shell natürlich): docker ps -s (Größen anzeigen)

zeigt einen nur wenige Bytes großen Container, was normal ist für frisch erstellte Container.

7.4.1. Shell

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

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

apk add --update bash bash-completion

7.4.2. BusyBox

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

Siehe: ls /bin /sbin -l

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

7.4.3. Hilfen / Dokumentation

Es gibt keine man-Pages oder den Pager less!

Nachinstallation möglich mit:

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

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

Hilfe zu diesen Topics: Alpine Doku

7.4.4. Paketverwaltung apk

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

Kommando

Funktion

apk add <paketname>

installiert Pakete

apk del <paketname>

entfernt Paket

apk info (<paketname>)

listet installierte Pakete auf (auch mit -L und --who-owns)

apk search <paketname>

sucht Paket in Paketquellen

apk stats

zeigt Anzahl Pakete

apk update

zeigt, welche Pakete aktualisierbar sind

apk upgrade

aktualisiert Pakete

Paket in Roh-Alpine: apk info | sort

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

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

Tipp

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

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

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

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