Auf einem CentOS7 system lässt sich Docker mit BTRFS oder LVM als Storage Backend einsetzen.
Leider hat RedHat für die nächste Version bereits angeküdigt, BTRFS nicht mehr unterstützen zu wollen. Was ich sehr schade finde, denn Docker funktioniert mit einem BTRFS Storage Backend bei mir sehr gut.

Mit Blick auf die nächste CentOS Version ist deshalb LVM für Produktivsysteme die sicherere Wahl.

Den Devicemapper mit loopback-File oder das OverlayFS sollten wir im Produktivbetrieb nicht verwenden.

Hier soll es darum gehen, wie wir LVM mit Docker nutzen können.

Bei der normalen Partitionierung, teilen wird eine Volume Group (VG) in ein oder mehrere Partitionen (LV) mit einer festen Größe aufgeteilt.
Benötigen wir in einer Partition mehr Platz, müssen wir diese vergrössern, was meistens mit einigem Aufwand verbunden ist.

Beispiel:
Haben wir 100GB Platz in der VG lassen sich darauf 5 LV mit jeweils 20GB anlegen.

Beim Thin Provisioning erstellen wir keine klassischen Partitionen, sondern logische Partitionen, die auch eine bestimmte Größe haben, aber erst mal keinen Platz in der Volume Group belegen. Erst wenn Daten in der Partition gespeichert werden, wird der Platz belegt. Dadurch können wir fast beliebig viele Partitionen anlegen und nutzen, solange diese zusammen nur so viel Platz verwenden, wie in der VG vorhanden ist.

Beispiel:
In unserer 100GB VG können wir jetzt 10 LV mit jeweils 20GB anlegen. Das funktioniert, solange auf jedem LV nur 10GB Daten gespeichert werden.

Wir haben also mehrere Partitionen mit insgesamt 200GB Größe auf einem nur 100GB großen Speicher angelegt.
Das bezeichnet man als Overprovisioning (überbuchen).

In diesem Beispiel gehe ich davon aus, das wir den Pool für Docker auf einem eigenen Laufwerk /dev/sdc1 erstellen.

Als erstes legen wir ein Physical Volume (PV) an. Damit weiß LVM, welchen Platz er auf der Festplatte nutzen darf.

pvcreate /dev/sdc1
pvdisplay  -m

Haben wir mehrere Festplatten, müssen wir den Vorgang bei allen wiederholen.

Dann legen wir eine Volume Group (VG) an.
Eine VG kann dabei mehrere PV verwenden. Es lassen sich jederzeit PV zu einer VG hinzufügen oder entfernen.

Wir erstellen hier eine VG mit dem Namen "docker-storage" auf unserem PV.

vgcreate docker-storage /dev/sdc1

In dieser Volume Group (VG) erstellen wir 2 Logical Volumes (LV). Die wir anschließend in einen Thin-Pool konvertieren.

lvcreate -n docker-pool -L 2G docker-storage
lvcreate -n docker-poolmeta -L 500M docker-storage
lvconvert --type thin-pool --poolmetadata docker-storage/docker-poolmeta docker-storage/docker-pool

Jetzt können wir Docker mit unserem Thin-Pool konfigurieren.

Als erstes installieren wir Docker mit allen Modulen.

dnf install docker-lvm-plugin docker-logrotate docker-registry docker-forward-journald docker-compose

War Docker bereits installiert, müssen wir jetzt die alte Storage Konfiguration löschen.

Es werden alle Docker Container und Images gelöscht und müssen neu angelegt werden.

systemctl stop docker
systemctl stop docker-storage-setup

rm -f /etc/sysconfig/docker-storage
rm -rf /var/lib/docker/*

Jetzt konfigurieren wir unseren neuen Docker-Storage.

cat <<EOF > /etc/sysconfig/docker-storage-setup
STORAGE_DRIVER=devicemapper
VG=docker-storage
EOF

Und starten als letztes Docker.

systemctl start docker-storage-setup.service
systemctl start docker.service

Und können dann überprüfen, das Docker mit dem richtigen Storage arbeitet.

 docker info

Ausgabe:

...
Storage Driver: devicemapper
 Pool Name: docker--storage-docker--pool
...

Previous Post Next Post