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:
- Installiere Debian Jessie in ein lokales Verzeichnis
debootstrap --variant=minbase jessie ./jessie-minbase http://ftp.debian.org/debian/
- Importiere dieses Verzeichnis als neues Image in Docker
tar -C jessie-minbase -c . | docker import - jessie-minbase
- 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örterminbase
, was nur wesentliche Pakete undapt
beinhaltet.buildd
installiert diebuild-essential
-Pakete in Ihr Zielverzeichnis.fakechroot
installiert die Pakete ohne Root-Rechte.
Schließlich gibt es die Variantescratchbox
, mit der Ziele für die Verwendung vonscratchbox
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 einehttp://
,file:///
oderssh:///
URL sein. Sie muss vondebootstrap
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 nachstdout
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: