Ce lancer dans les containers Docker

Avez-vous entendu parler de Docker ? Probablement. Si non, ne vous inquiétez pas, je vais essayer de vous expliquer. Docker est probablement l’une des technologies les plus importantes du moment. Son potentiel révolutionne notre façon de construire, déployer et distribuer les applications. Les environnements de développement sont souvent compliqués, difficile de garder la cohérence entre les différents membres de l’équipe. Une solution possible est de construire des machines virtuelles préconfigurées disponible pour toute l’équipe. Docker peut sur ce point apporter des solutions en terme de rapidité et de légèreté par rapport aux VM.

Docker c’est quoi au juste ?

Docker n’est pas une VM à proprement parler, c’est un container, il partage le noyaux Linux de la machine hôte et “isole” les processus qui sont exécutés à l’intérieur du container. Ce container Docker contient une application qui va être exécutée. Pas besoin de la couche Operating System complète comme dans une VM !

Environnement et notions de base Docker

Introduction à Docker

3 éléments essentiels forment les bases de la philosophie Docker :

  • Docker Image : c’est un template qui va servir directement ou indirectement à produire d’autres Docker Images ou des Docker containers. Une Image Docker est constituée de plusieurs couches ou layers, qui vont permettre de “mutualiser” des données entre plusieurs images: gain en terme de stockage disque, de rapidité de construction d’une nouvelle image,
  • Docker Container : c’est “l’exécutable” obtenu à partir d’une Docker Image. Vous pouvez démarrer, arrêter, détruire, un container Docker,
  • Docker Registry ou Docker Hub : c’est le repository des Docker Images . On peut y télécharger des Docker Images créent par d’autres mais également y stocker les siennes.

Installation de l’environnement Docker

Première bonne nouvelle, Docker est disponible pour la plus part des OS : Linux, Windows, Mac OS X pour les processeurs x86 et ARM (comme le Raspberry Pi). Le guide d’installation Docker est très bien fait. Pour Raspberry Pi, je vous conseille la distribution HypriotOS qui fonctionne très bien et sur laquelle je vais m’appuyer pour l’ensemble de mes explications.

Créer une nouvelle Image Docker

Pour mon exemple, je vais mettre en oeuvre un serveur de cache DNS, utilisant bind9 sur un Raspberry PI B, mais le fonctionnement est le même sur une architecture Intel.

Comment réaliser une Docker Image : la réponse est simple, il faut écrire un fichier qui porte le nom Dockerfile (et pas un autre nom), qui ressemble au fichier ci-dessous :

FROM resin/rpi-raspbian:jessie

MAINTAINER Vincent RABAH <vincent.rabah@gmail.com>

RUN apt-get update && \
    apt-get -y dist-upgrade && \
    DEBIAN_FRONTEND=noninteractive apt-get -y install bind9 --no-install-recommends && \
    cat /etc/bind/named.conf.options | sed 's/dnssec-validation auto;/dnssec-validation auto; allow-query { 0.0.0.0\/0; }; allow-recursion { 0.0.0.0\/0; };/' >/tmp/bind.options && cat /tmp/bind.options >/etc/bind/named.conf.options && \
    apt-get clean -y && \
    apt-get autoclean -y && \
    apt-get autoremove -y && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

EXPOSE 53
EXPOSE 53/udp

CMD ["/usr/sbin/named", "-c", "/etc/bind/named.conf", "-f"]

La syntaxe du Dockerfile :

  • FROM : indique sur quelle distribution ou image de référence va se baser cette nouvelle Image Docker, ici c’est une image raspbian, et la version est jessie (sur une machine a processeur Intel on pourrait choisir ubuntu:1404 par exemple)
  • MAINTAINER : qui est responsable de cette image
  • RUN : ensemble de commande qui vont être successivement être exécutées pour créer cette Image Docker
  • EXPOSE : permet de d’ouvrir des ports de communication TCP / UDP pour communiquer avec le reste du monde
  • CMD : indique quelle commande avec ses paramètres éventuels devra être exécutée au démarrage du container Docker

Création d’une Docker Image

Pour lancer la création de notre première Docker Image qui va s’appeler itwars/rpi-bind, nous allons exécuter la commande suivante :

docker build -t itwars/rpi-bind .

Vous allez alors constater que Docker va télécharger un ensemble de fichiers, qui sont les fameux layers dont j’ai parlé précédemment. Quand cette commande Docker est achevée, exécutez la commande suivante :

docker images

Vous allez voir votre Image Docker créée :

Docker Images command

Exécuter un container Docker

Maintenant, nous allons exécuter notre premier container Docker :

docker run --name bind -d -p 53:53 -p 53:53/udp itwars/rpi-bind

Le container a pour nom bind, je “mappe” les ports du container avec ceux de la machine hôte et ce container utilise l’Image Docker itwars/rpi-bind.

Pour voir la liste des containers Docker en cours d’exécution, utiliser la commande :

docker ps

Docker  ps command

Maintenant, pour vérifier que notre serveur de cache DNS fonctionne, il suffit d’indiquer à la machine hôte Docker le nouveau serveur de DNS, dans le fichier /etc/resolv.conf en remplaçant la configuration actuelle par :

nameserver 127.0.0.1

Exécutez la commande suivante pour voir si votre serveur DNS dans le container Docker répond :

host google.fr

Vous devriez avoir une réponse comme celle-ci si tout fonctionne bien :

google.fr has address 216.58.208.227
google.fr has IPv6 address 2a00:1450:4007:80e::2003
google.fr mail is handled by 50 alt4.aspmx.l.google.com.
google.fr mail is handled by 30 alt2.aspmx.l.google.com.
google.fr mail is handled by 10 aspmx.l.google.com.
google.fr mail is handled by 40 alt3.aspmx.l.google.com.
google.fr mail is handled by 20 alt1.aspmx.l.google.com.

Les commandes de base Docker

Pour stopper l’exécution du container Docker :

docker stop bind

Pour redémarrer un container Docker :

docker start bind 

Pour voir tous les containers Docker, y compris ceux qui sont stoppés :

docker ps -a 

Conclusions sur Docker

On constate rapidement, que le démarrage, l’arrêt d’un container Docker sont instantanés ! Par rapport aux VM il n’y a pas photo … Second avantage, quand vous publiez vos images Docker sur le Docker Hub, pour pourrez installer votre image et en créer un container sur d’autre machine facilement.

Ce tutorial est le premier d’une longue série, car c’est un sujet génial qui me passionne !