Rstudio en Docker Containers

Cuando llevas tiempo en esto, terminas aficionandote a un sistema operativo y a su modo de trabajar (preferentemente, Linux) pero en algún momento, uses uno u otro, te encuentras ante la tesitura de un cambio de disco, un pc nuevo, mover tu Rstudio tuneado a otro equipo, o simplemente quieres actualizar el sistema operativo a una nueva versión, y comienzas a sentir escalofríos sólo de pensar que tienes que configurar todo de nuevo a tu gusto, con la retahila de paquetes que has ido acumulando y tus modificaciones varias.

Te preguntas si no habrá una forma de evitar eso. Usar máquinas virtuales es extremadamente ineficiente porque dejas el equipo prácticamente muerto al arrancar, y a problemas comunes, soluciones ingeniosas. Solomon Hykes, que es por supuesto mucho más ingenioso que yo (muchisimo más) ante esa tesitura, en lugar de lamentarse, pensó que en lugar de virtualizar todo un sistema operativo se podría virtualizar solamente los servicios que se necesiten. Así nació Docker.

No voy a explicar lo que es Docker porque tenéis documentación para aburrir en internet, solamente voy a decir que se acabó tirarse media tarde configurando e instalando todo lo necesario para tener un Rstudio a tu gusto. Es tan sencillo como convertir tu configuración en un “container” de Docker y guardarla a buen recaudo. La podrás mover, porque es portable y no depende del sistema host, la tendrás a tu gusto, y la podrás usar en tantos equipos como quieras solamente con la definición de un archivo de texto (el dockerfile).

Yo uso como base la versión rocker/hadleyverse de Dirk Eddelbuettel (otro muchacho mucho más ingenioso que yo), y sobre esta he instalado mis librerías favoritas, aunque tampoco hace falta instalar mucho más porque viene con el hadleyverse completo.

https://hub.docker.com/r/rocker/ropensci/

Os dejo las instrucciones para Linux (insisto, si usas Windows tienes un problema, aunque aceptamos Mac OS como animal de compañía).

Instalamos Docker:

curl -fsSL https://get.docker.com/ | sh

Hacemos pull del repositorio. Que básicamente lo que hace es descargar el dockerfile con la definición de la imagen e instalar todo lo necesario para empezar a generar contenedores a partir de la misma.

docker run -d -p 8787:8787 rocker/hadleyverse

Con esto ya has levantado un contenedor que tiene un Rstudio server preparado para funcionar al que te puedes conectar en el puerto 8787 con el navegador (rstudio como usuario y como password). Tened en cuenta que cada vez que ejecutais este comando se está levantando un contenedor NUEVO a partir de la imagen, y puedes llenar (a mi me pasó) inadvertidamente el disco duro de contenedores. Y lo que es peor, te puedes tirar bastante intentando descubrir porqué los archivos que creas o los paquetes que instalas no están disponibles hasta que comprendes que solamente necesitas uno, que tras generar, levantas con:

docker start MICONTAINER --interactive /bin/bash

No voy a entrar en mucho detalle, que afortunadamente documentacion sobre Docker hay a carretadas en la red, pero MICONTAINER es el nombre que le he dado al generarlo con el modificador correspondiente:

--name

De modo que puedo referirme a él con su nombre. El /bin/bash del final es para tener una terminal con acceso al contenedor, que podrás comprobar que se expone como una máquina linux completa ante tus ojos.

Puedes ver los contenedores que tienes, tanto activos como inactivos con:

docker ps -a

Para compartir los archivos del contenedor con una carpeta de tu sistema host el comando es:

docker start MICONTAINER --interactive -v ~/dockerdata:/data /bin/bash

El directorio dockerdata está en mi home, y el directorio data está en el contenedor. Todo lo que dejas ahí, está disponible aunque el contenedor esté parado. Y es ideal para tener tus datos y tus proyectos. De hecho se puede compartir entre varios contenedores (uno con Shiny Server, por ejemplo: https://hub.docker.com/r/rocker/shiny/ )

Cuando empiezas trasteas bastante hasta que lo comprendes todo, y es muy probable que llenes el disco de volumenes. Para ver cuantos tienes generados puedes hacer:

docker volume ls -q

para borrarlos puedes hacer:

docker volume rm $(docker volume ls -q)  # ojo que los borra todos

Puedes borrar también los propios contenedores cuando ya tengas un poco de manejo con:

docker rm MICONTAINER   

Solamente añadir que el Dockerfile es un archivo muy legible y transparente, es como una receta en la que vas indicando los componentes que tiene que tener tu imagen. Puedes ver lo que hace por ejemplo el dockerfile de Dirk en Docker hub, y puedes añadir tus librerias favoritas preparando tu propio dockerfile para que al generar el contenedor estén disponibles al levantarlo. Así tienes un Rstudio a tu gusto que tarda muy poco en estar listo, y que puedes llevar a todos los equipos que quieras, replicando tu entorno de desarrollo en todas partes sin complicación ni esfuerzo.

Solamente tengo una objeción. Los fanáticos de Docker defienden que se puede usar incluso para entornos de producción (imaginad que podemos montar clusters de bases de datos por ejemplo donde cada mysql es un contenedor Docker) que residen todos en el mismo server host. Pero en mi humilde opinión, creo que la revolución real de docker es la facilidad con la que puedes tener tu entorno de desarrollo adaptado a tus gustos disponible en muy poco tiempo. Para entornos de producción no me convence.