Premiers pas avec Docker

Hands on Docker

« Docker par-ci, Docker par-là, Docker fait ci, Docker en prod, Docker l’outil qui réconcilie les développeurs et les admins système ». On entend parler de Docker partout, dans toutes les conférences et à toutes les sauces, mais qu’est ce que vraiment Docker et comment ça marche?
Chez SimplX, en tant que passionnés de nouvelles technologies, on ne pouvait pas se permettre de passer à côté de ça, et comprendre ce qui se cache derrière ce joli logo baleine.

Logo Docker

Docker : Késako

Docker est une technologie de virtualisation, plus précisément une plateforme de virtualisation par conteneur. Docker permet d’exécuter vos applications au sein d’un conteneur indépendamment de la machine sous-jacente. Si vous pensez virtualisation alors vous pensez machine virtuelle, mais Docker est bien plus léger puisqu’il n’embarque aucun système d’exploitation avec lui, et aucune caractéristique de machine physique. Vous exécutiez votre application sur votre machine de développeur avec telle ou telle caractéristique physique, tel OS, telle version de JVM, et vous vous apercevez que votre code ne fonctionne pas sur une autre machine. Docker est la clé, vous packagez votre applicatif dans un conteneur, avec toutes les dépendances dont il a besoin et fini les surprises lors du déploiement dans un autre environnement.

Et le logo prend donc tout son sens, car au même titre que les containers traditionnels utilisés pour le fret qui peuvent être pris en charge par n’importe quel transporteur car ils répondent au même standard peu importe le contenu, une application « Dockerisée » peut être exécutée sur n’importe quel hôte disposant de la plateforme Docker.

Pour les puristes système, l’isolation des conteneurs (processus, réseau, fichiers et montage), vis à vis du système hôte et des autres conteneurs est rendu possible grâce à l’utilisation des namespaces Linux. Un processus qui s’exécute dans un espace de nom correspondant à un conteneur ne sera visible que par ce conteneur et le système hôte exécutant ce conteneur. Pour en savoir plus sur la technologie sur laquelle repose Docker, je vous redirige vers la documentation officielle en anglais : Docker : The underlying technology

La plateforme Docker est composée de deux éléments principaux :
composants

  • Le démon Docker (docker daemon) qui s’exécute en arrière-plan et qui s’occupe de gérer vos conteneurs et les différents types d’objet Docker : images, conteneurs, réseaux, volumes de données
  • Le client Docker (docker CLI) qui vous permet d’interagir avec le démon par l’intermédiaire d’un outil en ligne de commande

Docker : Installation

Docker est compatible avec tous les OS, mais nous l’avons vu précédemment, il repose sur des fonctionnalités core de Linux, ce qui fait que le process d’installation est différent que vous soyez sur Linux ou un système non Linux. Sous Mac Os ou Windows, l’installation est accompagné de l’installation d’une machine virtuelle, qui sera elle en charge de l’exécution du daemon Docker. Si vous êtes sous Windows par exemple, ne soyez pas surpris de voir VirtualBox s’installer et démarrer lors du lancement de Docker.
Elle contient en particulier le CLI (command line interface) permettant d’exécuter toutes les commandes nécessaires à la création, construction d’image, et l’exécution de container ; ainsi que le Docker Engine, l’environnement d’exécution de ces images.

Dans les grandes lignes cela parait complexe, dans les faits il suffit de suivre le guide correspondant à votre plateforme, et l’installeur s’occupe de tout : Installation de Docker.

 

Docker : Mon premier container

Un container est le résultat du lancement d’une image docker. Alors qu’est ce qu’une image ?
Une image est le composant de base d’un container Docker. C’est un instantané d’un système d’exploitation (par exemple Debian). Ces images sont disponibles sur un dépôt public géré par Docker, le Docker Hub.
Si vous êtes familier avec GitHub, imaginez simplement que ce Docker Hub est pour les images Docker ce que Git est aux codes sources.

Docker est donc maintenant installé sur votre machine, vous êtes fier, c’est bien! Passons à la pratique. Vous pouvez directement lancer Docker en cliquant sur le raccourci Docker Quickstart Terminal ajoutée à votre bureau lors de l’installation précédente.

docker client

Veuillez noter l’adresse IP (en vert ci-dessus) de la machine Docker (Sous Windows et Mac, Docker tournant sous une VM Linux, l’IP de la « machine » Docker n’est pas l’IP de votre machine locale. Cette adresse est importante car ce sera le point d’entrée pour tous les containers dockers déployés. Si vous avez une image docker qui fait tourner un serveur web sur le port 8080 alors vous pourrez y accéder depuis votre machine directement via http://ip-ci-dessus:8080/

Vous êtes donc en mode ligne de commande sur votre docker Client, récupérons alors notre première image dans le but de lancer ce premier container. Nous récupérons ici l’image de la distribution linux CentOs, dans sa version la plus récente, grâce à la commande docker pull.

$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
08d48e6f1cff: Pull complete
Digest: sha256:b2f9d1c0ff5f87a4743104d099a3d561002ac500db1b9bfa02a783a46e0d366c
Status: Downloaded newer image for centos:latest

L’image, si elle n’est pas déjà disponible localement, est téléchargée depuis le repository public Docker. Si vous voulez récupérer une autre version que la dernière pour une même image, utilisez le pattern nomdelimage:version, exemple : $ docker pull centos:7

Pour voir les images Docker présentes sur votre plateforme, utilisez la commande suivante :
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0584b3d2cf6d 12 days ago 196.5 MB

A cette étape, nous avons validé que l’image est présente dans le repository local, l’environnement docker prêt pour une exécution de l’image.

Pour démarrer un container sur la base de cette image, une seule commande :

$ docker run -it centos bash
[root@e27d7461230f /]#

L’option -it permet de démarrer le conteneur en mode interactif, et on lui passe le nom de l’image pour laquelle on veut créer une instance « centos », ainsi que la commande en paramètre, ici « bash » pour qu’il démarre un shell (exécution de la commande bash classique dans un noyau linux).
A défaut de démarrer avec l’option -it, votre conteneur va s’exécuter et se terminer aussitôt, car sa durée de vie est lié à la durée de vie de la commande ou du processus principal qu’il exécute.

Vous pouvez maintenant exécuter n’importe quelle commande linux standard car vous êtes au sein d’un CentOS, elles s’exécuteront à l’intérieur du conteneur. Un rapide printf pour confirmer :
[root@2ef07979ebed /]# printf "Hello World"
Hello World[root@2ef07979ebed /]#

Voilà, vous êtes up & running avec Docker !!

Docker : les commandes principales

  • Lister les images présentes dans le repository local : docker images
  • Lancer un container : docker run nomducontainer
  • Lancer un container en interactif : docker run -it nomducontainer
  • Arrêter un container : docker stop idducontainer
  • Démarrer un container arrêté : docker start idducontainer
  • Lister les containers en cours d’exécution : docker ps
  • Lister tous les containers (inclus les containers stoppés) : docker ps -a
  • Supprimer un container : docker rm idducontainer
  • Supprimer une image : docker rmi nomdelimage

docker-3

Docker : Allez plus loin

Vous pouvez maintenant vous amusez à parcourir les images du repository public docker, démarrer des containers basés sur les images de votre choix, etc…
Le next step sera de créer votre propre image, mais cela fera l’objet d’un article dédié car c’est un vaste sujet.
En attendant, si vous voulez commencer à regarder plus en détail ce qui se cache derrière une image docker, chez SimplX nous avons uploadé une image docker sur Docker Hub : Image JupyterHub Simplx, image dont le code source est disponible ici : Dockerfile de l’image Jupyterhub de SimplX.

Cette image représente l’applicatif JupyterHub et ses dépendances, construit sur une distribution CentOS (celle utilisée dans cet article).
docker-2

Related Post

Authentification d’API...

Bienvenue en 2016, nous évoluons aujourd’hui dans un monde où tout n’est...

Documenter son code Angular...

Vous êtes fatigué(e) de lire et relire les lignes de code du dernier projet en...

Génération de variables...

Lorsque l’on développe une application Web ou mobile, il n’est pas rare...

Laisser un commentaire