Hier je vous présentais docker la solution de conteneur virtuel d’applications qui a le vent en poupe. Je vous propose plusieurs billets pour vous aider à prendre en main ce merveilleux outil.


Un peu de théorie

Pour rappel Docker est une solution de virtualisation par conteneur qui permet à un système de contenir un ou plusieurs processus dans un environnement d’exécution indépendant. Pour cela Docker s’appuie sur les namespaces Linux qui permet d’isoler les ressources des containers : processus, interfaces réseau, points de montage. Un processus qui s’exécute dans un espace de nom (namespace) ne sera visible que par son conteneur. C’est en quelque sorte un chroot puissance 10.
Notion importante, une image ne peut être modifiée directement car elle reste toujours en mode lecture seule. Les conteneurs vont utiliser une ou plusieurs images pour exécuter une application auquel il ajoute une couche accessible en écriture via UnionFS.
Vous pouvez créer vos propres images au moyen des Dockerfiles. Les dockerfiles sont des fichiers de commandes unix utilisant une syntaxe simple. Un Dockerfile peut être encapsulé dans d’autres Dockerfiles, et être à la base de plusieurs images différentes. Par exemple, si tous vos projets utilisent Jekyll comme générateur de sites statiques, vous pouvez créer un Dockerfile ou sera installé Jekyll. Ensuite pour chacun de vos projets de site vous pouvez créer des autres Dockerfiles. Attention toute mise à jour d’un dockerfile utilisé dans d’autres mettra à jour toutes les images l’utilisant.

Maintenant que vos images sont prêtes vous pouvez les utiliser dans des containers auquel vous pourrez ajouter des ressources : point de montage, port ,…

Un peu de pratique sur les images

Je ne vais pas vous refaire l’installation de Docker puisqu’elle a été vue dans le billet précédent :

Rechercher des images

Il est fort possible que quelqu’un a eu les mêmes besoin que vous et vous ai mis à disposition son travail dans le registre de Docker. Pour cela nous allons utiliser la commande search de Docker
Utilisation : docker search [OPTIONS] Mot_Clé
Options possibles :
--automated=false    Only show automated builds
--no-trunc=false     Don't truncate output
-s, --stars=0        Only displays with at least x stars

Par exemple recherchons toutes les images officielles :

bob@bob-fixe:~$ docker search --no-trunc=true library

Cela vous donne le résultat suivant :

La colonne importante est celle se prénommant Official. Les images qui possèdent une croix dans cette colonne sont celles mises à dispo par Docker. Vous pouvez la liste complète ici : registry.hub.docker.com

Télécharger des images

Pour récupérer les images il suffit d’utiliser la commande pull.

docker pull [OPTIONS] NAME[:TAG]

Option Possible :
-a, --all-tags=false : Télécharge toutes les versions (ne pas le faire car cela risque de prendre beaucoup de place)

docker pull ubuntu:1404

ou

docker pull debian:testing

ou

docker pull wordpress:latest

Pour obtenir la liste des tags disponibles il n’a pas de commande. Il faut se rendre sur la page suivante : registry.hub.docker.com

Important : Cette étape peut être assez longue l’ensemble des images nécessaires à la constitution de l’image finale.

Pour rappel, une image n’est pas une archive contenant tout, mais un ensemble d’images qui, par superposition, constitue la cible. Le filesystem Aufs est utilisé pour créer cette superposition d’images.

Lister les images disponibles sur votre installation

docker images [OPTIONS] [REPOSITORY] -a, --all=false      Show all images (by default filter out the intermediate image layers)
-f, --filter=[]      Provide filter values (i.e. 'dangling=true')
--no-trunc=false     Don't truncate output
-q, --quiet=false    Only show numeric IDs

Par exemple pour lister toutes les images de votre install :

docker images -a

Effacer des images

Parfois vos images ne sont plus utiles et il ne faut pas oublier qu’elles peuvent rapidement prendre beaucoup de places sur votre machine.
docker rmi [OPTIONS] IMAGE [IMAGE…] -f, --force=false Force removal of the image
--no-prune=false Do not delete untagged parents

Il suffit donc d’indiquer le tag ou l’id de l’image à effacer. Perso je préfère avec l’ID.

docker rmi c615b3914d6b

Si vous utilisez la commandes image -a vous verrez que cela est impressionnant. Toutes ces images sont utiles à Docker en terme de performance. Mais si vous voulez faire un peu de ménage utilisez cette commande :

docker rmi $(docker images | grep "^" | awk "{print $3}")

Exporter des images

Il est possible d’exporter des images pour les mettre dans une archive au format tar

docker save wordpress > /tmp/mynewimage.tar

Pour créer une image compressé directement

docker save 68f914beba36 | gzip -c < octopress_docker.tar.gz

Importer des images

De la même manière il est possible d’importer une image archivé dans un fichier tar avec la commande load :

docker load < tmp/mynewimage.tar

La même mais cette fois au format compressé :

gzip -dc octopress_docker.tar.gz | docker load

Nommer des images

Après une importation ou lorsque le tag ne correspond plus à son contenu il peut être important de renommer une image
docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

docker tag 68f914beba36 dictege/octopress

Historique d’une image

Une dernière commande qui permet de retrouver toutes les commandes utilisés pour générer l’image depuis son origine :

docker history ubuntu

IMAGE CREATED CREATED BY SIZE
ed5a78b7b42b 6 days ago /bin/sh -c #(nop) CMD [/bin/bash] 0 B
8c4b1edcceea 6 days ago /bin/sh -c sed -i 's/^#s*(deb.*universe)$/ 1.895 kB
9a4594fe74ea 6 days ago /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic 194.5 kB
fe95bf7d5f50 6 days ago /bin/sh -c #(nop) ADD file:c032cb16120c7533b5 188.1 MB
511136ea3c5a 18 months ago 0 B

Dans un prochain billet nous verrons la gestion des conteneurs.