Archives par mot-clé : docker

Cormas dans container OpenMole

Je parlais l’autre jour de l’utilisation de Cormas dans Docker et j’avais évoqué la possibilité d’utiliser cette plateforme multi-agent à l’intérieur d’openMole pour pouvoir bénéficier des possibilités de la taupe pour paralléliser le calcul et explorer des modèles.

J’avais profité de Romain pendant le coding-camp 2018 pour qu’on propose une première version de plug-in cormas pour openMole. En plus d’ouvrir des portent au calcul pour Cormas, l’idée était de permettre à l’équipe de développer de se concentrer sur le développement de la plateforme plutôt que sur le redéveloppement des méthodes de calcules.

Etape 1 : un container OpenMole

Pour tester Cormas dans openMole le plus simple est d’utiliser docker. En effet l’équipe openMole propose un joli petit container qui rox les poneys ! Vous pouvez le lancer comme ça :

## telecharger la derniere image
docker pull openmole/openmole:8.0-SNAPSHOT
## cree un conteneur avec les droit décriture sur le dossier monte
docker run -u root  -v /root/openMole_workSpace:/var/openmole openmole/openmole:8.0-SNAPSHOT chown -R openmole:openmole /var/openmole/
## lancer le contener en mode detache
docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -p 8080:8443 -v /root/openMole_workSpace:/var/openmole/ openmole/openmole:8.0-SNAPSHOT

Etape 2 : le plug-in cormas pour OpenMole

Voilà la primitive cormas n’est pas directement intégrée à OpenMole, il faudra donc télécharger le plug-in, et l’importer en utilisant le bouton idoine (la prise électrique) dans la barre d’outils en haut.

Etape 3 : Le script OpenMole

Une fois que le plug-in est installé, il ne reste plus qu’à exécuter un script. Pour se simplifier la vie, on utilisera pour l’exemple un modèle chargé par défaut dans cormas : le modèle des pompiers. Pour ceux qui n’ont pas une petite idée ce que c’est, on a un automate cellulaire dont les cellules passe de arbre à brulé et des agents pompier qui vont essayer d’éteindre l’incendie.

Vous pouvez maintenant crée un script.oms qui sera executable par OpenMole.

// OpenMole Variable definition.
// Those variables will be populated in openMole
// and send in JSON to Pharo/Cormas

val seed = Val[Int]

val numberOfFires = Val[Int]
val numberOfFiremen = Val[Int]
val percentageOfTrees = Val[Double]
val dimensionMin = Val[Int]
val dimensionMax = Val[Int]
val nbTrees = Val[Int]

// The CORMASTask take in parameters the class and method able to
// launch our simulation. In OUr case using the Cormas-Model-FireAutomata
// we run a methods build for OpenMole. You can take a look.
// set() allow you to pass some other thing to your task. You can pass :
// * your model as a file.st
// * inputs from OpenMole Variable
// * outputs as an array
// * defined parameters how doesn't change between simulation.

val model = CORMASTask("CMFireAutomataModel simuOpenMole") set (
//resources += workDirectory / "Cormas-Model-FireAutomata.st",
inputs += seed,
cormasInputs += numberOfFires,
cormasInputs += numberOfFiremen,
cormasInputs += percentageOfTrees,
cormasInputs += dimensionMin,
cormasInputs += dimensionMax,
cormasOutputs += nbTrees,

outputs += (seed, numberOfFires, numberOfFiremen, percentageOfTrees, dimensionMin, dimensionMax),

numberOfFires := 3,
numberOfFiremen := 10,
percentageOfTrees := 0.65,
dimensionMin := 60,
dimensionMax := 80
)

// With the DirectSampling() method you define an easy wait to generate
// a sampling for numberOfFires between 1 to 10.
DirectSampling(
evaluation = model hook CSVHook(workDirectory / "results.csv"),
DirectSampling(
  evaluation = model hook CSVHook(workDirectory / "results.csv"),
  sampling = (numberOfFires in (1 to 10)) x
             (seed in (UniformDistribution[Int]() take 10))
)

Dans ce script la partie propre à Cormas est bien sûr la CORMASTask(). Elle devra contenir l’ensemble des instructions qui seront passées au docker de cormas. Dans l’exemple ici, nous fixons tous les paramètres par défaut. C’est dans la méthode DirectSampling() que l’on va faire varier le nombre de feux a l’initialisation et qu’on définira le nombre de réplications du modèle.

Etape 4 : passer à l’échelle

À l’étape précédente, on utilise un seul thread de l’ordinateur. Pour passer à l’échelle rien de plus simple, il faut simplement modifier la fin du script :

val env = LocalEnvironment(2)

// With the DirectSampling() method you define an easy wait to generate
// a sampling for numberOfFires between 1 to 10.
DirectSampling(
evaluation = model on env hook CSVHook(workDirectory / "results.csv"),
sampling = (numberOfFires in (1 to 10)) x
(seed in (UniformDistribution[Int]() take 10))
)

On définit une variable env qu’on va ensuite appelée dans évaluation. Notre variable env fera alors tourner les modèles en parallèle sur … 2 thread. Si vous avez accès à plus en local, n’hésitez pas à pousser. Enfin si vous avez la chance d’avoir accès à un cluster il ne vous reste plus qu’a explorer les différents environnements pris en charge par OpenMole.

Voilà par exemple sur un cluster SGE, 100 jobs lancés que l’on peut monitor dans l’interface openMole

et que l’on peut voir sur le cluster avec qstat

Références :

Construire un container pour Cormas

Cormas est une plateforme de modélisation multi-agents développée en SmallTalk. Historiquement le choix de développement s’était porté sur VisualWork mais depuis quelque temps l’équipe regardait en direction de Pharo.

Cormas sous pharo

Le portage se fait petit à petit, et la feuille de route avance assez rapidement. Si le sujet vous intéresse, nous sommes en train de rédiger un manuel d’utilisation de cette nouvelle version de Cormas sous pharo.

Comme c’est le moment des grandes décisions on s’interroge sur les passerelles avec d’autres outils régulièrement utilisés par les communautés de chercheurs utilisant les SMA et plus largement la simulation. Pour le moment l’attention est portée sur les connexions entre cette nouvelle version de cormas et R et cormas/openMole.

Pour cette dernière, openMole intègre un système de conteneur basé sur udocker. Je suis donc en train de fouiller les possibilités de dockerisé cormas/pharo pour dans un futur que j’espère assez proche nous puissions faire l’ensemble de nos explorations en utilisant openMole.

Ecrire un dockerfile

# Set the base image
FROM ubuntu
# Dockerfile author / maintainer
MAINTAINER Etienne  <moi@truc.fr>

# Update software repository
# and install dependencies
run dpkg --add-architecture i386
run apt-get update && apt-get install -y curl unzip libx11-6:i386 libgl1-mesa-glx:i386 libfontconfig1:i386 libssl1.0.0:i386 libcairo2:i386

RUN mkdir cormas && cd cormas
RUN curl https://get.pharo.org | bash
RUN ./pharo Pharo.image config http://ss3.gemstone.com/ss/Cormas --install=development

Construire un conteneur à partir du dockerfile

sudo docker build -t cormas

Lancer un conteneur à partir du build

docker run --name cormas_instance -t cormas

Tester le fonctionnement

Votre conteneur doit être en train de fonctionner. Pour le vérifier, vous pouvez lancer les commandes suivantes.

docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
914f52adbd98 cormas "/bin/bash" About a minute ago Up About a minute cormas_instance
eeba02bea345 mdillon/postgis "docker-entrypoint.s…" 2 weeks ago Exited (0) 2 weeks ago psql-futurSahel

Vous voyez que j’ai deux conteneurs (psql-futurSahel et cormas_instance) et que le conteneur cormas_instance est en cour de fonctionnement.

On peut maintenant essayer d’interagir avec pharo à l’intérieur du conteneur

sudo docker exec -it 914f52adbd98 /pharo Pharo.image eval '1 + 20'

Si tout s’est bien passé, vous constaterez que pharo vous répond de manière aimable 21 !

Note :

Pour pousser un nouveau conteneur

sudo docker tag cormas elcep/cormas
sudo docker push elcep/cormas

 

Références :

Docker.(PostgreSQL + postGIS) copier des données d’un conteneur à l’autre

Dans un précédent post, je faisais mes premiers pas avec Docker. Arrive rapidement la situation où, vous avez deux conteneurs. L’un avec une base de données spatiale en développement et  l’autre avec LA base de données en production.

Bon, et il peut arriver qu’on veuille sauvegarder les données et/ou restaurer ces données. Typiquement. Vous avez peuplé votre base de nouvelles tables, vues, fonctions… et c’est le moment de passer tout ça en production… Voilà une piste !

Sauvegarder la base de données avec pg_dump ou pg_dumpall

docker exec -t your-db-container pg_dumpall -c -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

ou si la base existe déjà (et que vous ne voulez pas vous soucier des « owner » et « privileges »)

docker exec -t your-db-container pg_dump -d fs_gis -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

Envoyer le dump dans le conteneur de production

cat your_dump.sql | docker exec -i your-db-container psql -d dbname -U postgres

Le `|` est utilisé pour envoyer les information « lut » par le `cat` au fur et à mesure dans psql !

Source :

Un conteneur pour postgreSQL et postgis

Il arrive des moments dans la vie où on a besoin d’un petit serveur de base de données rapidement, là tout de suite. Si ça vous est déjà arrivé, vous savez que c’est parfois se lancer dans une aventure … qui si elle n’est pas périlleuse, peut s’avérer longue et douloureuse.

Alors, pourquoi ne pas en profiter pour passer à docker ? Parce qu’avec le principe de dockerfiles, l’installation ne prend pas plus longtemps que de télécharger les packages.

Installation docker sur Ubuntu

Source : docker.com

Le site de docker est très bien fait. Sur Ubuntu 16.04, il suffira de lancer les lignes de commandes suivantes.

sudo apt-get install -y --no-install-recommends apt-transport-https ca-certificates curl software-properties-common
 curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add - apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D
 sudo add-apt-repository "deb https://apt.dockerproject.org/repo/ \
 ubuntu-$(lsb_release -cs) \
 main"
 sudo apt-get update
 sudo apt-get -y install docker-ce

Si tout s’est déroulé sans accrocs, vous pouvez vérifier que docker fonctionne avec :

sudo docker run hello-world

Il ne reste enfin quelques petits ajustements à faire, notamment configurer votre utilisateur dans le groupe docker pour s’abstraire de l’utilisation de sudo par exemple. Vous trouverez ces choses-là sur cette page.

Installation de postGIS et postgreSQL

Source : postgis dockerfile

Pour créer un conteneur docker il suffit de lancer la commande docker run. Docker va vérifier si vous disposez d’une « image » du service que vous souhaitez lancer. Si c’est le cas, un conteneur sera créé, sinon les différentes composantes de l’image seront téléchargées et le conteneur sera créé dans la foulée.

On commence ici par créer un conteneur postGIS qui s’appellera psql-futurSahel (C’est l’étiquette du conteneur et cela n’aura pas d’influence sur la base de données). On définit le mot de passe de postgreSQL et on spécifie que l’on veut utiliser l’image postgis fournie par l’utilisateur mdillon.

docker run --name psql-futurSahel -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 mdillon/postgis

Pour que cela fonction, il faut également installer un postgreSQL et le lier à l’image de postGIS. Ce qui nous permettra ensuite d’accéder à l’interface de base de données et de nous connecter avec psql

docker run -it --link psql-futurSahel:postgres --rm postgres \
 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'

Dans Postgre

Si tout s’est passé comme il faut, suite à la dernière commande, et après téléchargement des différents constituants de l’image, vous êtes rentré dans le conteneur et vous avez en face de vous un prompt psql.

Vous pouvez donc utiliser les commandes habituelles de postgre. Il faut, une fois connecté à psql, créer une base de données

CREATE DATABASE fs_gis;

On peut ensuite se connecter à la base de données

\connect fs_gis;

Et lancer la commande

CREATE EXTENSION postgis;

La base est donc créée en utilisant le template postGIS.

Peupler la base de données

Vous avez maintenant un serveur de base de données spatiales qui tourne et auquel vous pouvez accéder depuis la machine hôte.

Pour connaître l’IP du conteneur :

docker inspect idconteneur

Vous pouvez alors configurer vos outils de gestion de base de données en utilisant l’IP du conteneur et/ou votre propre IP (ifconfig).

Dans Qgis vous pouvez configurer la gestion de la base de la manière suivante :

Et vous pouvez utiliser l’extension Base de données > Gestionnaire de base de données > Gestionnaire de base de données, pour importer dans postgreSQL vos données en cliquant sur ‘importer une couche ou un fichier’. Cet outil va utiliser le script shp2psql de manière transparente pour l’utilisateur.

Hyphe un web crawler pour l’HNA !

Je travaille depuis une semaine pour la Chaire « Capital Environnemental et la Gestion Durable des Cours d’Eau » de la fondation universitaire de Limoges. L’objectif est de travailler sur la dimension collective de gestion de l’eau et plus particulièrement sur les formes sociales qu’elle peuvent prendre.

La première chose que j’ai voulu faire a été de crawler un peu de web pour espérer comprendre comment étaient structurées les organisations autour de la gestion de l’eau sur mon terrain.

Pour cela, j’ai cherché pendant plusieurs heures un outil qui puisse, à partir d’une URL, identifier les liens et retrouver la constellation des renvois que font les sites institutionnels entre eux ; ce que les anglo-saxon appelle le HNA (hyperlink network analysis).

Si ma première réaction a été de me tourner vers R, je n’ai pas vraiment trouvé mon bonheur, et je ne voulais pas ré-écrire un web crawler. Du coup mes explorations m’ont poussé à découvrir :

  • SocNetv (un logiciel de réseau en Qt)
  • voson (un webservice sur inscription)
  • hyphe (un logiciel libre basé sur python et mongoDB)

Il se trouve que j’ai particulièrement aimé ce que propose hyphe, mais il n’est pas (encore) à proprement parlé multi-plateforme. Je me suis dit que ce serait l’occasion de tester Docker qui est une solution de virtualisation d’applications.

Docker quezako

Pour avoir un bon aperçu de ce qu’est Docker pour la virtualisation je vous encourage à lire un très bon post sur le blog de neogeo.

Utiliser Docker c’est magique ! Pour créer un conteneur sous Ubuntu voilà la marche à suivre.

sudo docker run -i -t ubuntu /bin/bash
adduser delaye
apt-get install sudo wget nano
nano /etc/sudoers
nano /usr/sbin/policy-rc.d
exit 0 #à la place de 101

Vous avez alors accès à une machine dans laquelle vous allez pouvoir monter un serveur, une application ou tout autre chose qui peut servir dans la vie d’un chercheur. Mais encore plus fort, vous pourrez déplacer le tout comme un fichier. Ce qui veut dire que vous pourrez échanger avec d’autres vos applications fonctionnelles dans des conteneurs.

Docker + Hyphe = <3

Revenons à nos moutons, la beauté du couple Docker / Hyphe, c’est que vous disposez sur le github de Hyphe d’un Dockerfile. Le Dockerfile vous permet dans un seul ficher texte de définir la configuration d’une application multi-conteneur. Dans notre cas @oncletom nous propose de faire fonctionner hyphe sur 4 conteneurs Docker :

Pour cela vous devez ajouter une brique à Docker : docker-compose. Cette brique s’installe facilement en suivant les indications de la doc.

Une fois que c’est fait, vous pouvez vous rendre dans le répertoire dans lequel vous avez cloné hyphe et lancer l’installation des conteneurs grâce au Dockerfile.

cd github/hyphe/
docker-compose up

Il est temps d’aller prendre un café parce que l’installation prend un certain temps (15 min chez moi). La prochaine fois que vous lancerez l’application avec docker-compose up l’instanciation des composants se fera beaucoup plus rapidement.

Vous accédez à l’application via votre navigateur (pour le moment, Firefox n’est pas supporter et vous devrez utiliser chrome ou chromium) à l’url suivante http://localhost:8000/#/login.

hyphe is workingVous pouvez explorer des projets « test », mais aussi et surtout vous lancer dans un nouveau projet et lâcher vos petits robot dans les méandres de la toile !

hyphe is crawling

Note

Si vous avez besoin de relancer l’installation des conteneurs (s’il y a eu des maj de hyphe par exemple) vous pouvez reconstruire les conteneurs avec

docker-compose build