Docker – Faire une seule chose, mais la faire bien !

Aujourd’hui il ne sera pas question de sécurité à proprement parler. Et encore, on en sera pas loin ! Cet article est un tuto « basique » sur les fonctionnalités de Docker.

Docker ?

Vous connaissez surement les processus de virtualisation, pour vulgariser c’est un peu la même chose. En pratique docker n’a rien à voir avec la virtualisation. Docker c’est de la virtu, sans couche virtu ! Un petit schéma vaut mieux que de longues explications :

 

Docker se base sur votre système pour les appels de ses containers.
Pour le moment il n’est disponible que sous Linux mais Microsoft à fait part de son intérêt pour le projet. Il existe une version docker for Windows mais celle ci se contente d’installer une machine virtuelle Linux dans VirtualBox.

Les containers

Dans le système classiques on manage des « machines virtuelles ».
Avec docker on manage des « Containers ». Chaque container a un but :

Faire une seule chose et la faire bien !

Dans une architecture classique on a souvent plusieurs services regroupés. Les containers sont conçut pour s’imbriquer ensemble dans un système. Autre avantage de ce concept, si un des composants ( container ) est défectueux il peut être simplement remplacé sans impacter le système en général. Si on prend l’exemple des bases de données, la réplication fait partie du système et est quasiment « native », il en va de même de la scalabilité.

Commencer avec Docker

« Docker ça a l’air trop cool !  » « Docker c’est génial ! » « Mais comment qu’on fait ? »

Plusieurs possibilités pour démarrer avec Docker.

  • Partir d’une image existante.
  • Créer une image « From Scratch »

Pour aujourd’hui nous allons nous concentrer sur la première possibilité.

A nouveau 2 possibilités :

  • Travailler dans le container.
  • Utiliser un « Docker File »

Pareil toujours première possibilité 🙂

Rendons nous donc sur le site hub.docker.com, ce site peut etre considéré comme un « serveur git avec des images docker » ( n’oubliez pas cette petite phrase car cela est réellement possible avec Docker 😉 ).
Sur ce site on retrouve des images officielles ( ubuntu, wordpress, nodejs .. ) et des images construites par la communauté. Concernant ces dernières à vous de décider d’accorder votre confiance à ces images ou non. Cependant pas besoin d’être parano, la plupart des images proposés par la communauté disposent d’un « Docker File ».

Le Docker File, c’est l’autre possibilité que nous avons pour construire notre container, et comme c’est la seconde fois que j’en parle il est temps d’expliquer de quoi il s’agit.

En fait c’est un « simple » fichier texte contenant une suite de commandes qui vont permettre à Docker de construire votre image.

 FROM debian #Image de base utilisée 
MAINTAINER ShoxX #Nom de l'auteur 
RUN apt-get update && apt-get upgrade -y #On execute cette commande dans le container 
RUN apt-get install wget apache2 apache2-utils php5 php5-dev php5-gd debconf-utils unzip -y 
RUN rm /var/www/html/index.html 
RUN echo "/etc/init.d/apache2 start" > /etc/bash.bashrc #Petit tricks pour lancer apache au démarage 
ADD files/ /var/www/html/ #J'ajoute les fichiers du dossier "files" contenu sur ma machine dans le dossier "/var/www/html" du container 

Revenons donc à nos moutons, nous avons parlé des Dockerfile pour montrer qu’il était possible de faire confiance aux images postés par la communauté.

Mais si votre but est de construire une simple image Docker pour tester le bouzin ou a des fins personnels continuons !

L’objectif maintenant va etre de construire un serveur web depuis une image Docker :

De quoi avons nous besoin ?

Une image Docker de base ( on pourrait tricher et utiliser une image déjà construite dans ce but, mais l’objectif ici est d’apprendre ).
Cette image devra contenir un serveur Apache.
Et bien-sur une page d’index souhaitant la bienvenue sur notre site !

Notre premier container

Pour l’image de base, nous allons utiliser Debian.
Pour cela on se rend sur le site hub.docker.com et on cherche l’image officielle Debian.
Comme indiqué sur la partie droite du site on utilise la commande suivante :

docker pull debian

Docker va alors télécharger les différentes parties de l’image.
Chacune des images de Docker est une somme d’autres images ( vous vous souvenez de l’histoire du git ? c’est maintenant qu’on en parle 😉 ). Imaginez vous êtes Debra et Ian Murdock et vous avez l’intention d’inventer un système d’exploitation communautaire. Vous téléchargez alors l’image Scratch de Docker et vous y integrez tous les composants qui en feront une image aboutie. Aboutie ? non loin de la, vous la mettez évidement en ligne sur un service de partage de code ( Git ) a partir de ce moment, la magie se met en place et des inconnus se mettent a modifier votre image pour y intégrer leurs composants et sortir leur version de votre système ( Ubuntu par exemple ). Tout ceci est possible avec Docker. Car l’image finale est la somme de ses images mères. Et a tout instant une image finale est potentiellement une image mère pour une nouvelle image .. Vous comprenez l’idée ? Les possibilités d’améliorations sont infinies !

Notre image de base est donc en place sur notre machine.
Pour vérifier la liste des images en votre possessions utilisez cette commande :

docker images

La sortie de cette commande ressemble à ceci :

REPOSITORY            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
debian                latest              4a5e6db8c069        2 weeks ago         125.1 MB

L’important à retenir est que chaque image est nommée par un nom commun et surtout par un identifiant unique qui peut être utilisé dans sa forme courte comme ici.

Nous avons donc notre image lançons la !

docker run -it debian /bin/bash

La commande de lancement se compose toujours à minima du nom de l’image.
Tout le reste est optionnel ! Ici j’indique au container que je souhaite que Docker m’alloue un pseudo TTY ( -t ) et que tout se fera en mode interactif ( -i ), enfin je souhaite obtenir un shell bash lors de mon arrivée dans le container.

root@049bcd9faf95:/# cat /etc/debian_version 
8.1
root@049bcd9faf95:/# uname -ar
Linux 049bcd9faf95 4.1.6-1-ARCH #1 SMP PREEMPT Mon Aug 17 08:52:28 CEST 2015 x86_64 GNU/Linux

Nous voici dans le container !
Nous pouvons donc maintenant lancer les différentes commandes permettant de mettre en place un serveur web. ( je vous donne rendez vous une fois que tout est finit )

Pour terminer avec cette partie, il faut modifier la page web. Cependant vous pourrez remarquer qu’aucun éditeur de texte n’est disponible. Et pour cause, a quoi cela servirait il ? Voici la philosophie de Docker, si c’est inutile on ne l’embarque pas. Il va donc falloir installer soit même son éditeur de texte.

Pour la suite nous souhaiterons que notre serveur apache démarre directement au lancement du container, pour  cela il suffit d’utiliser le tricks suivant :

echo "/etc/init.d/apache2 start" > /etc/bash.bashrc

Maintenant nous allons sauvegarder notre travail ! En effet si vous quittez sauvagement le container ( CTRL + D ) tout sera perdu et vous pourrez tout recommencer !
La combinaison de touches CTRL+P CTRL+Q permet de s’échapper d’un container sans le détruire.

Vous pouvez vérifier avec « docker ps » que tout fonctionne encore.
On va d’ailleurs se servir du résultat de cette commande pour sauver le container.

La commande « docker commit » va nous permettre de transformer notre container en image ( image qui pourra ensuite servir de base pour un autre container .. vous avez compris 🙂 )

 

➜  ~  docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
049bcd9faf95        debian              "/bin/bash"         22 minutes ago      Up 22 minutes                           suspicious_nobel
➜  ~  docker commit 049bcd9faf95 debian_apache2
fdb2d3791edda192bc2ed603ab681cfe9d093d484d2f8a93eae7287e3f28c536
➜  ~  docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
debian_apache2        latest              fdb2d3791edd        37 seconds ago      268.4 MB

Et voila nous avons donc créé notre première image Docker !
Dernière étape de cet article la mise en réseau de notre container.
Pour le moment notre container n’était pas accessible, et ce pour une raison très simple, aucun de ses ports n’était ouvert.

On va donc cette fois lancer notre nouvelle image en demandant à docker de rediriger les flux d’un certain port vers le container.

docker run -dit -p 31337:80 debian_apache2 /bin/bash

L’option -d permet de créer le container mais sans entrer dedans.
L’option -p permet de définir un port X dont le flux sera redirigé vers le port Y du container.

Si vous souhaitez revenir/entrer dans un container utilisez la commande « docker attach » suivit de l’id du container.

A cet instant si on se rend sur : http://localhost:31337

Docker Rocks !

 

Voila ! C’est tout pour cet article sur Docker. J’espère qu’il aura pu vous donner les bases et que vous avez encore plus envie d’utiliser cet outil. Dans un prochain article je développerais les autres processus de création de containers.

N’hésitez pas à partager ! 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *