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

  1. On crée une image sous Inkscape et on la rend interactive.
  2. On copie cette image dans le répertoire choisi plus haut (ici temp)
  3. On lance le conteneur Xia (via xia.sh) et on convertit cette image et on l’exporte dans le même répertoire.
  4. On lance le fichier index.html créé par Xia dans un navigateur pour voir notre image interactive au format html5.