domingo, 25 de marzo de 2018

Instalando Docker en un dispositivo ARM

Todo el mundo que trabaja en el sector de las tecnologías de la información está al tanto del gran avance que fueron las máquinas virtuales, las cuales estaban controladas por hipervisores que simulaban el hardware sobre un sistema operativo anfitrion. Desde mi opinión, este avance ayudó a la migración de los servidores a grandes proveedores como Amazon Web Services, Microsoft Azure y mil y un derivados que ofrecian máquinas virtuales en "su nube" por un precio asequible que permitía disponer de diferentes localizaciones para los servidores.

Pero una máquina virtual es costosa en cuanto a que necesitas un sistema operativo host, un hipervisor que simule el hardware para las diferentes VM, y sobre estas montar cada una de ellas las diferentes aplicaciones. Eb cambio, los contenedores dan un paso más en cuanto a optimizar esta virtualización, compartiendo todos ellos el sistema operativo host y un "gestor" de contenedores (Docker) de forma que cada uno de los contenedores sólo contendrá los paquetes necesarios para la ejecución de la aplicación. Nos ahorramos la virtualización del hardware y tener un sistema operativo para cada uno.



No quiero dar más importancia a la definición de contenedores o justificación sobre su uso frente a las máquinas virtuales. Haciendo una simple busqueda en google encontrareis cientos de sitios con más y mejor literatura sobre Docker, contenedores y analisis pormenorizados sobre sus ventajas y desventajas frente a las VM, o incluso el uso de contenedores sobre VM (algo muy habitual), así que vamos a focalizarnos en una primera toma de contacto con Docker.

Requisistos previos


Para el experimiento de hoy, usaré una placa con ARMBIAN (https://www.armbian.com). Es importante tener presente que los requisitos a día de hoy de Docker para ARM es que la versión del Kernel sea la 3.10 o superior, lo cual me llevó a instalar en mi SBC la versión ARMBIAN 5.38 Server, con una Debian 9 Stretch (kernel 4.14.18-sunxi). Os comento esto porque puede que os deje instalarlo en una versión previa, pero al arrancar el servicio...falla.

Para ver la versión que tenemos usamos el comando uname -a:

josec@orangepiplus2e:~$ uname -a
Linux orangepiplus2e 4.14.14-sunxi #1 SMP Thu Jan 25 12:20:57 CET 2018 armv7l GNU/Linux

Instalación de Docker

Lo primero es asegurarnos que no tenemos una version previa de Docker instalada con el siguiente comando.

josec@orangepiplus2e:~$ sudo apt-get remove docker docker-engine docker.io
(...)
Package 'docker-engine' is not installed, so not removed
Package 'docker.io' is not installed, so not removed
Package 'docker' is not installed, so not removed
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.


Si lo están, los desinistalamos, repetimos hasta que nos indique no están instalados.

A continuación actualizamos los repositorios:


josec@orangepiplus2e:~$ sudo apt-get update

Y e instalamos las dependencias:

josec@orangepiplus2e:~$ sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common


Añadimos la clave del repositorio de Docker

josec@orangepiplus2e:~$ curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | sudo apt-key add -

OK

Y el repositorio de Docker lo añadimos a su propio source.list:


josec@orangepiplus2e
:~$ echo "deb [arch=armhf] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list


Y como resultado nos devuelve el repositorio que hemos añadido a nuesto apt:

deb [arch=armhf] https://download.docker.com/linux/debian      stretch stable

Y ya estaremos en condiciones de instalar el paquete docker-ce con apt con el comando:

josec@orangepiplus2e:~$ sudo apt-get install docker-ce
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libltdl7
Recommended packages:
  aufs-tools cgroupfs-mount | cgroup-lite
The following NEW packages will be installed:
  docker-ce libltdl7
0 upgraded, 2 newly installed, 0 to remove and 18 not upgraded.
Need to get 21.0 MB of archives.
After this operation, 94.4 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://cdn-fastly.deb.debian.org/debian stretch/main armhf libltdl7 armhf 2.4.6-2 [386 kB]
Get:2 https://download.docker.com/linux/debian stretch/stable armhf docker-ce armhf 17.12.0~ce-0~debian [20.6 MB]
Fetched 21.0 MB in 31s (676 kB/s)
(...)

Una vez instalado, para arrancar el servicio de docker:

josec@orangepiplus2e:~$ sudo service docker start

Y para pararlo:

josec@orangepiplus2e:~$ sudo service docker stop

Vemos la versión instalada con:

josec@orangepiplus2e:~$ docker --version

Docker version 17.12.0-ce, build c97c6d6

Una prueba rápida de que nuestro Docker funciona:

josec@orangepiplus2e:~$ sudo docker run armhf/hello-world
Unable to find image 'armhf/hello-world:latest' locally
latest: Pulling from armhf/hello-world
a0691bf12e4e: Pull complete 
Digest: sha256:9701edc932223a66e49dd6c894a11db8c2cf4eccd1414f1ec105a623bf16b426
Status: Downloaded newer image for armhf/hello-world:latest

Hello from Docker on armhf!
This message shows that your installation appears to be working correctly.
(...)

Instalación de Docker Compose en ARM

La mayoria de las veces, necesitamos crear una composicion de imagenes de Docker con diferentes aplicaciones cada una. Para eso se usa Docker Compose. Por ejemplo, una aplicación en varios contenedores para sus servicios web, otra para la base de datos y otra para gestionar la caché de ambos. Este será un ejemplo que veremos más adelante, pero si debemos tener presente que necesitamos Docker Compose para montar el entorno.

Lamentablemente, parece que desde Docker no tienen aún una solución para instalar de forma fácil Compose, por lo que recurrimos a un tercero para hacerlo: https://github.com/hypriot/arm-compose

Las instrucciones, que vienen indicadas en el propio GitHub, son bastante sencillitas. Partimos de la base que las dependencias para Docker-Compose son las mismas que para Docker, por lo que nos saltamos ese paso y comenzando por añadir el repo:

josec@orangepiplus2e:~$ echo "deb https://packagecloud.io/Hypriot/Schatzkiste/debian/ stretch main" | sudo tee /etc/apt/sources.list.d/hypriot.list

deb https://packagecloud.io/Hypriot/Schatzkiste/debian/ stretch main

Añadimos la clave:

josec@orangepiplus2e:~$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 37BBEE3F7AD95B3F
Executing: /tmp/apt-key-gpghome.a6vD4J6hxR/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys 37BBEE3F7AD95B3F
gpg: key C2E73424D59097AB: public key "packagecloud ops (production key) <ops@packagecloud.io>" imported
gpg: Total number processed: 1

gpg:               imported: 1

Actualizamos:


josec@orangepiplus2e:~$ sudo apt-get update

Y finalmente instalamos:


josec@orangepiplus2e:~$ sudo apt-get install docker-compose

Y para ver que está instalado, consultamos la versión:

josec@orangepiplus2e:~sudo docker-compose --version

docker-compose version 1.8.0, build unknown

IMPORTANTE: Es necesario tener arrancado el servicio de Docker para poder usar Compose

Referencias


  • Instalación de Docker (Página Oficial): https://docs.docker.com/install
  • Automated build for docker-compose on ARM (GitHub): https://github.com/hypriot/arm-compose
  • ARMBIAN: https://www.armbian.com