Instalar Jupyter HTML Notebook en Docker

Introducción

Vamos a explicar como instalar la versión HTML de Jupyter Notebook en un contenedor de Docker. En nuestro caso lo usaremos para ejeuctar código Python en la versión 3.7.

Jupyter Notebook es un entorno de ejecución informático interactivo basado en la web para crear documentos de Jupyter notebook. Este editor se basa en documentos JSON, los cuales contienen una lista ordenada de celdas de entrada/salida que pueden contener código, texto (permitiendo Markdown), funciones matemáticas, gráficos y texto enriquecido, generalmente terminado con la extensión .ipynb. También permite archivos de Python .py, pero sin las funcinalidades de los Notebooks y sus características nombradas.

También nos permite conectarnos a un TerminalShell del sistema en el que se encuentra instalado, y así poder instalar paquetes, entre otras cosas.

Para utilizar este entorno de ejecución usaremos nuestro navegador Web preferido, y sin instalar ningún programa en nuestro PC, con la ventaja que nos ofrecen los contenedores de Docker.


Instalación

Para poder tener a salvo los Notebooks o documentos de Jupyter ante cualquier problema con el contenedor de Docker vamos a crear un directorio local en el servidor, el cual podemos vincular con cualquier contenedor si alguna vez tenemos problemas con el actual:

mkdir ~/notebooks

Ahora le damos permisos al directorio para que el usuario del contenedor pueda gestionar el directorio de los documentos, ya que de lo contrario dará fallo al escribir en los archivos:

chmod 757 notebooks/

Ahora instalamos el contenedor indicando la redirección de puertos y el vínculo con el directorio de Notebooks local y remoto (en el contenedor).

Podemos ejecutarlo en modo interactivo, lo que significa que el contenedor funciona mientras tengamos la sesión abierta y finaliza cuando cancelamos esta (pulsando las teclas ctrl + c):

docker run -p 8888:8888 -v ~/notebooks:/home/jovyan jupyter/minimal-notebook

O en modo demonio, para que se ejecute en segundo plano:

docker run -d -p 8888:8888 -v ~/notebooks:/home/jovyan jupyter/minimal-notebook

Si queremos indicar una IP en concreto en nuestro servidor para que solo funcione en esta IP lo indicamos justo antes del puerto, tal y como aparece con el formato x.x.x.x en el siguiente comando, simulando ser una dirección IPv4:

docker run -d -p x.x.x.x:8888:8888 -v ~/notebooks:/home/jovyan jupyter/minimal-notebook

Acceso

Al ejecutar el modo interactivo se indica la dirección URL a la que nos debemos de conectar para usar nuestro entorno de ejecución de código. Esta dirección contiene el token de sesión para poder acceder al entorno. Sin este token será imposible acceder a este.

Pero si hemos decidido usar el modo demonio debemos de ejecutar el siguiente comando para obtener la URL completa junto al token de acceso.

Primero obtenemos el ID del contenedor en el que corre nuestro entorno:

docker ps

En nuestro caso este sería el resultado:

c0fc212515f0 jupyter/minimal-notebook "tini -g -- start-..." 4 days ago Up 4 days 0.0.0.0:8888->8888/tcp tender_hopper

Siendo el ID c0fc212515f0.

Ahora a partir de este podemos obtener la URL de acceso a Jupyter:

docker exec <id_container> jupyter notebook list

Ejemplo de respuesta

Currently running servers:
http://0.0.0.0:8888/?token=924655e7b5cc2a5b4dcc0d188e71ef6b6d5e70d34d527ff3 :: /home/jovyan

Esta es la URL de acceso a nuestro entorno. Es posible que si indicamos una IP distinta a la hora de arrancar el contenedor no aparezca en la URL, mostrándose como IP la 0.0.0.0. De se así solo tendremos que cambiarla por la IP que nosotros queramos.

También podemos ejecutar otros comandos, como instalar paquetes, crear entornos virtuales de Python, entre otros, a partir del ID del contenedor. Por ejemplo, ejecutar comandos PIP:

docker exec <id_container> pip list

Ejemplo de respuesta:

WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with ‘-m pip’ instead of running pip directly.
Package Version


alembic 1.3.3
async-generator 1.10
attrs 19.3.0
backcall 0.1.0
bleach 3.1.0

Aunque desde el propio entorno Web disponemos de una TerminalShell para interactuar con el Sistema.


Precauciones

Es necesario tener en cuenta que tanto los Notebooks como las Terminales abiertas consumen espacio en la memoria RAM, por lo que si tenemos muchos abiertos/en ejecución podemos afectar al rendimiento del Sistema.

Desde la sección Running podemos ver qué procesos o archivos tenemos corriendo en el Sistema, pudiendo apagarlos pulsando en el botón Shutdown, y por tanto liberando espacio en memoria.

También es recomendable, por no decir obligatorio, limitar el acceso a esta IP puerto en el FW, para proteger el sistema completo de posibles ataques o accesos indevidos.


Enlaces de interés

Enlace con la info de como instalar el contenedor, módulos de Python y obtener la key para la URL de Jupyter aquí -> https://www.dataquest.io/blog/docker-data-science/

Wikipedia Jupyter -> https://es.wikipedia.org/wiki/Proyecto_Jupyter

Videotutorial de Jupyter (en ingés) -> https://www.youtube.com/watch?v=HW29067qVWk