¿Cómo contar con un entorno Linux ligero para alguna prueba puntual y rápida?

¿Ha necesitado alguna vez un computador con Linux para probar, explorar o revisar rápidamente algún software? Un ejemplo de esto podría ser la necesidad de probar la configuración de un servidor web para un sitio que utiliza directivas para hosts virtuales o para un proxy reverso.

Para resolver esto, una opción es tomar un equipo físico y prepararlo junto con el sistema operativo y demás softwares requeridos, lo cual seguramente tomará tiempo y esfuerzos considerables, aún cuando se cuente con sistemas de replicación de imágenes de disco. Otra opción es utilizar una máquina virtual, pero la misma consumirá una considerable cantidad de recursos al sistema anfitrión. Y otra opción es valerse de un contenedor Docker, la cual es la más rápida y más ligera que he encontrado hasta el momento (con otras tecnologías de contenedores la situación será similar).

En estos casos, utilizo el siguiente archivo Dockerfile como punto de partida para construir la imagen base a partir de la cual más adelante se generarán los contenedores:

# Generic image for quick exploration tasks based on Ubuntu Trusty
FROM ubuntu:trusty
MAINTAINER Rodolfo Castellanos
#
RUN rm -f /etc/apt/apt.conf.d/docker-clean
RUN apt-get update
RUN apt-get install --yes vim tree aptitude bash-completion screen
#
CMD ["/bin/bash"]
#
# Some options to create images from this Dockerfile are:
# a) save it with the name Dockerfile and run these commands in a shell:
# cd ~/directory-where-Dockerfile-was-created
# docker build --tag acmeorg/explorationimg .
# b) save it with another name, like QuickExplorationOnUbuntuTrusty, and run these commands
# in a shell:
# cd ~/directory-where-quick-dockerfile-was-created
# docker build --tag acmeorg/explorationimg --file QuickExplorationOnUbuntuTrusty . 

Tenga en cuenta que la intención no es compartir este archivo Dockerfile en un sitio como Docker Hub; su único propósito es que sirva como una ayuda en la mencionada prueba o exploración rápida de forma local. Algunos puntos a destacar son:

  • Se establece explícitamente que se basa en la distribución Ubuntu Trusty, para asegurarse de que se usa siempre esa imagen almacenada en la caché local de imágenes de Docker, una vez se descargue por vez primera.
  • Los contenedores creados desde la imagen base de Ubuntu Trusty están configurados para vaciar la caché APT de paquetes descargados. Con la instrucción RUN rm -f /etc/apt/apt.conf.d/docker-clean esa configuración se elimina, para así preservar dicha caché y reutilizarla entre varios contenedores, aún luego de destruidos, con lo que se minimizará el tiempo requerido para descargar esos paquetes desde la Internet. Más adelante, cuando el contenedor sea creado, veremos el uso de volúmenes para aprovechar esa caché APT. Otras personas pudieran o no requerir esto mismo.
  • Con la instrucción RUN apt-get install --yes vim tree aptitude bash-completion screen se instalan algunos paquetes de uso frecuente: vim para editar archivos, tree para explorar directorios, aptitude para la gestión de paquetes instalados, bash-completion para reducir el número de teclas pulsadas al escribir los nombres de comandos dentro de la shell y, finalmente, screen me pemite saltar el comportamiento predeterminado de Docker de ejecutar sólo un proceso por contenedor y así poder contar con varios terminales o shells virtuales dentro del contenedor, lo cual es útil para ejecutar uno o más procesos, uno por cada terminal virtual.
  • Cada contenedor creado a partir de este archivo Dockerfile, al arrancar ejecutará una shell Bash, tal como se instruye con la línea CMD ["/bin/bash"]

Estando en mi computador anfitrión, asumiendo que ya cuenta con el software Docker instalado y listo para ser usado, y también asumiendo que el archivo Dockerfile está ubicado en el directorio llamado directorio-dockerfile, la nueva imagen Docker puede construirse a través de la shell aplicando estos comandos:

cd ~/dockerfile-directory
docker build -t acmeorg/explorationimg .

La primera vez esa construcción tomará cierto para descargar la imagen base de Ubuntu Trusty, pero a partir de la segunda vez tomará un tiempo muchísimo menor.

Con la imagen lista, ahora puedo crear y ejecutar un contenedor dentro de mi equipo anfitrión con un comando como este (mostrado en varias líneas a efectos de mejor legibilidad):

docker run --interactive --tty \
    -v /home/myusername/docker-things/debs:/var/cache/apt \
    -v /home/myusername/docker-things/apt-lists:/var/lib/apt/lists \
    --name quickcontainer acmeorg/explorationimg

Para el contenedor llamado quickcontainer, el volumen montado en /var/cache/apt permitirá reutilizar todos los archivos de paquetes .deb existentes allí y, similarmente, el volumen montado en /var/lib/apt/lists permitirá reutilizar todos los archivos de metadata correspondientes a dichos paquetes.

Ese comando se ejecutará casi instantáneamente y cuando finalice proporcionará una shell interactiva lista para ser aprovechada. A partir de este punto, es posible hacer cualquier cosa que se necesite, por ejemplo:

  • Instalar cualquier otro paquete de software (un servidor web, un servidor de base de datos, un entorno de desarrollo, el entorno de ejecución para un lenguaje de programación, etc)
  • Iniciar una sesión screen para usar una terminal virtual por cada proceso a ajecutar: una para el servidor web, otra para el servidor de base de datos y varias otras para la ejecución interactiva de comandos (editar archivos de configuración, examinar archivos de registro de errores, instalar paquetes de software, etc)

Cuando culmino mis tareas puedo salir del contenedor o detenerlo desde el computador anfitrión, y en este último caso utilizaría el siguiente comando:

docker stop quickcontainer

Si después necesito arrancar ese mismo contenedor otra vez, utilizaría este comando:

docker start --attach --interactive quickcontainer

Si decido que no necesito más ese contenedor, luego que lo he detenido, puedo eliminarlo con este comando:

docker rm quickcontainer

Observe que ese comando dejará intactos los directorios de volúmenes (/home/myusername/docker-things/debs y /home/myusername/docker-things/apt-lists) dentro del computador anfitrión.

Cuando no necesito más la imagen creada, la puedo eliminar con el siguiente comando:

docker rmi acmeorg/explorationimg

Bueno, eso es todo acerca la forma poco convencional en la que estoy usando las tecnologías de contenedores para aprovecharlas en mis pruebas y tareas frecuentes.

Añadir nuevo comentario