Linux con Entorno Gráfico y VNC desde Docker

Desarrollar en varios proyectos de software con plataformas distintas bajo un mismo sistema es muy tedioso, así que opté por Docker para gestionar múltiples entornos de desarrollo consumiendo el mínimo de recursos e inicializarlos en el menor tiempo posible.

 

El Problema

Como desarrollador debo pasar de un proyecto a otro de vez en cuando. Cada proyecto opera en distintos entornos de ejecución, con distintas configuraciones, distintas dependencias y herramientas de software, por lo que emplear un mismo sistema para desarrollar todo es caótico.

Una solución efectiva para este problema fue usar máquinas virtuales: Cada máquina virtual representa un entorno aislado para cada proyecto de software. No obstante, el tiempo de arranque de una máquina virtual me genera ansiedad mientras que el consumo de memoria RAM y CPU frena mi voluntad.

La Respuesta

Desde mi perspectiva, lo ideal sería disponer de una máquina para cada entorno de desarrollo sin consumir muchos recursos y que el tiempo de inicialización de cada entorno fuera el mínimo. Por otro lado, que estas mismas máquinas me ofrezcan un entorno gráfico para ejecutar todas las herramientas de desarrollo previamente configuradas para cada ambiente.

Como todos los desarrollos que realizamos en Alkaid se construyen sobre Linux, no hubo inconveniente para optar definitivamente por Docker. La solución consiste en ejecutar un contenedor con entorno gráfico y un servidor de VNC previamente instalado, al cual me conecto desde mi computador de escritorio y trabajo de forma completamente aislada.

Este mismo objetivo se puede lograr de forma similar usando X11 Forwarding y SSH en un contenedor Linux, pero en realidad nunca terminó de gustarme esa opción porque me confundía al tener más de un entorno de desarrollo activo al mismo tiempo y mezclaba las ventanas.

Qué es Docker

Docker es un Gestor de LXC (Linux Containers) que ha obtenido fuerte popularidad en los últimos meses. Entre todas sus bondades, Docker permite disponer y ejecutar múltiples entornos de aplicación completamente aislados entre sí, usando la instancia del kernel de Linux que ya tengo en ejecución.

A diferencia de las máquinas virtuales en las que el kernel del sistema operativo y los recursos del sistema son inicializados desde cero, un contenedor Linux aprovecha la misma instancia del kernel en ejecución por lo que tanto el arranque como el consumo de recursos es mínimo, permitiéndome ejecutar miles de contenedores en un mismo sistema pero de forma isolada.

El propósito de esta entrada no es ampliar en Docker, sino explicar un caso de uso con el cual debo lidiar con mucha frecuencia y cómo lo resolví usando Docker. No obstante existe mucha documentación que puede consultar en Internet al respecto, es toda una tendencia hoy día.

El Método

Encontré esta imagen en los repositorios públicos de Docker, la cual decidí usar como base de trabajo, ya que tenía la mayoría de lo que necesitaba para empezar: Ubuntu Desktop 14.04.2, LXDE y un servidor VNC.

Aunque esta imagen ya contiene un servidor VNC, el servicio no está expuesto al computador de escritorio, ya que el desarrollador de la imagen lo que hizo fue ofrecer una aplicación Web en el contenedor que permite acceder al entorno usando simplemente el navegador Web, usando un proyecto llamado noVNC.

La idea de usar una ventana del navegador parece apta para otros fines, pero no necesariamente para desarrollar, por lo que tuve que hacer algunos ajustes pequeños para poder conectarme al entorno gráfico de los contenedores a través de mi cliente favorito para escritorio remoto: Remmina. 

El resultado fue la creación de un proyecto en GitHub que contiene lo necesario para crear una imagen que le ayudará a usar Docker como gestor de múltiples entornos de desarrollo usando VNC. Esta imagen no tiene ninguna herramienta de desarrollo preinstalada, es una tarea suya personalizarla a su conveniencia.

Procedimiento

A continuación los pasos a seguir para construir una imagen de Ubuntu Desktop con LXDE y un servidor VNC, que podrá usar para ejecutar decenas de contenedores distintos y aislados entre sí, con los cuales podrá interactuar para realizar sus tareas de desarrollo en el menor tiempo posible y con el menor consumo de recursos.

1. Clonar Proyecto

Descargue una copia del proyecto en su equipo:

$ git clone https://github.com/jonvargas/docker-ubuntu-lxde-vnc.git

Adicionalmente puede ajustar el fichero Dockerfile a su conveniencia en caso de que requiere instalar más paquetería o realizar otros procedimientos de inicialización:

2. Construir Imagen

Este proceso puede tardar un tiempo pues requiere descargar una imagen base de Ubuntu y paquetería de software.

La resolución de pantalla que usará por defecto es de 1366x1024. En caso de que necesite cambiarla modifique el fichero supervisord.conf antes de construir la imagen.

Para construir la imagen solamente requiere ejecutar el siguiente comando. Opcionalmente puede cambiar la etiqueta de la imagen:

$ docker build --rm -t "developer/ubuntu:trusty-lxde-vnc" .

3. Ejecutar Contenedores

Inicie todos los contenedores que guste usando el siguiente comando. El puerto en el que se expondrá el servicio VNC al computador de escritorio es el 5901. Puede ajustar tanto el puerto como el nombre del contenedor:

$ docker run -i -t -p 5901:5900 --name my-lxde-container developer/ubuntu:trusty-lxde-vnc 

Una vez en ejecución, simplemente apunte su cliente VNC a "localhost:5901" para obtener acceso al entorno gráfico del nuevo contenedor. 

4. Detener y Seguir

Los contenedores se detendrán cuando presione CTRL-C en la terminal donde los ejecutó, o cuando los detenga usando el comando "docker kill". Esto es útil cuando haya terminado de trabajar en un proyecto:

$ docker kill my-first-lxde-container

No obstante puede reinicializar el mismo contenedor cuantas veces lo necesite para retomar el proyecto, en menos de 5 segundos. Para ello debe reiniciarlo ejecutando:

$ docker start my-first-lxde-container 

Sugerencias

Si ejecutar comandos para crear nuevos contenedores, re-iniciarlos y adjuntarse a ellos le resulta tedioso, considere la creación de scripts que le faciliten este trabajo. A mí me ha resultado bien.

Comprender el funcionamiento de Docker requiere tiempo, por lo cual familiarícese primero con la plataforma para poder configurar bien la imagen o imágenes que usará para sus proyectos.

Puede llevar Docker más allá. Lo expuesto en esta entrada es un caso muy concreto de usar Docker y disponer de un entorno gráfico, pero las posibilidades son muchas. Investigue más al respecto.


BLOG COMMENTS POWERED BY DISQUS