Docker en FreeNAS 11.3
A partir de FreeNAS 11.3 ya no es posible crear automáticamente una VM con Docker automáticamente desde la GUI de FreeNAS. Por ello el objetivo de este tutorial es montar una máquina virtual con RancherOS.
¿Por qué RancherOS?
Muy sencillo, RancherOS es una imagen hecha por Rancher Labs enfocada en ser un sistema minimalista y especialmente hecho para trabajar con docker, es decir, lleva exclusivamente lo esencial para que docker funcione, por lo que nos queda un SO que apenas nos ocupará espacio y que tampoco consumirá recursos en herramientas que no vamos a usar.
RancherOS no soporta EFI boot, así que primero tendremos que tener una imagen EFI de RancherOS. Llegados a este punto hay dos opciones:
- Crearla desde cero (https://github.com/mkinney/myranch/blob/master/readme.MD).
- Usar una imagen que soporte EFI ya hecha.
Dado que la última imagen que soporta EFI es la última versión no veo motivos en crearla desde cero. La imagen la he sacado de otro usuario del foro de FreeNAS que la hizo y os la he resubido dado que sus servidores parece ser que están algo saturados.
Preparar la red de FreeNAS para las máquinas virtuales y jails
Para que las máquinas virtuales y jails funcionen bien en FreeNAS, tienen que tener una interfaz de red configurada de una manera muy concreta.
Y ya tendríamos configurada la interfaz lista para ser usada por las máquinas virtuales y las jails. Solo debemos usar interfaces de este tipo para las máquinas virtuales o jails, por lo tanto a la hora de añadir una red a la máquina de RancherOS, seleccionaremos el bridge que hemos creado.
Antes de empezar necesitaremos:
La ISO de RancherOS (la versión tiene que coincidir con la versión de nuestra EFI, con la EFI de este tutorial seleccionaremos la v1.5.5): https://github.com/rancher/os/releases (nos tenemos que descargar la que pone rancheros.iso a secas)
La imagen que soporta EFI boot: https://cloud.byted.xyz/s/PzXPz6HBknGNAQc
Creación de la máquina virtual en FreeNAS
Para crear la máquina virtual, nos vamos al apartado Virtual Machines del menú lateral de FreeNAS y le damos a ADD
Los pasos restantes los podéis dejar por defecto.
Una vez hemos abierto Devices, le damos a ADD
Una vez hecho esto, ya podemos iniciar la máquina virtual.
A partir de aquí podéis elegir dos opciones:
- Darle a Console directamente en la máquina virtual y hacerlo todo desde la GUI de FreeNAS
- Hacerlo por SSH.
Yo lo haré por SSH para facilitar el copiar y pegar comandos.
Instalación de RancherOS
Si estas usando la consola de la GUI de FreeNAS te puedes saltar este paso:
Accedemos a FreeNAS por SSH e introducimos:
cu -l /dev/nmdmXX
sudo fdisk -l
Mucho cuidado a partir de aquí, tened en cuenta que tenéis que sustituir sdb en mis comandos por la letra de vuestro disco como hemos visto en el paso anterior. Y sda por la letra del instalador.
Ejecutamos el siguiente comando:
sudo fdisk /dev/sdb
Y metemos la secuencia de teclas: g,n,1,enter,+200M,t,1,n,enter,enter,enter,w. Donde cada coma es un enter.
sudo mkdosfs -n RANCHER -F 32 /dev/sdb1
sudo mkfs.ext4 -L RANCHER_STATE /dev/sdb2
Ahora tendremos que crear la configuración para que no tengamos que hacer absolutamente nada después de instalarlo.
Para ello hacemos:
vi cloud-config.yml
Os pongo un ejemplo de mi configuración, la podéis modificar a vuestro gusto. Para más información:
La configuración que os pongo no os servirá si no la modificaís con vuestra red y vuestra clave ssh (o bien podéis eliminar la linea de ssh_authorized_keys y ssh-rsa si no queréis poner ninguna).
#cloud-config
hostname: rancheros
ssh_authorized_keys:
- ssh-rsa AQUIVUESTRAKEYSSH
rancher:
console: ubuntu
network:
dns:
nameservers:
- 10.0.2.1
- 1.1.1.1
search:
- byted.xyz
interfaces:
eth0:
address: 10.0.2.51/24
dhcp: false
gateway: 10.0.2.1
runcmd:
- sysctl net.bridge.bridge-nf-call-iptables=1
- sysctl net.bridge.bridge-nf-call-ip6tables=1
Os dejo también con una configuración con lo mínimo para fucionar (en este no es necesario modificar nada, pero tened en cuenta que no tendréis acceso por ssh y la IP de la máquina se obtendrá por DHCP:
#cloud-config
hostname: rancheros
rancher:
console: ubuntu
network:
dns:
nameservers:
- 1.1.1.1
- 1.0.0.1
interfaces:
eth0:
dhcp: true
runcmd:
- sysctl net.bridge.bridge-nf-call-iptables=1
- sysctl net.bridge.bridge-nf-call-ip6tables=1
Para validar la configuración:
sudo ros config validate -i cloud-config.yml
sudo ros install -t gptsyslinux -c cloud-config.yml -d /dev/sdb -p /dev/sdb2
Ahora falta copiar la EFI del disco de instalación al disco donde hemos instalado el SO:
mkdir /mnt/efipart && sudo mount /dev/sdb1 /mnt/efipart
mkdir /mnt/installer && sudo mount /dev/sda1 /mnt/installer
sudo cp -r /mnt/installer/EFI /mnt/efipart
Tenemos que editar el archivo /mnt/efipart/EFI/BOOT/grub.cfg. Y tenemos que tener lo siguiente:
set timeout=1
menuentry "Rancher from GPT" {
search --no-floppy --set=root --label RANCHER_STATE
linux /boot/vmlinuz-4.14.138-rancher printk.devkmsg=on rancher.state.dev=LABEL=RANCHER_STATE rancher.state.wait panic=10 console=tty0 console=ttyS0 rancher.autologin=ttyS0
initrd /boot/initrd-v1.5.5
}
Por último:
sudo umount /mnt/*
sudo reboot
Y quitamos el RAW de Devices y el CD-ROM, sino nos iniciará otra vez en el instalador.
¡Ya tenemos instalado RancherOS y con docker funcionando!
Instación de Portainer (opcional)
Para aquellos que no conozcáis portainer, es una herramienta que nos va a proporcionar una interfaz para poder administrar y crear nuestros contenedores en docker. Para instalarlo, nos metemos a la consola de RancherOS e introducimos:
docker volume create portainer_data
docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
Una vez acabados los dos comandos, vamos a http://IP_de_RancherOS:9000
¡Y ya tendríamos docker y portainer funcionando!