Docker Engine: Activando limite de espacio en disco para contenedores

En mi anterior articulo explicaba como almacenar de forma persistente nuestros datos utilizando algunos storage driver que soporta Docker Engine, uno de ellos nos permite limitar el espacio en disco al momento de crear un contenedor.

Desde la reciente version 1.12 de Docker Engine es posible limitar el espacio en disco dentro de los contenedores utilizando el Storage Driver ZFS por lo que este articulo se centrara en llevar a ambientes de produccion esta caracteristica tan esperada. Como sistema operativo base utilizaremos CentOS 7, tambien recuerden que instalaremos la ultima version de ZFS en linux por lo que su sistema operativo debe estar actualizado.

Configurar ZFS en CentOS 7:

Para instalar ZFS en CentOS 7, primero deberemos descargar los repositorios y luego instalarlo, en la linea de comandos ejecutamos lo siguiente:

# yum install http://download.zfsonlinux.org/epel/zfs-release$(rpm -E %dist).noarch.rpm
# gpg --quiet --with-fingerprint /etc/pki/rpm-gpg/RPM-GPG-KEY-zfsonlinux
# yum install zfs -y

Luego, cargaremos los modulos para ZFS y comprabamos que se ha habilitado correctamente:

# modprobe zfs
# dmesg | egrep "SPL|ZFS"
[    5.995443] SPL: Loaded module v0.6.5.8-1
[    6.205613] ZFS: Loaded module v0.6.5.8-1, ZFS pool version 5000, ZFS filesystem version 5
[  707.490081] SPL: using hostid 0x00000

Para terminar, deberemos volver la carga del modulo ZFS persistente ante los reinicios del sistema operativo, en la ruta /etc/modules-load.d , creamos el archivo zfs.conf el siguiente texto: zfs

Luego de esto, al reiniciarse el sistema operativo el modulo ZFS sera cargado automaticamente, volvemos a comprobarlo ejecutando: lsmod | grep zfs .

Configurar ZFS para Docker:

Recomiendo antes de estos pasos, limpiar el directorio en la ruta /var/lib/docker . Para este caso estamos usando un nuevo disco que ha sido montado en el Host donde se encuentra Docker Engine e identifiacod como /dev/sdb. Es momento de crear un nuevo zpool. En la linea de comandos ejecutamos:

# zpool create -f zpool-docker /dev/sdb

Con lo anterior ejecutado creamos un zpool de nombre zpool-docker. Podemos listar y ver el estado del zpool recien creado ejecutando:

# zpool list
NAME           SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zpool-docker  79.5G   411M  79.1G         -     0%     0%  1.00x  ONLINE  -

# zpool status
  pool: zpool-docker
 state: ONLINE
  scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	zpool-docker  ONLINE       0     0     0
	    vdb       ONLINE       0     0     0

errors: No known data errors

Vamos a crear y montar un nuevo sistema de ficheros ZFS, ejecutamos lo siguiente:

# zfs create -o mountpoint=/var/lib/docker zpool-docker/docker

Comprobamos que lo anterior antes ejecutado funciona:

# zfs list -t all
NAME                 USED  AVAIL  REFER  MOUNTPOINT
zpool-docker         93.5K  3.84G    19K  /zpool-docker
zpool-docker/docker  19K    3.84G    19K  /var/lib/docker

IMPORTANTE: Es necesario editar el archivo en /usr/lib/systemd/system/docker.service y agregar lo siguiente:

ExecStart=/usr/bin/dockerd --storage-driver=zfs --storage-opt zfs.fsName=zpool-docker

Posterior, reiniciaremos los servicios para Systemd y Docker: 

systemctl daemon-reload
systemctl restart docker

Luego de lo anterior, verificamos que Docker Engine esta activo y utilizando como storage driver el zfs:

# docker info
Containers: 2
 Running: 2
 Paused: 0
 Stopped: 0
Images: 27
Server Version: 1.12.0
Storage Driver: zfs
 Zpool: zpool-docker
 Zpool Health: ONLINE
 Parent Dataset: zpool-docker/docker
 Space Used By Parent: 1845315072
 Space Available: 80847171584
 Parent Quota: no
 Compression: off

Por ultimo y un paso muy importante: es necesario importar el zpool anteriormente creado:

# zpool set cachefile=/etc/zfs/zpool.cache zpool-docker

luego de lo anterior activamos los servicios para el sistema de archivos ZFS:

# systemctl enable zfs-import-scan.service
# systemctl enable zfs-import-cache.service
# systemctl enable zfs.target

# systemctl start zfs-import-cache.service
# systemctl start zfs.target

 

Limitar espacio en disco:

Bien, a partir de la version 1.12 de Docker Engine, podemos limitar el espacio en disco de los contenedores creados, para ello utilizaremos la opcion --storage-opt al momento de crear los contenedores. En la linea de comandos ejecutaremos:

docker create -it --storage-opt size=2G --name container -h container zokeber/centos; docker start container

Lo anterior le indicamos a Docker Engine que cree un contenedor llamado conatiner con limite de espacio en disco de 2GB. Si verificamos esto dentro del contenedor:

[[email protected] ~]# docker exec -it container bash
[[email protected] ~]# df -h
Filesystem                                                                            Size  Used Avail Use% Mounted on
zpool-docker/docker/4038b9d0b70195acf1c26489c5a1f6dea61e34f9b9aab3732ef06f8645e7248a  2.3G  288M  2.0G  13% /
tmpfs                                                                                 921M     0  921M   0% /dev
tmpfs                                                                                 921M     0  921M   0% /sys/fs/cgroup

Lo anterior nos indica que tenemos un espacio disponible de 2.0GB en disco, por lo que las cuotas ha sido activo para el directorio raiz.

Hasta aca este pequeño tutorial, si tienen alguna duda pueden dejarla en la caja de comentarios.