2015-03-13 21 views
5

Ich bin mit der Anforderung konfrontiert, Datenträgerkontingente für Andockcontainer zu haben. Insbesondere möchte ich die Menge an Daten begrenzen, die nicht in den Schichten des Basisbildes, sondern im diff enthalten sind. Googeln nach "docker disk quota" schlägt vor, entweder device mapper oder die btrfs-Backends zu verwenden. Während der Lage, Quoten in beiden Backends zu haben (mit unterschiedlicher Semantik) haben beide ihre Probleme:Wie definiert man ein Festplattenkontingent für Andockcontainer?

  • Btrfs genug für die produktiven Einsatz nicht stabil sind nur
  • Device-Mapper die komplette Behältergröße einschließlich der Basisbild begrenzt, sondern erlaubt keine Begrenzung der Diff

Was ist der beste Weg, um das zu lösen?

Antwort

2

Eine Möglichkeit, dies zu lösen, ist, das diff-Verzeichnis /var/lib/docker/aufs/diff/$CONTAINER_ID in ein spärliches Loopback-Verzeichnis ext4 zu legen. Dies begrenzt effektiv die Menge an Daten, die ein Benutzer in einem Container speichern/ändern kann. Dies ist die Bash-Code, den ich verwenden:

do_enable_quota() { 
    local ID=$1 
    local QUOTA_MB=$2 

    local LOOPBACK=/var/lib/docker/aufs/diff/$ID-loopback 
    local LOOPBACK_MOUNT=/var/lib/docker/aufs/diff/$ID-loopback-mount 
    local DIFF=/var/lib/docker/aufs/diff/$ID 

    docker stop -t=0 $ID 
    sudo dd of=$LOOPBACK bs=1M seek=$QUOTA_MB count=0 
    sudo mkfs.ext4 -F $LOOPBACK 
    sudo mkdir -p $LOOPBACK_MOUNT 
    sudo mount -t ext4 -n -o loop,rw $LOOPBACK $LOOPBACK_MOUNT 
    sudo rsync -rtv $DIFF/ $LOOPBACK_MOUNT/ 
    sudo rm -rf $DIFF 
    sudo mkdir -p $DIFF 
    sudo umount $LOOPBACK_MOUNT 
    sudo rm -rf $LOOPBACK_MOUNT 
    sudo mount -t ext4 -n -o loop,rw $LOOPBACK $DIFF 
    docker start $ID  
} 

Dieser Ansatz funktioniert perfekt für mich, aber der Nachteil ist, dass ich die „Start“, „Stop“ und „rm“ einzuwickeln Befehle, um die Halterung zu berücksichtigen.

+0

hätten Sie ein Beispiel, wie dieses Skript funktioniert. In meinem Fall, nur die Ubuntu: 14: 04 Containergröße auf ein paar MiB beschränken und den Container erstellen lassen. – askb

+0

Ich bekomme diese Fehlermeldung nach dem Ausführen von cmd: $ do_enable_quota 91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c 20 – askb

+0

gesendet 177 Bytes empfangen 50 Bytes 454.00 Bytes/s Gesamtgröße ist 0 Beschleunigung ist 0.00 Fehlerreaktion von Daemon: keine solche ID: 91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c Fehler: Fehler Container zu starten: [91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c] – askb

1

ZFS ist auch sehr viel: https://docs.docker.com/engine/userguide/storagedriver/zfs-driver/

So können Sie Ihre Plattenpools mit ‚zpool‘ Kommandozeile verwalten können.

Zum Beispiel erstellen 'nur ein Bündel von vdisk':

[[email protected] /]# mkdir /dsk 
[r[email protected] /]# dd if=/dev/zero of=/dsk/disk1 bs=1M count=750 
[[email protected] /]# dd if=/dev/zero of=/dsk/disk2 bs=1M count=750 
[[email protected] /]# dd if=/dev/zero of=/dsk/disk3 bs=1M count=750 
[[email protected] /]# dd if=/dev/zero of=/dsk/disk4 bs=1M count=750 

Ok, haben wir vier Scheiben von 750M jeder. Jetzt einen einzigen ZFS-Pool erstellen:

[[email protected] /]# zpool create CIALINUX /dsk/disk{1,2,3,4} 

Jetzt haben wir ein Volumen CIALINUX genannt, mit fast 3GB automatisch in unserem/Verzeichnis montiert:

[[email protected] /]# df -h |grep CIALINUX 

CIALINUX 2,9G 18K 2,9G 1% /CIALINUX 

Andere Befehle können Sie selbst erkunden sind:

# zpool list 
# zpool status 
# zpool status -x 
# zpool destroy CIALINUX 

Wichtig: Dieser letzte "zerstört" Ihren Pool. Bitte beachten Sie es.

Sobald Sie Ihre zfs-Pools haben, legen Sie Ihre Dateien einfach als Docker-Volumes in/zpool-mounted-directory für jeden Container an.

Hoffe, diese Hilfe-Community.

+0

Beachten Sie, dass dies keine Art von Software-RAID ist. Sie haben keine vier Festplatten, die dezentrale E/A schreiben, so dass Ihre Leistung nicht so reichhaltig ist wie bei einem RAID-Volume. –