Habt ihr euch schon mal gefragt, wie so ein Docker-Image mit einem Basissystem installiert wird?
Ich habe mir diese Frage gestellt und eine Antwort darauf gefunden.

Wie so etwas funktionieren kann, zeige ich euch hier am Beispiel einer CentOS7 Minimalinstallation.

Die Minimalinstallation erstellen wir auf einem CentOS7 Sytem.
Wenn ihr das nicht zu Hand habt, könnt ihr euch einfach eine CentOS7-Minimalinstallion in einer VM selber machen, oder ein fertiges Image mit einer CentOS7-Minimalinstallation verwenden. Da wir das Image für eine Docker-Installation nutzen wollen, bietet sich dafür z.B. das CentOS Image vom Docker Hub an.

Wir starten ein root-Terminal, erstellen das Installationsverzeichnis und packen das gleich in eine Variable.

export centos_root="${HOME}/centos_image/rootdir"
mkdir -p $centos_root
cd $centos_root/..

Damit wir später auch weitere Pakete installieren können, brauchen wir die Repository Dateien, die wir einfach per yum herunterladen können .

yum reinstall --downloadonly --downloaddir . centos-release

Dann erstellen wir eine leere RPM-DB und installieren die CentOS Repositories.

rpm --root $centos_root --initdb
rpm --root $centos_root -ivh centos-release*.rpm --nodeps
rpm --root $centos_root --import  $centos_root/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

Als nächstes installieren wir uns ein englischsprachiges yum und verzichten dabei auf die Dokumentation. Dabei werden dann auch einige Pakete mit installiert, die wir für unser Minimalsystem später brauchen.

yum -y --installroot=$centos_root --setopt=tsflags='nodocs' --setopt=override_install_langs=en_US.utf8 install yum

Dann ändern wir die yum-Konfiguration, so das yum als Standardsprache immer en.US verwendet und keine Dokumentation installiert.

sed -i "/distroverpkg=centos-release/a override_install_langs=en_US.utf8\ntsflags=nodocs" $centos_root/etc/yum.conf

Jetzt können wir mit chroot in unsere neue Umgebung wechseln und dort die letzten Abhängigkeiten installieren.
Dazu leihen wir uns die resolv.conf unseres Wirtssystems und starten dann eine chroot Umgebung. In dieser erstellen wir als erstes 2 Device-Nodes, die yum für die Zertifikatsüberprüfung braucht und installieren dann 2 weitere Paket procps-ng iputils inklusiver ihrer Abhängigkeiten.

# chroot to the environment and install some additional tools
cp /etc/resolv.conf $centos_root/etc
chroot $centos_root /bin/bash <<EOF
mknod -m 666 /dev/random c 1 8
mknod -m 666 /dev/urandom c 1 9
yum install -y procps-ng iputils
yum clean all
EOF
rm -f $centos_root/etc/resolv.conf

Zuletzt räumen wir auf und löschen nicht benötige Dateien.

rm -rf $centos_root/var/lib/yum/*
rpm --root $centos_root --rebuilddb

Damit haben wir jetzt unsere CentOS7 Minimalinstallation fertig gestellt und können die verwenden.

Ich möchte daraus ein Docker-Image erstellen, das ich als Grundlage für meine eigenen Docker-Images verwenden kann.

tar -C $centos_root -c . | docker import - centos

Anschließend schauen wir uns unser neues Image an.

docker images

Ergebnis:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              52b9bd2be19c        1 minute ago        190 MB

Unser Image ist sogar etwas kleiner, als das offizielle CentOS-Image.

Jetzt können wir unser neu erstelltes Image testen.

docker run --rm centos cat /etc/redhat-release

Wenn ihr kein Docker verwenden wollt, könnt ihr euer Minimalsystem auch einfach mit systemd-nspawn verwenden.
Das erfüllt den gleichen Zweck und funktioniert auf Systemen mit systemd, ohne zusätzliche Software.

systemd-nspawn -D $centos_root /bin/bash

Previous Post Next Post