Docker est un outil de virtualisation d'application léger et très performant. Il permet de bénéficier d'un environnement jupyterhub indépendant du reste du système.

JupyterHub est un outil permettant d'ajouter une fonctionnalité multi-utilisateurs à Jupyter. nbgrader s'intègre à cette configuration afin de rendre automatique la soumission et la récupération des travaux. Il nécessite par contre l'utilisation dans le lycée d'un serveur hébergeant la solution. Disposer d'un tel outil permet d'éviter d'avoir à installer jupyter en local car un accès distant via le navigateur suffit.

La procédure proposée ci-dessous permet d'installer automatiquement un serveur JupyterHub et d'importer automatiquement une liste de comptes profs et élèves au format CSV pour une utilisation immédiate.

Logo de docker Installation de docker

Pour installer docker sur Ubuntu 18.04 serveur,

  • se connecter avec le compte créé lors de l'installation
  • taper les commandes suivantes. Saisissez votre mot de passe à la première commande
sudo apt-get update
sudo apt-get install docker.io
sudo usermod -a -G docker VOTRE_COMPTE
  • ajoutez votre compte utilisateur au groupe docker qui a été créé

  • Fermez et ré-ouvrez votre session.

Pour installer docker sous macOS, rendez-vous à cette adresse pour télécharger l'application docker. Elle se lance comme une application classique.

Logo de jupyter Installation de jupyterHub

Pour créer un container faisant tourner l'image jupyterhub personalisée, tapez la commande

docker run -it -p 8000:8000 --name jhub wawachief/jupyterhub

Tapez CTRL-C pour quitter le container.

Votre serveur jupyterhub est installé et opérationnel sur le port 8000. Pour le tester, lancez votre navigateur à l'adresse

http://127.0.0.1:8000 ou http://votre_adresse_ip:8000

des exemples permettant de tester les modules préinstallés sont disponibles pour les comptes professeurs.

Gérer le container

  • Si vous quittez le container, le serveur jupyterhub ne tourne plus. Pour le relancer à nouveau, il suffit de relancer le container par la commande :

    docker start jhub
    

    jhub étant le nom choisi par le paramètre --name lors de la création du container.

  • Pour arrêter le container, tapez

    docker stop jhub
    
  • Si vous souhaitez effacer le container - et les données qu'il contient !! - et repartir sur une image propre, tapez
    docker rm jhub
    

Vous pouvez maintenant recréer un nouveau container à partir de l'image jhub_image par la commande docker run exposée ci-dessus. Pour conserver les données hors du container - recommandé pour une installation serveur - référez-vous au paragraphe persistance des données ci-dessous.

Le but de cette page n'est pas de faire un tutoriel complet sur docker. Je vous recommande pour en savoir plus de lire la documentation de docker afin de pouvoir tirer le maximum de superbe outil.

Comptes utilisateurs

Par défaut, l'image docker contient un compte administrateur jupyterhub :

login : adminjh
pass : wawa

Ce compte est aussi administrateur du container : vous pouvez ouvrir un terminal et taper sudo su pour abtenir les droits root

Vous pouvez utiliser les comptes présents dans le fichier CSV. Il contient

  • 39 comptes élèves : eleve1 jusqu'à eleve39, mot de passe toto
  • 10 comptes profs : prof1 à prof10, mot de passe wawa

Pour créer de nouveaux comptes, créez un fichier CSV (par exemple mesComptes.csv) au même format décrit ci-dessus et déposez-le sur le serveur jupyterhub dans l'espace de l'administrateur adminjh (bouton upload). Ouvrez ensuite une console puis tapez la commande

sudo /usr/bin/import_comptes.sh mesComptes.csv

Si vous vous connectez en tant que professeur, deux activités exemples sont déjà présentes et vous permettent de tester l'outil nbgrader en suivant la démarche décrite dans la section suivante.

⚠️ Attention ! ⚠️

Modifiez le mot de passe adminjh pour une utilisation en production !

Pourchanger le mot de passe adminjh,

  • connectez-vous adminjh
  • ouvrez un terminal depuis jupyter par New / Terminal
  • tapez sudo passwd adminjh, tapez le mot de passe courant puis 2 fois le nouveau mot de passe

Procédez de manière identique pour changer le mot de passe d'un autre utilisateur.

Gérer la persistance des données

Les volumes docker

Les volumes docker sont des dossiers spéciaux qui permettent le partage de données entre un ou plusieurs containers, ainsi que la persistance de celles-ci. Voici quelques propriétés intéressantes à connaître :

  • Les volumes sont initialisés à la création du container. Si l'image de base contient des données au point de montage spécifié, celles-ci sont copiés dans le volume lors de son initialisation. On peut donc ajouter des containers à volonté selon les points de l'arborescence qu'on souhaite rendre persistants ou partagés.
  • Les volumes de données peuvent être partagés entre plusieurs containers.
  • Les données sont conservées même si le container est détruit.

Nous allons voir dans la pratique comment utiliser les volumes pour mettre en production un serveur jupyterhub

Création des volumes

Si vous mettez en place un serveur en production, vous voudrez que vos données survivent même si vous effacez le container pour en reconstruire un propre à partir d'une image. Les volumes docker sont vos amis ! Grâce à eux, vous pourrez externaliser le stockage de certains dossiers hors du container. Pour cette installation de jupyterhub, je recommande deux volumes

  • un volume pour les espaces personnels de stockage (jh_home)
  • un volume pour la zone d'échange nbgrader (jh_exchange)

Pour créer ces deux volumes, tapez les commandes suivantes

docker volume create jh_home
docker volume create jh_exchange

Pour créer un container utilisant ces volumes, il faut juste ajouter le paramètre -v NOM_VOLUME:ARBO_DANS_CONTAINER :

docker run -it --name jhub -p 8000:8000 -v jh_home:/home -v jh_exchange:/srv/nbgrader/exchange wawachief/jupyterhub

et voilà, en modifiant juste la ligne de création du container, vos données sont persistantes ! Vous pouvez effacer le container et en recréer un, vous retrouverez vos données. Vous avez maintenant un serveur opérationnel pour la production.

Sauvegarde des données

Dans la commande ci-dessous, nous allons créer un nouveau container basé sur une ubuntu qui va accéder aux volumes de notre container jhub et fabriquer une archive tar qui sera stockée dans le répertoire courant de la machine hôte. L'option --rm permet d'effacer ce container temporaire qui ne sert qu'à la récupération des données.

docker run --rm --volumes-from jhub -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /home /srv/nbgrader/exchange

Récupération des données

La ligne suivante va restaurer l'archive backup.tar réalisée ci-dessus d'un nouveau container jhub_new que l'on a déjà lancé.

docker run --rm --volumes-from jhub_new -v $(pwd):/backup ubuntu bash -c "cd / && tar xvf /backup/backup.tar"

Ces deux méthodes montrent donc comment transférer le contenu d'un container à un autre. On peut ainsi migrer facilement une installation jupyterhub sur une autre machine.

Pour en savoir plus, se référer à la documentation sur le stockage docker.

Authentification LDAP - réservé aux spécialistes

jupyterhub peut utiliser les comptes d'une base LDAP. Pour cela, il faut

  • activer la configuration LDAP dans le fichier jupyterhub_config.py (un modèle de conf est présent, il faudra l'adapter à votre serveur)
  • installer pam_ldap sur le système
    sudo apt-get install -yq --no-install-recommends libnss-ldap libpam-ldap nslcd jupyterhub-ldapauthenticator
    
  • modifier les fichiers de conf suivants : /etc/libnss-ldap.conf /etc/ldap/ldap.conf /etc/ldap.secret /etc/pam_ldap.secret