Teil 1: Docker images from scratch

Teil 1: Docker images from scratch

Diese Artikel-Serie für Anfänger zeigt dir im ersten von vier Teilen, wie man ein Docker-Image mit debootstrap und tar erstellt.

Fork me on GitHub

Meine Dockerfile Beispiele sind auch auf GitHub verfügbar:
https://github.com/sam6-de/docker-from-scratch

Bevor wir anfangen

Wenn du nur Interesse daran hast, meine Beispiel-Dockerdateien auszuführen oder zu ändern, ist das natürlich auch ohne weiteres möglich.

Ein Wort der Warnung: ich werde mich nicht darum kümmern, fehlerfreie oder sicherheitsrelevante Images in einem meiner frei verfügbaren Repositories anzubieten.

Mein Ziel ist es, dir einige grundlegende Ideen zu vermitteln, wie Docker und Docker-Images funktionieren.

Vorbereitung

Mein Test-Setup besteht aus:

Quickstart

Ein einfaches, selbst gebautes Docker-Image kannst du in nur drei Schritten vorbereiten und ausführen:

  1. Installiere Debian Jessie in ein lokales Verzeichnis
    debootstrap --variant=minbase jessie ./jessie-minbase http://ftp.debian.org/debian/
  2. Importiere dieses Verzeichnis als neues Image in Docker
    tar -C jessie-minbase -c . | docker import - jessie-minbase
  3. Starte dein eigenes Docker Image (und gib in diesem Beispiel die Debian-Version aus)
    docker run jessie-minbase cat /etc/debian_version

Das war’s schon!

Technischer Hintergrund

Debian Jessie in einem Verzeichnis installieren

Es ist sehr einfach, ein beliebiges Debian-basiertes System in einem Ordner zu installieren.
Man kann sogar ein chroot in diesem Verzeichnis ausführen. Das ist z.B. hilfeich, um einige Pakete installieren, Konfigurationsdateien ändern oder was auch immer du tun möchtest.
Diese Änderungen werden später Teil des Docker-Images, wenn es anschließend importiert wird.

So weit, so cool. Aber: Wir werden in ein paar Minuten ein paar viel abgefahrenere Sachen machen!

Lass‘ uns zunächst einen Blick darauf werfen, was die einzelnen Parameter bewirken:

debootstrap --variant=minbase jessie ./jessie-minbase http://ftp.debian.org/debian/
  • debootstrap ist der Aufruf des Debian-Bootstrapping-Tools
  • --variant = minbase: Name der zu verwendenden Bootstrap-Skriptvariante. Gegenwärtig sind die unterstützten Schlüsselwörter
    minbase, was nur wesentliche Pakete und apt beinhaltet.
    buildd installiert die build-essential -Pakete in Ihr Zielverzeichnis.
    fakechroot installiert die Pakete ohne Root-Rechte.
    Schließlich gibt es die Variante scratchbox, mit der Ziele für die Verwendung von scratchbox erstellt werden.
    Standardmäßig wird ohne das Argument --variant=XYZ eine Basis-Debian-Installation im Zielordner erstellt.
  • jessie ist der Name der Suite. Die Suite kann ein Release-Code-Name
    (z. B. sid, wheezy, squeeze, lenny) oder ein symbolischer Name
    (z. B. unstable, testing, stable, oldstable) sein.
  • . / jessie-minbase zeigt auf Ihren Zielordner, in dem das Debian-System installiert ist.
  • http://ftp.debian.org/debian/ gibt den Spiegel an, der während des Installationsprozesses und auf Ihrem Computer verwendet werden soll. Der Mirror kann eine http://, file:/// oder ssh:/// URL sein. Sie muss von debootstrap erreicht werden können.
    Du kannst auch einen anderen Mirror auswählen (z. B. http://ftp.de.debian.org/debian).

debootstrap Beispiel-Ausgabe der Konsole

Dies hier ist eine gekürzte Ausgabe des oben gezeigten Befehls:

me@mydebianbox:~/docker# debootstrap --variant=minbase jessie ./jessie-minbase http://ftp.debian.org/debian/
 I: Retrieving Release
 I: Retrieving Release.gpg
 I: Checking Release signature
 I: Valid Release signature (key id 75DDC3C4A499F1A18CB5F3C8CBF8D6FD518E17E1)
 I: Retrieving Packages
 I: Validating Packages
 I: Resolving dependencies of required packages...
 I: Resolving dependencies of base packages...
 I: Found additional required dependencies: acl adduser dmsetup insserv libaudit-common libaudit1 libbz2-1.0 libcap2 libcap2-bin libcryptsetup4 libdb5.3 libdebconfclient0 libdevmapper1.02.1 libgcrypt20 libgpg-error0 libkmod2 libncursesw5 libprocps3 libsemanage-common libsemanage1 libslang2 libsystemd0 libudev1 libustr-1.0-1 procps systemd systemd-sysv udev
 I: Found additional base dependencies: debian-archive-keyring gnupg gpgv libapt-pkg4.12 libreadline6 libstdc++6 libusb-0.1-4 readline-common
 I: Checking component main on http://ftp.debian.org/debian...
 I: Retrieving acl 2.2.52-2
 I: Validating acl 2.2.52-2 [...]
 I: Retrieving zlib1g 1:1.2.8.dfsg-2+b1
 I: Validating zlib1g 1:1.2.8.dfsg-2+b1
 I: Chosen extractor for .deb packages: dpkg-deb
 I: Extracting acl... [...]
 I: Extracting zlib1g...
 I: Installing core packages...
 I: Unpacking required packages...
 I: Unpacking acl... [...]
 I: Unpacking zlib1g:amd64...
 I: Configuring required packages...
 I: Configuring gcc-4.8-base:amd64... [...]
 I: Configuring libc-bin...
 I: Unpacking the base system...
 I: Unpacking apt... [...]
 I: Unpacking readline-common...
 I: Configuring the base system...
 I: Configuring readline-common... [...]
 I: Configuring libc-bin...
 I: Base system installed successfully. 
me@mydebianbox:~/docker#

TAR Datei als Image

Das Tool tar wird verwendet, um ein Archiv zu erstellen. In unserem Fall ein temporäres Archiv unseres Installationsordners.
Der Tarball kann einfach als Docker-Image importiert werden:

tar -C jessie-minbase -c . | docker import - jessie-minbase
  • tar: Dieses Tool speichert viele Dateien zusammen in einem einzigen Archiv. Es kann einzelne Dateien aus dem Archiv wiederherstellen.
  • -C jessie-minbase: Wechselt in das Verzeichnisjessie-minbase und verwendet es als Quellordner.
  • -c .: Erstellt ein neues Archiv und verwendet ., d. h. den aktuellen Ordner als Quelle.
  • | leitet die Ausgabe an den nächsten Befehl weiter.
  • docker import startet das Import-Tool von Docker.
  • - weist Docker an, von der Befehlszeile aus zu lesen.
  • jessie-minbase ist der Name des erstellten Docker-Images.
    Man muss zwar nicht denselben Namen wie den des Ordners wählen, Ich finde es aber einfacher. So kann man leichter erkennen, woher das Image stammt.
    Natürlich ist das aber euch überlassen, an dieser Stelle einen anderen Namen zu wählen.

docker import Beispiel-Ausgabe der Konsole

Dies hier ist die komplette Ausgabe des gerade beschriebenen Befehls. Im Gegensatz zum ersten Schritt ist die Ausgabe des Imports sehr kurz und besteht nur aus einer Zeile:

me@mydebianbox:~/docker# tar -C jessie-minbase -c . | docker import - jessie-minbase
ea3ac0df773d3cba1dc4901938d436b37acf0663dc7287a3ed1dd3a87b9ff8f2
me@mydebianbox:~/docker#

Starten des Containers

Jetzt ist die „harte“ Arbeit schon getan.
Debian wurde erfolgreich in einem Ordner installiert, wir haben ein temporäres Archiv dieses Ordners erstellt. Das wiederum haben wir als neues Image in Docker importiert.
Auf den ersten Blick ist ja schon mal alles gut gelaufen. Probieren wir also aus, das Image zu starten:

docker run jessie-minbase cat /etc/debian_version
  • docker run führt einen Befehl in einem neuen Container aus.
  • jessie-minbase ist der Name des Images, das wir in den obigen Schritten erstellt haben.
  • cat /etc/debian_version ist der Befehl, der im Container ausgeführt werden soll.
    In diesem Beispiel wird die Debian-Version des Containers nach stdout geschrieben

docker run Beispiel-Ausgabe der Konsole

Wie erwartet haben wir ein Debian Jessie-Image in Version 8.3 erstellt:

me@mydebianbox:~/docker# docker run jessie-minbase cat /etc/debian_version
8.3
me@mydebianbox:~/docker#

Die ausgegebene Version kann von deiner abweichen. Vermutlich hat Debian zwischenzeitlich eine neuere Version von jessie veröffentlicht.

Einfach cool, oder?

Im nächsten Teil sehen wir uns an, wie wir unser eigenes Image anderen öffentlich zugänglich machen können.


Die anderen Teile dieser Artikel-Serie erreichst du hier:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.