Thomas Denecker & Claire Toffano-Nioche

Session 4

29/03/2019

Novembre

Janvier

Février

Mars

Avril

Mai

Juin

Juillet

...

26

25

22

29

26

31

28

à définir

...

Réunion des installateurs anonymes 

Retour sur un bug

"Pourquoi lorsque je teste mon MD5 sum, la comparaison n'est jamais vraie alors que lorsque que j'affiche les empruntes, elles sont identiques ? "

Le fautif ? Windows !!!

Retour sur un bug

Le problème vient des caractères de fin de ligne

(ils ne sont pas visibles)

 

Sur linux : \n

Sur windows : \r\n

(en fonction de l'éditeur de texte)

 

Conséquence 

"toto\n" != "toto\r\n"

 

et en affichage les deux sont : toto

Solutions 

Dans le terminal 

Dans Atom 

sed 's/\r$/\n/' conditions.txt > conditionsCorr.txt
mv conditionsCorr.txt conditions.txt
  • \r  : Carriage Return
  • \n : Line Feed

CRLF

LF

Session 4

Une virée en mer

Problématique

Reproductibilité du code 

Git et Github

 

Reproductibilité des outils utilisés

Conda

 

Reproductibilité de l'installation

Script d'installation, conda

 

Reproductibilité d'une analyse

Script d'analyse automatique

Et le système d'exploitation ?

Dependability Benchmarking for Computer Systems De K. Kanoun, L. Spainhower

Il faut aussi reproduire le système d'exploitation ?!?

Que faire?

Figer son système d'exploitation ! 

Programme session 4

  • Présentation de docker
  • Ecriture du dockerfile
  • Utilisation du docker avec le script d'analyse
  • Partager le docker : Docker Hub
  • Pourquoi ? utilisation dans un cloud (ex. IFB)

Figer son système d'exploitation

Pourquoi et comment ?

Environnement de système d’exploitation

 

Permet d'avoir plusieurs systèmes d'exploitation sur une même machine physique

 

2 approches :

- La virtualisation

- La containérisation

La différence

Virtualbox, VMware,...

Virtualisation

La différence

Virtualbox, VMware,...

Virtualisation

La différence

Virtualbox, VMware,...

Docker

Virtualisation

Containérisation 

Pourquoi la containérisation plutôt que la virtualisation ?

Avantages de docker

Plus léger

 

Plus rapide

 

Simple à partager

 

Portabilité

Inconvénients de docker

Le système doit être à jour

 

Il faut être administrateur

 

Il n'est pas recommandé par l'I2BC (préférence pour singularity)

Installation de docker

Liens

Windows

MacOS

Ubuntu

 

Très simple pour macOS et Windows (en interface graphique)

 

Un peu plus complexe pour Ubuntu (s'il n'est pas déjà installé)

 

La documentation est très claire

Création d'un compte sur Dockerhub

Pour partager les "dockers" sur le hub

Indispensable lors de l'installation sur Windows et MacOS

Tester l'installation

Si vous n'avez pas ça, il faut recommencer 

$ sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

MAINTENANT DOCKER DOIT TOUJOURS ÊTRE ACTIF !

Windows / MacOS

docker --version

Linux

Quelques définitions

Définitions

Image  

Ensemble de fonctions qui permettent de faire tourner une application 

Figée (pas modifiable)

Peut être stockée en ligne et partagée (Dockerhub)

 

Container

Image qui est active

Modifiable 

Une image, plusieurs conteneurs

Conteneur

Image

Conteneur

Conteneur

INDÉPENDANTS

Intérêt : une base de données par exemple

Une image

Création d'une image

Utilisation d'un fichier de création : dockerfile 

 

Partage d'une image

Disponible dans des dépôts comme Dockerhub

Même principe que Github :

- Partage de l'image (push)

- Récupération de l'image (pull)

Créer une image

Architecture du dockerfile

FROM

l'image de base utilisée (Ubuntu par exemple) 

RUN 

Pour lancer une commande

FROM XXX

RUN XXX

FROM ubuntu:18.04

RUN apt-get update

Un exemple simple  

Un ubuntu 18.04 mis à jour 

Création de l'image

Le dockerfile est dans notre dossier de travail 

# Aller jusqu'au dossier de travail 
cd CHEMIN/VERS/LE/DOSSIER/DE/TRAVAIL

# Construction de l'image 
docker build --tag=XXX .

Pour ne pas parasiter l'image, il faut mettre le dockerfile dans un dossier seul

Le dockerfile de notre projet

FROM rocker/binder

1- From : ici le projet  rocker (orienté binder) 

Rocker est un ensemble de dockers R avec plus ou moins de fonctionnalités. Ici, nous avons un Rstudio server et l'application Jupyter

## USER
USER root

## Update
RUN apt-get update

2- Changement de User et mise à jour des packages 

Le dockerfile de notre projet

ENV HOME /home
WORKDIR ${HOME}

3- Ajout d'une variable d'environnement et changement de dossier de travail 

## Install Conda
RUN apt-get install -y wget bzip2
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
RUN bash Miniconda3-latest-Linux-x86_64.sh -b
RUN rm Miniconda3-latest-Linux-x86_64.sh

ENV PATH /home/miniconda3/bin:$PATH

## Update
RUN conda update conda
RUN conda update --all

## Add chanel
RUN conda config --add channels conda-forge
RUN conda config --add channels bioconda

4- Installation de Conda

Le dockerfile de notre projet

RUN conda install -c bioconda -c conda-forge snakemake

5- Installation de snakemake

RUN conda install -y fastqc bowtie2 htseq samtools

6- Installation des outils de notre workflow

RUN conda install -c hcc aspera-cli

7- Installation d'aspera

Le dockerfile de notre projet

## Install Bioconductor package
RUN Rscript -e 'if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager") ; BiocManager::install("DESeq2", version = "3.8")'
RUN Rscript -e 'if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager") ; BiocManager::install("edgeR", version = "3.8")'
RUN Rscript -e 'if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager") ; BiocManager::install("genefilter", version = "3.8")'

## Install CRAN package
RUN Rscript -e "install.packages('devtools', repos='https://cran.rstudio.com/', dependencies = TRUE)" \
    && rm -rf /tmp/downloaded_packages/ /tmp/*.rds
RUN Rscript -e "install.packages(c('shinydashboard','DT', 'FactoMineR', 'corrplot','plotly'), repos='https://cran.rstudio.com/', dependencies = TRUE)" \
    && rm -rf /tmp/downloaded_packages/ /tmp/*.rds
RUN Rscript -e "install.packages(c('shinyWidgets','colourpicker'), repos='https://cran.rstudio.com/', dependencies = TRUE)" \
    && rm -rf /tmp/downloaded_packages/ /tmp/*.rds
RUN Rscript -e "install.packages(c('shinycssloaders'), repos='https://cran.rstudio.com/', dependencies = TRUE)" \
    && rm -rf /tmp/downloaded_packages/ /tmp/*.rds

## Install Sarstools
RUN Rscript -e 'library(devtools) ; install_github("PF2-pasteur-fr/SARTools", build_vignettes=TRUE)'

8- Installation des packages R

Le dockerfile de notre projet

# Install fastq dump

RUN wget --quiet "https://ftp-trace.ncbi.nlm.nih.gov/sra/sdk/2.9.2/sratoolkit.2.9.2-ubuntu64.tar.gz"
RUN tar -xzf sratoolkit.2.9.2-ubuntu64.tar.gz
RUN rm sratoolkit.2.9.2-ubuntu64.tar.gz
ENV PATH /home/sratoolkit.2.9.2-ubuntu64/bin:$PATH

9- Installation de fastq dump

USER rstudio
ENV HOME /home/rstudio
WORKDIR ${HOME}

10- Changement d'utilisateur et de dossier de travail

Le dockerfile de notre projet

CMD jupyter notebook --ip 0.0.0.0 --NotebookApp.token='' --NotebookApp.password=''

11- Commande lancée lors du démarrage du docker 

Pas obligatoire ici, mais simplifie grandement l'utilisation car élimine le mot de passe 

Et voilà !

Il ne reste plus qu'à construire l'image

docker buil --tag=fair_bioinfo .

Partager une image

Identification pour docker hub

Rappel

Il faut avoir un compte et avoir docker actif

 

Se loguer

Id et mot de passe 

$ docker login
Authenticating with existing credentials...
Login Succeeded

Partage sur Docker hub

1- Préparation du nom (ID_dockerhub/NOM_IMAGE)

docker tag fair_bioinfo tdenecker/fair_bioinfo 

2- Envoyer l'image 

docker push tdenecker/fair_bioinfo 

2.46 KB

~ 8 Go

Et sur Docker hub ?

Pour récupérer un docker ?

docker pull tdenecker/fair_bioinfo

L'image sera disponible localement 

Commandes pratiques

Informations sur Docker 

$ docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:31 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     true

Les images disponibles

$ docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
bgruening/galaxy-stable        latest              d2f45c76b85c        4 weeks ago         3.78GB
rocker/tidyverse               latest              1379b4cd1dfa        7 weeks ago         1.86GB
tdenecker/fair_bioinfo         latest              a6c75264ae49        2 months ago        8.83GB
jupyter/datascience-notebook   latest              18c805bb3afb        2 months ago        6.32GB
rocker/verse                   latest              ca3c5d105cb2        3 months ago        2.9GB
rocker/binder                  latest              a96cd7a02ed8        3 months ago        4.06GB
tdenecker/bpeaks_docker        latest              796b1bc0fc2f        8 months ago        2.3GB
tdenecker/bpeaks_db            latest              91c3c0c2f18e        8 months ago        236MB
hello-world                    latest              f2a91732366c        16 months ago       1.85kB

Lancer une image docker

$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

Lancer notre image 

docker run --rm -d -p 8888:8888 --name fair_bioinfo -v CHEMIN/DE/TRAVAIL:/home/rstudio tdenecker/fair_bioinfo

docker run : lancement d'une image docker 

-- rm : nettoyage des fichiers systèmes plus utilisés après la fin de l'utilisation du docker

- d : mode détaché (le terminal n'est pas bloqué) 

- p 8888:8888 : partage des ports 

 

En local : Dans le docker

Lancer notre image 

docker run --rm -d -p 8888:8888 --name fair_bioinfo -v CHEMIN/DE/TRAVAIL:/home/rstudio tdenecker/fair_bioinfo

docker run : lancement d'une image docker 

-- rm : nettoyage des fichiers système plus utilisé après la fin de l'utilisation du docker

- d : mode détaché (le terminal n'est pas bloqué) 

- p 8888:8888 : partage des ports 

--name fair_bioinfo : nom donné au container

-v CHEMIN/DE/TRAVAIL:/home/rstudio : partage d'un volume (dossier). Ici, je veux que le contenu du dossier CHEMIN/DE/TRAVAIL se retrouve dans le dossier  /home/rstudio du docker

tdenecker/fair_bioinfo : nom de l'image

Pas de panique !

Il y a la documentation ! 

Exemple avec le projet Rocker

Liste des containers

(des images actives) 

$ docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                              NAMES
89ed873eb4da        tdenecker/fair_bioinfo   "/bin/sh -c 'jupyter…"   21 minutes ago      Up 21 minutes       8787/tcp, 0.0.0.0:8888->8888/tcp   fair_bioinfo

Rentrer dans le container

$ docker exec -it fair_bioinfo bash
rstudio@89ed873eb4da:~$ 

-it : en mode itératif (ne ferme pas tant qu'il n'a pas fini)

Ici, nous souhaitons rentrer dans le bash du docker

 

Nous pouvons ici exécuter notre script d'analyse

 

Pour quitter bash (et docker) :

rstudio@89ed873eb4da:~$ exit

Stopper un container 

$ docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                              NAMES
89ed873eb4da        tdenecker/fair_bioinfo   "/bin/sh -c 'jupyter…"   30 minutes ago      Up 30 minutes       8787/tcp, 0.0.0.0:8888->8888/tcp   fair_bioinfo

$ docker stop fair_bioinfo 

## ou 

$ docker stop 89ed873eb4da

$ docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                              NAMES

On stoppe soit par le nom du conteneur soit par son id (récupérés avec un docker ps par exemple) 

Partage de dossier

Partage de données entre le docker et le "local"

Partage de volume : -v Local : Docker

$ ls
test.txt 

Local : docker/test

$ ls
test.txt 

Docker : tmp/

$ ls

docker run application

docker run -v docker/test:tmp/ application

Partage bidirectionnel 

Local

Docker

Les modifications en local sont visibles dans le docker

Les fichiers créés dans le dossier partagé sont disponibles en local

Important : Il faut des chemins absolus

Supprimer 

Un container

docker rm -f ID_CONTAINER

Une image

docker rmi -f NOM_IMAGE

Utiliser une image sur le cloud IFB

Pourquoi utiliser le cloud IFB? 

Puissance

  • La machine locale manque de puissance
  • Pour aller plus vite  (avec plus de puissance)

 

Sécurité

  • Problématique docker : root
  • Avec le cloud, une couche de sécurité en plus

 

Accessibilité et Simplicité

  • Accessible avec un navigateur web simple      
  • Mise en place très simplement

Le cloud IFB ?

L'Institut Français de Bioinformatique (IFB) propose des ressources de calcul comme le cloud

 

Machines virtuelles gratuites et paramétrables (puissance et stockage)

 

Pour en profiter ?

Il suffit juste de se connecter avec une adresse académique ou de l'institut faisant partie du groupe (I2BC)  

Première connexion 

Il y a 3 étapes pour la création d'un compte sur le cloud IFB :

  1. Connexion et Authentification
  2. Configuration du groupe 
  3. Ajout de la clé publique

Connexion et l'authentification

 https://biosphere.france-bioinformatique.fr/

En haut à droite : Se connecter 

 

Puis vous verrez : 

Se connecter avec Paris-Sud

Identifiant habituel

Configuration du groupe

Pour confirmer l'activation du compte et utiliser le cloud

Création d'une clé publique

Une clé publique est une technique de chiffrement qui évite les multiples mots de passe 

 

Intérêt

Les machines communiquent entre elles, sans l'interaction humaine hormis la première fois

Création d'une clé publique

$ ssh-keygen -t rsa -C "FAIR_BIOINFO"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tdenecker/.ssh/id_rsa):
/home/tdenecker/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/tdenecker/.ssh/id_rsa.
Your public key has been saved in /home/tdenecker/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:5QwtwncvoLl1j0qnEahb5lT3YyqqPOQzsz+kZPBf4Dc FAIR_BIOINFO
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|     .   .       |
|      o = +      |
|  .   .* O .     |
|   o .+.S * .    |
|    =.o+E+ =     |
|   =.+=oo.o =    |
|   .B*o..= o .   |
|    =O+oo..      |
+----[SHA256]-----+

Faire 3 fois Enter

Récupération de la clé publique

 2 fichiers ont été créés dans ./ssh :

  • La clé publique dans id_rsa.pub (à mettre sur le cloud IFB)
  • La clé privé id_rsa. A conserver et A NE PAS DIFFUSER!!
$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/GcB30kTCSEJkbdo7SpgW2qavEGmVJYy0JzdMmf8EOWz8++ShTb0S4uuuVMsr4uJmztKkTzcEbV6sNWL9dlPi1RtU6dtZ2OTcx1IrDCSY82MgrzPU3hbOlZT6FPcgUvk5M0oQJgAR12ngQRn6yOm6jYXXczPncrIYwcVkRuyepv+Bdbu8//OIAeyY1d469JDQeXEBLRoNp6UxaOfI10VHHeWQ7o3Rd09k0BM+GT7Hn21NGeA0BWYPmMD6YxORii1T5lzhwGnGqxY2CXFL87Y0Cg6V0lsyF/Ze60iBQc6ckNZJMBa8+YtCQquWIh4Fugi0oRvb444v1Usn6HIHsFDb FAIR_BIOINFO

Copier le contenu du fichier id_rsa.pub

Ajouter la clé dans les paramètres

Ressources disponibles

Gratuit / utilisateur : 36 000 heures de temps CPU par an.

 

Une VM allumée consomme 24h/24 7j/7 

  • 1500 jours pour une VM avec 1 CPU ;
  • 188 jours pour une VM avec 8 CPU ;
  • 47 jours pour une VM avec 32 CPU.

 

Temps épuisé = plus de VM

 

Conseil : faire l'analyse, récupérer les résultats et éteindre

Utilisation d'une appliance 

Un grand choix de machines virtuelles pré-configurées est disponible (ici) - Onglet RAINbio

Création d'une VM Ubuntu

Déploiement avancé : paramétrage de la puissance et du stockage

Création d'une VM

Dans l'onglet myVM : 

Attendre le vert 

2 Go de RAM 

20 Go de mémoire

(dans le dossier /mnt)

Se connecter à la VM

Récupérer l'adresse IP

Remplacer les XXX par votre adresse 

ssh ubuntu@XXX.XXX.XXX.XXX

Se connecter à la VM 

Nous sommes dans le cloud

$ ssh ubuntu@134.214.213.90
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-39-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Tue Mar 26 14:28:36 UTC 2019

  System load:  0.08               Processes:           86
  Usage of /:   13.0% of 19.21GB   Users logged in:     0
  Memory usage: 9%                 IP address for ens3: 10.10.2.28
  Swap usage:   0%


  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.

ubuntu@machine72ac0a94-27a4-441d-99fc-7005ce8c02e3:~$ 

Lancer le docker FAIR_BIOINFO

$sudo docker run --rm -d -p 8888:8888 --name fair_bioinfo -v ${PWD}:/home/rstudio tdenecker/fair_bioinfo
Unable to find image 'tdenecker/fair_bioinfo:latest' locally
latest: Pulling from tdenecker/fair_bioinfo
54f7e8ac135a: Pull complete
f3ecd3055765: Pull complete
9692014a7b7c: Pull complete
53960df9fec8: Pull complete
7131f89eba02: Pull complete
...
a9ea872cde40: Pull complete
d62a8a9d04d0: Pull complete
cddaad898ff9: Pull complete
c3d423a714fb: Pull complete
Digest: sha256:efc2a01095a0b79e62395fb5573a532b11eefe28341f97f53bab9b94dd40155a
Status: Downloaded newer image for tdenecker/fair_bioinfo:latest
aaf6cce43b366c248677ffb7dc00333c67d578547049d5f05ed265da86ec0428

$ sudo docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
tdenecker/fair_bioinfo   latest              a6c75264ae49        2 months ago        8.83GB

Tester l'application ? 

$ git clone https://github.com/thomasdenecker/FAIR_Bioinfo

$ cd FAIR_Bioinfo

$ sudo docker stop fair_bioinfo

# Création du container
# 80 port ouvert sur le cloud IFB
$ sudo docker run --rm -d -p 80:8888 --name fair_bioinfo -v ${PWD}:/home/rstudio tdenecker/fair_bioinfo

# Exécution d'une application dans le container
$ sudo docker exec -it fair_bioinfo bash R -e "shiny::runApp('./R-code', port=4444)"

Dans un navigateur

XXX.XXX.XXX.XXX:80/rstudio/p/4444/

Comment lancer le workflow? 

sudo docker exec -it fair_bioinfo bash ./VOTRE_SCRIPT.sh

Et il ne reste plus qu'à attendre...

 

Attention !

Le projet final pèse 42 Go. Il faut donc une VM avec les bonnes dimensions  

Conclusion

 

Où sommes nous dans la reproductibilité?

Practical Computational Reproducibility in the Life Sciences - Björn Grüning et al (2018) 

Bilan de la session

Savoir FAIRe

- Installation et utilisation de docker

- Accéder à une VM de l'IFB

- Créer et utiliser une image docker

 

Pour la prochaine fois

Réaliser le workflow complet dans une VM IFB en utilisant docker

Bon courage !

RDV sur Slack en cas de problème

Communications

Slack

CompBiol-I2BC chanel : fair_bioinfo

Mail

- thomas.denecker@gmail.com

- claire.toffano-nioche@u-psud.fr