hits counter
Este sitio web utiliza cookies para obtener estadísticas de navegación. Si sigue adelante, consideraremos que acepta su uso. Acepto | Más información

Utilidades:



Instalar Docker para usar contenedores

Docker es una herramienta de virtualización muy ligera que permite correr aplicaciones y servicios utilizando contenedores. La virtualización basada en contenedores tiene una gran ventaja con respecto a los sistemas tradicionales como VMWare o Virtualbox: en los contenedores no se crea un sistema huésped completo, sino que las aplicaciones se encapsulan en módulos que comparten el mismo kérnel del sistema anfitrión y se ejecutan como procesos aislados en el espacio de usuario. Esto supone un gran ahorro de recursos: memoria, espacio de disco y uso de CPU. El hecho de que sea tan ligera implica que no requiere de un hardware potente, lo que la hace muy adecuada para su uso en una placa como la Raspberry Pi. Los contenedores son, además, sistemas autocontenidos que ya disponen de todo lo necesario (código, librerías, dependencias y ficheros de configuración) para poder funcionar en cualquier equipo.

Los creadores de esta plataforma mantienen un repositorio público en la nube, llamado Docker Hub, que contiene una enorme cantidad de imágenes de muchas de las aplicaciones y servicios más utilizados por usuarios y empresas de todo el mundo, ordenadas por categorías, sistemas operativos y arquitecturas (entre las que se encuentra ARM). Cualquiera puede crearse una cuenta (gratuita o de pago) e incluir su propio repositorio particular, haciéndolo público o privado.


Instalar Docker

Lo primero que haremos será actualizar la lista de paquetes de Raspberry Pi OS:

sudo apt update

A continuación ejecutamos el script que llevará a cabo la instalación:

sudo curl -sSL https://get.docker.com | sh

Para poder utilizarlo con el usuario habitual del sistema, añadimos éste al grupo de Docker:

sudo usermod -aG docker pi

y reiniciamos el equipo:

sudo reboot

Con el fin de comprobar que Docker está funcionando correctamente, ejecutamos un primer contenedor hecho ex profeso para esta finalidad: uno muy básico que simplemente muestra el típico "Hello World". Para ello usaremos esta orden:

docker run hello-world

Como podemos ver, la imagen del contenedor se busca primero localmente, y si no se encuentra (como es el caso), se descarga del repositorio Docker Hub. Después se ejecuta el contenedor, que muestra el mensaje Hello from Docker!, y a continuación es cuando se nos indica que la instalación se ha realizado correctamente.

Con los siguientes comandos conoceremos la versión de Docker que tenemos instalada y también otra información extendida (su directorio raíz, kérnel, arquitectura de la CPU, sistema operativo,...), respectivamente:

docker -v
docker info

Instalar Docker Compose

Ahora vamos a instalar Docker Compose, que es una extensión que nos permite gestionar varios contenedores a la vez, además de poder configurar de una forma más sencilla cómo se comunican entre ellos.

Primero instalamos el gestor de paquetes pip:

sudo apt install libffi-dev libssl-dev -y
sudo apt install python3-pip -y

Y luego instalamos la aplicación:

sudo pip3 install docker-compose

Para comprobar que todo ha ido bien, ejecutamos este comando para que nos muestre la versión:

docker-compose --version

Actualizar y desinstalar

Ambas herramienta se actualizan, respectivamente, mediante estos comandos:

sudo apt update && sudo apt upgrade
pip3 install --upgrade docker-compose

Para desinstalarlas, en el caso de Docker:

sudo apt remove --purge docker-ce
sudo rm -rf /var/lib/docker

Y en el caso de Docker Compose:

sudo pip3 uninstall docker-compose

Imágenes

Ya dijimos al principio que existe un gran repositorio donde se encuentran todas las imágenes disponibles para Docker, llamado Docker Hub. De aquí es de donde se descargan las imágenes que vamos a usar en nuestro sistema.

Podemos conocer la lista de comandos disponibles para trabajar con imágenes escribiendo esto:

docker image --help

Los más usados seguramente serán los siguientes:

docker image ls                                       Muestra la lista de imágenes
docker image rm nombre | ID                  Borra una imagen
docker image pull nombre                       Descarga una imagen del repositorio
docker image prune                                 Borra todas las imágenes

Los tres primeros comandos anteriores pueden abreviarse:

docker images
docker rmi nombre | ID
docker pull nombre

Hemos de tener en cuenta que no se puede borrar una imagen si ya existe un contenedor de la misma. Es necesario borrar previamente el contenedor, ya que este no es más que una imagen que se ha lanzado y se encuentra en ejecución.

Parar borrar una imagen podemos usar su nombre o bien su ID. En este último caso no es necesario teclearlo completo (sólo los primeros caracteres, siempre que no existan varios IDs que comiencen por los mismos caracteres). Así, si tenemos dos imágenes cuyos IDs son 6567cb064a414 y 639db11237ab2, respectivamente, para eliminar la primera basta con teclear docker rmi 65.


Contenedores

Como dijimos antes, un contenedor no es más que una imagen que se encuentra en ejecución realizando una tarea. Ello implica que para poder lanzar un contenedor, previamente ha de descargarse la imagen correspondiente: primero se comprueba si esta ya existe en la máquina local, y si no es así, se descarga automáticamente del repositorio.

Al igual que con las imágenes, podemos conocer la lista de comandos disponibles para trabajar con contenedores tecleando esto:

docker container --help

Los más usados en un principio son los siguientes:

docker run nombre                              Arranca un contenedor
docker run -d nombre                         Arranca un contenedor en segundo plano
docker run --name wp wordpress       Lo arranca asignándole un nombre (wp)
docker run -it ubuntu bash                  Arranca un nuevo contenedor y ejecuta comandos
docker exec -it nombre | ID bash        Ejecuta comandos en un contenedor ya arrancado
docker container rename nombre | ID nuevo_nombre               Renombra el contenedor
docker ps -a                                         Muestrra la lista de contenedores
docker stop nombre | ID                      Detiene un contendor
docker start nombre | ID                      Inicia un contendor parado
docker restart nombre | ID                   Reinicia (stop/start) un contendor
docker rm nombre | ID                         Borra un contendor (debe estar parado)
docker pause nombre | ID                    Pausa un contendor
docker unpause nombre | ID                Reinicia un contendor pausado
docker container prune                        Borra todos los contenedores

Como en el caso de las imágenes, para referirse a un contenedor por su ID, no hace falta escribirlo entero (sólo el/los primer/os caracteres, siempre que no existan varios IDs que comiencen por los mismos).




Gestor de ficheros Midnight Commander

Quienes utilizaron hace varias décadas el sistema operatino MS-DOS muy probablemente tenían instalado el famoso Norton Commander, una utilidad con la que era posible obviar la línea de comandos para usar en su lugar una pantalla dividida en dos partes que representaba el árbol de directorios. La aplicación permitía realizar las tareas más comunes con ficheros y carpetas (crear, copiar, mover, borrar, editar, renombrar,...) sin tener que aprenderse la lista de comandos, usando en su lugar un menú de opciones, las teclas de función, el tabulador, las flechas e incluso el ratón. Incluía además un editor de texto propio.

La gran popularidad de esta utilidad hizo que surgiera pronto una versión para el sistema operativo Linux. Por razones de copyright se le cambió el nombre a Midnight Commander y así, las siglas que se utilizaban para referirse al Norton, pasaron de NC a MC. Y de esta última forma es como se instala en la Raspberry Pi:

sudo apt install mc

La arrancamos con la misma abreviatura con la que la hemos instalado (mc para usarlo como usuario o sudo mc para acceder como administrador) y este será su aspecto:

Podemos cambiar a cualquiera de las dos partes en que se divide la pantalla con la tecla del tabulador o pinchando con el ratón. En el menú Opciones se nos ofrece la posibilidad de configurar una gran cantidad de detalles de esta práctica y veterana aplicación.




Varias terminales en una sola pantalla

Cuando trabajamos en la terminal, con la línea de comandos, es muy útil tener la posibilidad de usar varias terminales al mismo tiempo. Esto podemos hacerlo de varias formas: por ejemplo, abriendo varias sesiones de SSH. Pero hay una forma mejor y más práctica: instalar la utilidad tmux, que es lo que se denomina un multiplexor de terminales. Con ella podemos dividir la pantalla de nuestra terminal en varias terminales más pequeñas, crear nuevas pantallas (o ventanas) que contengan, a su vez, varias terminales y saltar de una a otra con una simple combinación de teclas.

Así pues, vamos a instalar esta utilidad:

sudo apt install tmux

Una vez terminada la instalación, ya tenemos tmux listo para usar. Lo lanzamos:

tmux

y lo usamos empleando la combinación de teclas Ctrl+b seguida de otra tecla. He aquí las más comunes:

Ctrl+b %  ->  divide en horizontal 
Ctrl+b "  ->  divide en vertical  
Ctrl+b o  ->  cambia de una a otra  
Ctrl+b flechas  ->  cambia a la terminal donde apunte la flecha  
Ctrl+b x  ->  cierra una terminal [abajo, izquierda, aparece (y/n)]
Ctrl+b c  ->  crea una nueva ventana
Ctrl+b p  ->  vuelve a la ventana anterior
Ctrl+b n  ->  pasa a la ventana siguiente
Ctrl+b &  ->  cierra ventana actual [abajo, izquierda, aparece (y/n)]

Este es el resultado de dividir una pantalla en cuatro terminales:




Poner el disco duro en suspensión

Si conectamos un disco duro externo a la Raspberry, tal y como explicamos más arriba, a no ser que la caja posea un mecanismo para poner el HD en estado de suspensión pasado un cierto tiempo, lo normal es que el disco permanezca continuamente en movimiento, incluso cuando no se está haciendo uso de él, lo que supone un gasto de energía innecesario. Para evitar esto, podemos instalar una utilidad que se encargue de llevar a cabo este proceso.


hdparm

Este servicio es el más fácil de instalar y usar, pero tiene el inconveniente de que no todos los discos duros funcionan con él, especialmente los que se conectan por USB, como es el caso de la Raspberry, ya que esta placa carece de puerto SATA. Lo mejor es probar y ver si funciona con nuestro HD. De no ser así, entonces usaremos hd-idle, cuya instalación se explica más adelante.

Lo instalaremos de la forma habitual:

sudo apt install hdparm

hdparm posee una larga lista de parámetros que se pueden utilizar. Podemos verlos todos aquí. Según se observa, el parámetro -S es el que establece el tiempo de espera antes de poner la unidad en suspensión (standby o spindown). Al usarlo, a continuación debemos añadir un valor numérico que determinará cuál será el tiempo de espera (durante el que no hay actividad del disco) antes de ponerlo en suspensión para ahorrar energía. Seguido de este número vendrá el nombre de la unidad de disco a la que queremos que se aplique (que podemos averiguar previamente con el comando sudo fdisk -l). Por ejemplo:

sudo hdparm -S 60 /dev/sda

La codificación del valor de tiempo de espera es bastante peculiar. El valor 0 significa que el tiempo de espera está deshabilitado y, por consiguiente, el dispositivo no entrará automáticamente en standby. Los valores del 1 al 240 especifican múltiplos de 5 segundos, produciendo tiempos de espera de entre 5 segundos y 20 minutos. Los valores del 241 al 251 indican unidades con intervalos de 30 minutos, cuyos tiempos de espera van desde los 30 minutos a las 5,5 horas. El resto de valores son especiales. Todos ellos podemos verlos en este listado.

Para no tener que escribir el comando anterior cada vez que arranquemos nuestra Raspberry, lo mejor es ponerlo en el fichero de configuración de hdparm para que quede establecido de forma permanente. Así que editamos dicho fichero:

sudo nano /etc/hdparm.conf

y, al final del mismo, escribimos lo siguiente:

/dev/sda {
    spindown_time = 120
}

Como vemos, la sintaxis es diferente a cuando lo usamos directamente desde la línea de comandos. Aquí no se usa el parámetro -S, sino spindown_time, que en este ejemplo le hemos asignado un valor de 120, lo que equivale a 10 minutos de espera (120x5=600 segundos, que son 10 minutos).

Haciendo lo anterior, el spindown debería iniciarse correctamente transcurrido el tiempo indicado. Sin embargo, en algunos discos es necesario, además, activar (descomentándola) esta opción:

apm = 255

Por último, hay que reiniciar el sistema para que se active el servicio:

sudo reboot

Otros parámetros de hdparm

Con el parámetro -C podemos comprobar el estado de la unidad:

sudo hdparm -C /dev/sda

Obtendremos estas respuestas según esté el disco activo o en suspensión:

drive state is: active/idle
drive state is: standby

Para forzar el estado de suspensión, usaremos -y:

sudo hdparm -y /dev/sda

Lo que nos devolverá esta respuesta:

issuing standby command

Una lista completa de todos los parámetros puede obtenerse con

sudo hdparm -h

hd-idle

Si la aplicación anterior no funcionara, entonces la desinstalamos (sudo apt purge hdparm) y probamos con hd-idle, que es más adecuada para los discos USB. El proceso lo haremos en varios pasos, instalando primero algunas herramientas que son necesarias:

sudo apt install build-essential fakeroot debhelper -y

Después descargamos la última versión de hd-idle (que podemos conocer en este enlace):

wget http://sourceforge.net/projects/hd-idle/files/hd-idle-1.05.tgz

Y por último descomprimimos el fichero e instalamos el paquete:

tar -xvf hd-idle-1.05.tgz && cd hd-idle && dpkg-buildpackage -rfakeroot
sudo dpkg -i ../hd-idle_*.deb

Ya podemos poner en suspensión el disco duro con el comando que mostramos a continuación, al final del cual se indica el nombre de nuestra unidad de disco (lo que es posible averiguar previamente escribiendo sudo fdisk -l):

sudo hd-idle -t sda1

Para no tener que escribir el comando anterior cada vez que arranquemos la Raspberry, lo mejor es ponerlo en el fichero de configuración de hd-idle para que quede establecido de forma permanente. Así que editamos dicho fichero:

sudo nano /etc/default/hd-idle

y cambiamos estas dos líneas de la siguiente forma (indicando en la segunda los segundos que han de transcurrir hasta que el HD entre en standby):

START_HD_IDLE=true
. . . . . .
. . . . . .
HD_IDLE_OPTS="-i 300 -l /var/log/hd-idle.log"

Si tuviéramos conectados varios discos, habría que modificar la segunda línea de manera que indique al principio el tiempo por defecto y luego el de cada unidad:

HD_IDLE_OPTS="-i 300 -a sda -i 600 -a sdb -i 1200"

Ya podemos reiniciar el servicio:

sudo service hd-idle restart

o bien el sistema para comprobar que funciona correctamente tras el reinicio:

sudo reboot