La idea detrás de Docker es la de poder crear portables, para que las aplicaciones de software puedan ejecutarse en cualquier máquina con Docker instalado, independientemente del sistema operativo y de que máquina tenga por debajo, facilitando así también su expansión.

Te preguntaras, si ya hemos instalado KVM para poder correr máquinas virtuales ¿que me aporta Docker? Pues realmente el concepto es algo similar, pero un contenedor no es lo mismo que una máquina virtual. Un contenedor es más ligero, ya que mientras que a una máquina virtual necesitas instalarle un sistema operativo para funcionar, un contenedor de Docker funciona utilizando el sistema operativo que tiene la máquina en la que se ejecuta el contenedor.

Realizada esta pequeña introducción vamos a meternos en faena, para ello empezaremos con actualizar repositorios e instalar dependencias y utilidades necesarias:

sudo apt-get update && sudo apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common htop multitail locate net-tools open-vm-tools

A continuación, vamos a agregar el repositorio de Docker y la clave GPC:

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - && sleep 2 && sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

Volvemos a actualizar repositorios del sistema e instalamos Docker:

sudo apt-get update && sudo apt-get -y install docker-ce docker-ce-cli containerd.io

Una vez instalado, tendremos que configurar nuestro Grub de arranque del sistema para habilitar la memoria compartida y swap del sistema:

sudo nano /etc/default/grub

Y debemos de buscar la linea GRUB_CMDLINE_LINUX_DEFAULT, muestro ejemplo en mi caso:

GRUB_CMDLINE_LINUX_DEFAULT="quiet"

Y añadirle en el texto entrecomillado cgroup_enable=memory swapaccount=1, quedando de la siguiente forma:

GRUB_CMDLINE_LINUX_DEFAULT="quiet cgroup_enable=memory swapaccount=1"

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X), activamos los cambios en Grub:

sudo update-grub

Activamos permisos de ejecución a nuestro usuario del sistema evitando tener privilegios root:

sudo usermod -aG docker $USER

Y reiniciamos el Servidor:

sudo reboot

Tras el reinicio podemos comprobar que esta todo debidamente instalado y disponible ejecutando docker info:

pi@overclock:~$ groups $USER
pi : pi adm tty dialout cdrom floppy sudo audio dip video plugdev netdev kvm libvirt libvirt-qemu docker

pi@overclock:~$ docker info
Containers: 3
 Running: 3
 Paused: 0
 Stopped: 0
Images: 3
Server Version: 18
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: bb75rjiervuvi9gjv9u043j
runc version: 2vfkdvnfvuf8v0vuj2i0j245ñlkñw97854ko
init version: fec1981
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.19.0-5-amd64
Operating System: Debian GNU/Linux 10 (buster)
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 31.31GiB
Name: overclock
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine

pi@overclock:~$

Con el sistema preparado para emular entornos Docker, vamos a realizar unos preparativos para almacenar configuraciones y entornos en nuestra carpeta de usuario y posterior ejecución scripts.

cd $HOME && mkdir docker && cd $HOME/docker

La gestión de Docker en un comienzo se realiza desde TTY, pero vamos a habilitar un Docker para la gestión de forma web:

docker run -d \
        --name="Portainer" \
        --restart=always \
        -p 9000:9000 \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v $HOME/docker/portainer:/data \
        portainer/portainer

Adjunto la salida que veremos en pantalla tras ejecutar el comando:

pi@overclock:~$ docker run -d --name="Portainer" --restart=always -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/docker/portainer:/data portainer/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
d1e017099d17: Pull complete
7b7006b7baa6: Pull complete
Digest: sha256:cc226d8a06b6d5e24b44a4f10d0d1fd701741e84a852adc6d40bef9424a000ec
Status: Downloaded newer image for portainer/portainer:latest
9e568ecd534c384aed1ff62d9724b678401678ff37cbe041904d6438fc84bd79
pi@overclock:~$

Ahora debemos de configurarlo vía web, para ello entramos en un navegador web de nuestra red doméstica y apuntamos a la dirección IP del servidor y el puerto 9000, en mi caso:

http://192.168.1.90:9000

Se nos solicitara la creación de un usuario y su contraseña, tras rellenar los datos, hacemos click en Create User. En la siguiene pestaña que nos aparece, hacemos click en Manage the local Docker environment y posteriormente en Connect.

Y listo, ya estara debidamente configurado para poder gestionar (Arrancar, Detener, Reiniciar, Borrar, SSH, …) los Dockers futuros desde la web.

Os dejo algunas ideas conceptuales para que podais probar las funciones de este sistema de virtualización.

Más info en Docker Hub.

Hass.io - Home Assistant

Hass.io es la distribución creada por los desarrolladores del sistema que incluye el software Home Assistant en una distribución de Linux optimizada para funcionar de la mejor forma en un hardware específico bajo docker. Es decir, tan solo un sistema hecho a medida para funcionar de la mejor forma. Una vez finalizado podremos entrar vía web en el puerto 8123.

docker run -d \
        --name="Homeassistant" \
        --restart=always \
        --net=host \
        -p 8123:8123 \
        -v $HOME/docker/hass:/config \
        -v /etc/localtime:/etc/localtime:ro \
        homeassistant/home-assistant:latest

MQTT

MQTT son las siglas de Message Queue Telemetry Transport y tras ellas se encuentra un protocolo ideado por IBM y liberado para que cualquiera podamos usarlo enfocado a la conectividad Machine-to-Machine (M2M). Lo incluiremos si usamos Homeassistant.

docker run -d \
        --name="MQTT" \
        --restart=always \
        -p 1883:1883 \
        -v $HOME/docker/mqtt/config:/config \
        -v $HOME/docker/mqtt/data:/data \
        -v $HOME/docker/mqtt/log:/log \
        eclipse-mosquitto

Jellyfin

Jellyfin es un servidor Multimedia donde podremos tener todas nuestras películas, series, música, Libros… Organizados y centralizados en un único lugar. Una vez finalizado podremos entrar vía web en el puerto 8096.

docker run -d \
        --name="Jellyfin" \
        --restart=always \
        --network=host \
        -p 8096:8096 \
        -e UID=1000 \
        -e GID=1000 \
        -v /media:/media \
        -v $HOME/docker/jellyfin/config:/config \
        jellyfin/jellyfin:latest

TVheadend

TVheadend es una aplicación disponible para GNU/Linux que nos hace de completo Servidor de Televisión. Con ella podemos sintonizar los canales de televisión provenientes de una tarjeta sintonizadora de Satelite, TDT o incluso IPTV.

Opción 1 - IPTV:

docker run -d \
  --name=tvheadend \
  --restart=always \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Europe/Madrid \
  -p 9981:9981 \
  -p 9982:9982 \
  -v $HOME/docker/tvheadend:/config \
  -v $HOME/docker/tvheadend:/recordings \
  linuxserver/tvheadend

Opción 2 - Sintonizadora USB Astrometa + IPTV:

Previamente debemos de crear el siguiente script y ejecutarlo:

#/bin/bash!
if [ -f /etc/udev/rules.d/90-astrometa.rules ];
then
        echo "Ya existe la regla de Astrometa DVB-T/C"
        echo "Desconecta y vuelve a conectar el USB DVB-T/C"
        sleep 1
else
        echo "Creando regla Astrometa DVB-T/C"
        echo 'ATTRS{vendor}=="0x8086", ATTRS{device}=="0xa12f", RUN+="/bin/chown -R pi:pi /dev/dvb"' | sudo tee -a /etc/udev/rules.d/90-astrometa.rules >/dev/null 2>&1
        sudo udevadm control --reload
        echo "Desconecta y vuelve a conectar el USB DVB-T/C"
        sleep 1
fi

Tras la ejecución ya podemos lanzar el Docker:

docker run -d \
  --name=tvheadend \
  --restart=always \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Europe/Madrid \
  -p 9981:9981 \
  -p 9982:9982 \
  --device=/dev/dvb \
  -v $HOME/docker/tvheadend:/config \
  -v $HOME/docker/tvheadend:/recordings \
  linuxserver/tvheadend

Watchtower

Watchtower es una aplicación que controlará tus contenedores Docker en funcionamiento y observará los cambios en las imágenes a partir de los cuales se iniciaron originalmente esos contenedores. Si la Watchtower detecta que una imagen ha cambiado, se reiniciará automáticamente el contenedor utilizando la nueva imagen.

docker run -d --name watchtower \
        -v /var/run/docker.sock:/var/run/docker.sock \
        v2tec/watchtower