silico.biotoul.fr
 

Docker

From silico.biotoul.fr

Jump to: navigation, search

Motivation : problèmes de dépendances logicielles et de reproductibilités des résultats obtenus (avec un certain environnement, librairies, ...).

Solution (partielle) : mettre dans un container tout ce qu'il faut pour réaliser le même traitement.

Remarque : cela permet aussi de distribuer l'exécution de programme sur une grille de calculs ou un cloud.


Nous allons utiliser podman qui est l'équivalent de docker mais présente certains avantages :

  • docker nécessite un service (qui tourne donc en permanence) alors que podman non
  • il faut des permissions élevées (root) pour docker et pas toujours pour podman


RPMs:

  • podman podman-docker

Contents

Test : Hello world

Pour vérifier que cela fonctionne :

podman run hello-world

podman devrait récupérer l'image du container sur docker.io puis l'exécuter sans trop de soucis.

Images présentes sur le compte :

podman images

Container en cours d'utilisation :

podman ps

Container en cours ou ayant terminé :

podman ps -a

On observe qu'il reste hello-word, on peut accéder aux logs avec son identifiant ou son nom (utile pour le débogage en cas de crash du container) :

podman logs CONTAINER_ID

Nettoyage : suppression de ce qu'il reste de l'exécution précédente

podman rm CONTAINER_ID

Nettoyage : suppression de l'image récupérée de docker.io

porman rmi IMAGE_ID

Utilisation d'un programme : exemple prokka

Prokka: rapid prokaryotic genome annotation, Bioinformatics 2014, Torsten Seemann article github réalise l'annotation de génomes procaryotes. Ce programme fait appel à un certain nombre d'autres programmes, librairies et bases de données (BLAST+, HMMER3, BioPerl, ...) ce qui peut rendre son installation et sa configuration fastidieuses et/ou laborieuses.


Pour illustrer la simplicité de son utilisation (avec les paramètres par défaut même si, en général, il est recommandé d'adapter les paramètres à l'étude réalisée) sur un petit génome.

Récupération de l'image sur docker.io :

podman pull staphb/prokka:latest

Ou bien à partir d'une recherche sur https://hub.docker.com : https://hub.docker.com/r/staphb/prokka

Il est parfois nécessaire de rester sur une version plutôt que de choisir latest :

podman pull staphb/prokka:1.14.5
podman images
REPOSITORY               TAG         IMAGE ID      CREATED        SIZE
docker.io/staphb/prokka  latest      7e63ea9aea78  20 months ago  1.79 GB
docker.io/staphb/prokka  1.14.5      814ee67a9e22  20 months ago  1.79 GB

Utilisation :

podman run staphb/prokka:1.14.5 prokka -h
podman run staphb/prokka:1.14.5 prokka --listdb


Remarque : à chaque exécution d'un container, l'image est gardée. Il faudra donc faire le ménage dans les sorties des containers. Il peut aussi être judicieux d'ajouter l'option --rm qui supprime la sortie du container et nous évite d'avoir à faire le ménage :

podman ps -a


Nous allons l'appliquer à un génome du covid :

mkdir data
cd data
curl http://silico.biotoul.fr/enseignement/m2bbs/fedora/NC_045512.2.fasta > NC_045512.2.fasta

Il faut rendre accessible le fichier à l'intérieur du container avec l'option --volume ou -v → cela correspond à un montage

podman run --rm -v ./data:/data  staphb/prokka:1.14.5 prokka --kingdom Viruses --outdir results NC_045512.2.fasta

Résultats :

ls -lh data/results
total 284K
-rw-r--r-- 1 guest guest 5.1K Aug 30 18:00 PROKKA_08302022.err
-rw-r--r-- 1 guest guest 9.8K Aug 30 18:00 PROKKA_08302022.faa
-rw-r--r-- 1 guest guest  29K Aug 30 18:00 PROKKA_08302022.ffn
-rw-r--r-- 1 guest guest  30K Aug 30 18:00 PROKKA_08302022.fna
-rw-r--r-- 1 guest guest  30K Aug 30 18:00 PROKKA_08302022.fsa
-rw-r--r-- 1 guest guest  54K Aug 30 18:00 PROKKA_08302022.gbk
-rw-r--r-- 1 guest guest  32K Aug 30 18:00 PROKKA_08302022.gff
-rw-r--r-- 1 guest guest 7.0K Aug 30 18:00 PROKKA_08302022.log
-rw-r--r-- 1 guest guest  58K Aug 30 18:00 PROKKA_08302022.sqn
-rw-r--r-- 1 guest guest 1.6K Aug 30 18:00 PROKKA_08302022.tbl
-rw-r--r-- 1 guest guest  469 Aug 30 18:00 PROKKA_08302022.tsv
-rw-r--r-- 1 guest guest   63 Aug 30 18:00 PROKKA_08302022.txt

Combien de protéines sont annotées ?

Est-ce que la protéine spike utilisée pour produire certains vaccins est identifiée ?

Mise en place d'un service

Pour cet exemple, nous allons utiliser trilium qui est un outil pour gérer des notes (post-it virtuels améliorés) de manière hiérarchisée. Il utilise une base de données et peut-être utilisé sous la forme de site Web. L'accès se fait donc par un l'intermédiaire d'un serveur web. Tout ceci sera encapsulé dans un container. Pour y accéder, if faudra donc avoir le nom du site web ou bien son adresse IP ainsi que le port pour accéder au service.

La manière de l'installer comme serveur conseillée est à l'aide d'un container (https://github.com/zadam/trilium/wiki/Docker-server-installation) disponible sur docker hub : https://hub.docker.com/r/zadam/trilium/

Mise en oeuvre avec la dernière version au 31/08/2022 :

podman pull zadam/trilium:0.54.3

Remarque : il est conseillé sur le site de ne pas utiliser latest qui risque de faire une mise à jour qui pourrait endommager les processus de synchronisation avec des applications clientes mis en place (aucun pour nous, donc pas de soucis).

Lors de l'exécution du container, il faut donc qu'un port de la machine hôte soit relié au port d'écoute du serveur web qui s'exécute dans le container. Certaines plages de ports sont réservées pour des raisons de sécurité (n'importe quel utilisateur ne peut pas utiliser/s'approprier n'importe quel port). Un port utilisable est souvent le port 8080. Nous allons utiliser celui-ci.

Les paramètres que nous allons spécifier pour le container :

  • -t ou --tty : allocation d'un terminal/console (tty)
  • -i ou --interactive : exécution en premier plan
  • -p : associe un port du container à un port de la machine hôte, syntaxe -p n°_port_host:n°_port_container
  • --rm : pour supprimer le container quand il termine (et ne pas avoir à faire le ménage)
podman run -t -i --rm --name trilium -p 8080:8080 zadam/trilium:0.54.3

Pour accéder au serveur sur sa machine : http://localhost:8080

Pour accéder au serveur sur une autre machine de la salle, il faudra que le firewall de cette machine autorise la connexion sur le port 8080, ce qui n'est pas le cas par défaut. Ce devrait être le cas http://pc2:8080

Pour arrêter le container, il faut faire Ctrl-C dans le terminal où on l'a démarré s'il est au premier plan, ou bien

podman stop CONTAINER_ID

D'où l'avantage de donner un nom (--name) au container :

podman stop trilium

Si vous avez ajouté une note et que vous relancez le container, la note aura disparu. Il n'y a pas de stockage persistant en dehors du container sauf si on lui fournit l'accès. En effet, le container est isolé de la machine hôte. Si l'on veut garder les modifications effectuées à l'intérieur du container, il faut donc lui fournir des répertoires ou fichier de la machine hôte pour que les modifications faites à l'intérieur du container soient visibles (et persistantes) à l'extérieur.

Nouveau paramètre ajouté :

  • -v ou --volume : permet de monter un répertoire (ou fichier) de la machine hôte dans le container, syntaxe -v host_path:container_path
cd
mkdir trilium-data
podman run -t -i --rm --name trilium -p 8080:8080 -v ./trilium-data:/home/node/trilium-data zadam/trilium:0.54.3

Pour finir, pour lancer le container, il faudra utiliser le paramètre -d ou --detach (au lieu de --interactive):

podman run -t -d --rm --name trilium -p 8080:8080 -v ./trilium-data:/home/node/trilium-data zadam/trilium:0.54.3

A aborder :

  • utilisateurs et groupes, à l'intérieur et à l'extérieur, subuid/subgid

Construire une image

script python nécessitant certaines modules (sklearn).

https://hub.docker.com

https://hub.docker.com/search?q=python

https://hub.docker.com/_/python

python-3.10.6-bullseye basée sur debian:bullseye-slim

Préparation

cd
mkdir -p podman/containers/knn
cd ~/podman/containers/knn

Lancement d'un script python avec la version 3.9.13

podman run python:3.9.13-slim-bullseye python --version

Dockerfile qui va servir à construire l'image

FROM python:3.9.13-slim-bullseye

WORKDIR /usr/src/app

COPY . .

CMD [ "python", "./knn.py" ]

Construction de l'image

podman build -t knn .
podman images

Exécution de l'image

podman run -ti --rm localhost/knn ls -l
podman run -ti --rm localhost/knn pwd
podman run -ti --rm localhost/knn python --version
podman run -ti --rm localhost/knn python knn.py

Il manque des modules python, modification du Dockerfile pour les ajouter :

FROM python:3.9.13-slim-bullseye

WORKDIR /usr/src/app

RUN pip install pandas numpy sklearn

COPY . .

CMD [ "python", "./knn.py" ]

Utilisation

podman run -ti --rm localhost/knn python knn.py
podman run -ti --rm localhost/knn python knn.py -t training.data.txt -u test.data.txt -n --loocv

Le script et les données sont disponibles sur http://pc2/knn/

Si l'image contient un shell (c'est le cas pour celle construite ici car basée sur une linux debian), on peut utiliser ce shell pour se placer dans le container :

podman run -ti --rm localhost/knn /bin/bash

import/export d'images

Pour exporter l'image précédemment créée :

podman save --format=oci-archive --output=knn.img localhost/knn

Pour charger l'image (par exemple sur une autre machine ou un autre compte) :

podman load -i knn.img