Installer et configurer docker sur archlinux
Installation de Docker
On installe d’abord Docker :
# pacman -S docker
Ou la version de développement :
# yaourt -S docker-git
Il faut ensuite démarrer et activer le service docker :
# systemctl start docker.service
On vérifie ensuite que docker tourne :
# docker info
Si on veut manipuler docker comme un utilisateur normal (pas root), on doit ajouter l’utilisateur en question au groupe docker :
# gpasswd -a user docker
Il faut se “dé-loguer” et se “re-loguer” pour que les changements soient pris en compte.
Configuration de Docker
Driver de stockage
Le driver de stockage, également appelé pilote graphique, a un impact énorme sur les performances. Son travail est de stocker des couches d’images conteneur efficacement, c’est-à-dire lorsque plusieurs images partagent un calque, un seul calque utilise l’espace disque. L’option par défaut, la plus compatible, “devicemapper” offre des performances sous-optimales, ce qui est absolument terrible sur la rotation des disques durs. De plus, “devicemappper” n’est pas recommandé en production.
Comme Arch Linux lance de nouveaux noyaux, il est inutile d’utiliser l’option de compatibilité. Un bon choix moderne est overlay2.
Pour voir le pilote de stockage en cours, exécutez : # docker info | head
.
Pour définir votre propre choix de pilote de stockage, créez un Drop-in snippet et utilisez l’option -s pour dockerd :
[Service] ExecStart= ExecStart=/usr/bin/dockerd -H fd:// -s overlay2
Attention : à chaque création et/ou modification de fichier dans /etc/systemd/system/, il convient de recharger le démon systemd, puis de relancer le service :
# systemctl daemon-reload # systemctl restart docker
Localisation des images
Par défaut, les images docker sont localisées dans /var/lib/docker
. Elles peuvent être déplacées sur une autre partition. Pour se faire, on arrête d’abord le service docker systemctl stop docker
. Si des images existent sous /var/lib/docker
, on s’assure que ces images sont totalement démontées. Une fois que c’est fait, on les déplace vers une autre destination (par exemple, /home/docker
) et on modifie le fichier /etc/systemd/system/docker.service.d/override.conf
comme ceci :
[Service] ExecStart= ExecStart=/usr/bin/dockerd -g /home/docker -H fd:// -s overlay2
Utilisation
Images
La commande suivante construit une image debian.
docker pull debian
On lance ensuite l’image avec :
docker run -t -i --rm debian /bin/bash
Supprimer toutes les images et conteneurs
Problème : on joue avec docker et les conteneurs et images s’accumulent. Elles finissent par prendre pas mal de place et on ne s’y retrouve plus.
Attention : ce qui suit va détruire TOUS les conteneurs et TOUTES les images présentes. Il sera impossible de les restaurer !
#!/bin/bash # Delete all containers docker rm $(docker ps -a -q) # Delete all images docker rmi $(docker images -q)
Cas pratique : Logiciel graphique avec docker, XIA
Xia est une application graphique qui, couplé à Inkscape ou LibreOffice Draw, permet de réaliser simplement des images interactives (avec détails zoomables) et des jeux sérieux en html5.
Problème : Il n’existe pas de paquet xia pour archlinux et je n’ai jamais réussi à l’installer sous ma distribution favorite. On va donc créer une image Ubuntu intégrant xia. On va pouvoir comme cela utiliser Xia sur une image Docker de Ubuntu.
Merci à http://www.rpresle.totoandco.eu/logiciel-graphique-avec-docker-haroopad/
Le Dockerfile
Pour simplifier la création des conteneurs il est possible d’utiliser des images mis à disposition sur DockerHub, le site officiel de Docker. Il est également possible de créer des Dockerfile qui décrivent un certain nombre d’instructions permettant le paramétrage du conteneur. Ces Dockerfile définissent à partir de quel système on souhaite travailler et donc définit le système de fichiers et les programme présents dans le conteneur.
Voici le Dockerfile permettant d’utiliser XIA (j’y ai ajouté inkscape au passage)
# On part d'une distribution ubuntu qui permet l'éxécution de Haroopad FROM ubuntu MAINTAINER Nicolas Roudninski <nicoroud@gmail.com> # Déplacement vers un dossier WORKDIR /tmp/ # Mise à jour et installation des dépendances RUN apt-get update && apt-get install -y apt-utils && apt-get upgrade -y # installation de wget RUN apt-get install -y --no-install-recommends wget # installation de inkscape RUN apt-get install -y inkscape # installation de xia RUN echo "deb http://repository.crdp.ac-versailles.fr/debian xia main" | tee /etc/apt/sources.list.d/xia.list RUN wget -q http://repository.crdp.ac-versailles.fr/crdp.gpg -O - | apt-key add - RUN apt-get update && apt-get install -y xia # Exécution du logiciel CMD /usr/bin/xia
Ce Dockerfile permet la création d’une image à l’aide de la commande docker build.
Création de l’image
On lance la commande suivante pour créer notre image docker :
docker build -t ubuntu/xia:1.0 - < Docker_Xia
Cette commande va lancer toutes les instructions qui suivent les “RUN” du fichier Docker_Xia. La dernière ligne indique l’application à lancer par défaut au lancement du conteneur.
Utilisation de l’image Xia
Pour utiliser l’image, on crée un petit fichier bash, xia.sh :
#!/bin/bash xhost + docker run -v /tmp/.X11-unix:/tmp/.X11-unix -v $HOME/temp:/root -e DISPLAY=unix$DISPLAY ubuntu/xia:1.0 $1
La première ligne indique au système d’autoriser l’accès du conteneur sur le serveur X.
On lance ensuite le conteneur (docker run). La deuxième ligne permet de rediriger le flux graphique et de le confier au serveur graphique de notre machine. Le -v $HOME/temp:/root
permet de partager un répertoire (/home/user/temp
ici) avec le conteneur. Le répertoire /root du conteneur (Ubuntu) correspondra au répertoire temp du système hôte situé dans le répertoire personnel.
Il faut évidemment rendre le fichier exécutable :
chmod +x xia.sh
Et on le lance :
./xia.sh
Cela a pour effet de lancer Xia.
On peut aussi lancer Inkscape (et sans doute d’autres applications installées dans l’image ubuntu) en faisant (c’est la raison du $1
en fin de ligne):
./xia.sh inkscape
Mise à jour : Le lancement via docker run...
crée un nouveau conteneur à chaque fois qu’on lance xia.sh
. Ce n’est pas utile et on peut gagner en rapidité et en espace disque en testant l’existence d’un conteneur déjà créé. Pour cela, on modifie le fichier xia.sh
comme suit :
#!/bin/bash xhost + # On teste si un conteneur nommé Xia existe déjà xiactn=`docker ps -a --filter name=Xia -q` if [ $xiactn ] then echo "Un conteneur xia existe déjà. ID : $xiactn" docker start $xiactn else echo "Aucun conteneur. On le crée." docker run -v /tmp/.X11-unix:/tmp/.X11-unix -v $HOME/temp:/root -e DISPLAY=unix$DISPLAY --name Xia ubuntu/xia:1.0 $1 fi
On aurait pu ajouter l’option -rm à docker run qui signifie de détruire automatiquement le conteneur quand on quitte. Voir : https://docs.docker.com/engine/reference/commandline/run/
Pour résumer
- On crée une image sous Inkscape et on la rend interactive.
- On copie cette image dans le répertoire choisi plus haut (ici temp)
- On lance le conteneur Xia (via xia.sh) et on convertit cette image et on l’exporte dans le même répertoire.
- On lance le fichier index.html créé par Xia dans un navigateur pour voir notre image interactive au format html5.