Grazie al bellissimo articolo trovato qui ho finalmente risolto un problema che durava da molto tempo.
La gestione di ZFS con Docker fa cag.re! Spesso e (mal) volentieri lascia dataset orfani e ti ritrovi con un sacco di mount con nomi tipo
"zfs-volume/dataset/2d19800174e8e91eb47c9e823139c45b3bc3192e297736e66918ccb1d1595662"
sparpagliati per il sistema.
Avendo il filesystem ZFS in teoria non è possibile forzare docker a utilizzare lo storage driver "overlay2". Anche forzando l'opzione in /etc/docker/daemon.json succederà che andrà in errore.
La furbata allora sta nel creare un volume ZFS (ZVOL) e formattarlo ext4. Dopodiché montarlo in /var/lib/docker, Docker sarà felice e io pure :-)
Procedura:
- Se avevi già container/volumi/immagini devi eliminare tutto, dovrai ricrearli successivamente
- Stoppa docker:
service docker stop
- Crea il volume ZFS:
zfs create -V 30gb tank/docker
(scegli la dimensione che preferisci e utilizza il nome di volume/dataset adatto al tuo sistema)
- Verifica qual'è il nome del device creato:
ls -l /dev/zvol/tank/docker
(sostituisci tank/docker con il volume/dataset che hai utilizzato nel comando precedente). Se non hai altri volumi sarà zd0.
- Crea una partizione (una sola che occupi l'intero volume):
cfdisk (o fdisk) /dev/zd0
- Formattala:
mkfs.ext4 /dev/zd0p1
- Sposta il contenuto di /var/lib/docker altrove:
rsync -aH /var/lib/docker /var/lib/docker.bk
- Inserisci in /etc/fstab il mount (per esempio):
UUID=44a5d02b-c249-4384-96a5-1759210d364d /var/lib/docker ext4 discard,noatime 0 0
- Monta il volume:
mount /var/lib/docker
- Sposta il contenuto della directory docker nuovamente in /var/lib/docker:
rsync -aH /var/lib/docker.bk /var/lib/docker
- Elimina la directory /var/lib/docker/zfs:
rm -r /var/lib/docker/zfs
- Avvia Docker:
service docker start
- Se è andato tutto bene elimina la directory /var/lib/docker.bk:
rm -r /var/lib/docker.bk
Bau.
Commenti offerti da CComment