Tuto - Découverte de Docker

Docker est une plate-forme open source pour les développeurs et administrateurs système pour développer, envoyer et exécuter des applications distribuées. Dans les faits, le résultat est un peu similaire à des VM, vous vous retrouvez avec des applications ( même complexes ), complètement portables, car elles embarquent leur environnement de travail.

Qu'est-ce que Docker

Voici une traduction plus ou moins fidèle de ce que l'on trouve sur le site officiel :

"Docker est une plate-forme open source pour les développeurs et administrateurs système pour développer, envoyer et exécuter des applications distribuées. Composé de Docker Engine, un outil portable et léger, d’exécution et de packaging, et de Docker Hub un service cloud pour partager des applications et automatiser le flux de production, Docker permet aux applications d'être rapidement assemblées à partir de composants et élimine la friction entre le développement, l'assurance qualité, et les environnements de production. En conséquence, l’ingénieur technique peut plus rapidement expédier et exécuter la même application, inchangée, sur les portables, un datacenter de VMs, et le cloud."

Pour faire simple, c'est génial :) 

Plus sérieusement, dans les faits, le résultat est un peu similaire à des VM, vous vous retrouvez avec des applications ( même complexes ), complètement portables car elles embarquent  leur environnement de travail. Le tout reste léger car contrairement au VM, Docker élimine toute la couche de virtualisation. Et vous aurez, grâce à Docker, la possibilité de les interconnecter en partageant entre elle et votre machine hôte ( votre ordinateur ou serveur hôte ) un port réseau ou des dossiers ( appelés volumes ).

Bref, toute la magie du Chroot, du Ulimit, du Mount, des règles réseaux et j'en passe, le tout dans un environnement cohérent, la magie de Linux en somme.

Installation de Docker

Sur Ubuntu l'installation de Docker est simple.

sudo apt-get install docker.io

Si vous utilisez un OS Linux plus exotique, pas de problème référez-vous à la documentation. Sinon si vous utilisez Windows ou Mac OSX, il existe Boot2Docker, c'est un Linux très léger qui vous permettra d'utiliser Docker sur vos OS propriétaires.

Introduction

La manipulation de Docker est plus confortable avec les accès root donc pour éviter d'écrire "sudo" tout le temps nous allons basculer en root :

sudo su

Avant de commencer, il faut maintenant comprendre la différence de notion entre une image et un conteneur. Une image, il faut la voir comme un Template. Ce n'est pas quelque chose sur laquelle on travaille directement, c'est plus comme une sauvegarde ou une base de départ, elle permet d’initier une instance appelée conteneur.

Les images dans Docker

Télécharger une image

Pour commencer il nous faut télécharger une image depuis le dépôt docker, par exemple une Debian :

docker pull debian:latest

Dans notre cas, et d'une manière générale, il vaut mieux spécifier ":latest" bien qu'il soit facultatif. Si vous ne le spécifiez pas, il vous téléchargera TOUTES les versions disponibles pour notre image. Cela représenterait une quinzaine d'images environ. En spécifiant ":latest" nous téléchargeons donc juste la dernière. 

Tout un tas d'images sont prédisponibles, des OS tels qu'Ubuntu, CentOS ou directement des applications tels Wordpress, NodeJS, MySQL et plein d'autres. Vous retrouverez le dépôt à cette adresse : https://registry.hub.docker.com/

Vous pouvez aussi effectuer des recherches d'images directement en ligne de commande, par exemple :

docker search debian

Voir et supprimer des images

Quand vous avez téléchargé des images, vous pouvez les lister avec :

docker image

Si vous souhaitez en supprimer une par exemple, c'est :

docker rmi debian:latest

Notez bien le "rmi", la commande rm existe mais elle concerne les conteneurs.

Les conteneurs

La commande RUN

La commande RUN est la colonne vertébrale de Docker, tout part de là. Mais attention, au début ça peut être franchement déroutant. Commençons par cette commande :  

docker run -i -t debian /bin/bash

Cette commande a pour effet de créer un conteneur avec comme base de départ notre image "debian" et avec le processus /bin/bash qui nous a permis d'avoir un accès à l’interpréteur bash ( le terminal ) de notre conteneur.

Vous remarquez les arguments "-i" et "-t". L'argument "-i" permet de ne pas interrompre le signal entre chaque commande, et l'argument "-t" permet d'avoir un pseudo terminal appelé pseudo-tty. Leur combinaison dans notre cas est donc essentielle pour prendre la main sur notre bash.

Attention ! Si vous quittez l’interpréteur ( ex : "exit" ), le conteneur sera arrêté. Si l'idée vous venez  de réexécuter la commande ci-dessus cela aurait pour effet de créer un second conteneur.

Nous verrons tout à l'heure les possibilités pour reprendre la main sur un conteneur.

Vous pouvez exécuter "docker run" seul pour prendre connaissance des autres arguments disponibles  et nous reviendrons plus tard sur l'utilisation de ceux-ci.

Lister les conteneurs

Comme je l'indiquais plus haut, en quittant notre terminal ( exit ) nous sortons et arrêtons de fait notre conteneur. Alors pour avoir la liste des conteneurs que nous avons créés :

docker ps -a

Normalement dans notre cas aucun conteneur n'est en cours d’exécution, mais pour voir tous les conteneurs en cours d’exécution seulement :

docker ps

Et pour voir le dernier conteneur modifié ou créé seulement :

docker ps -l

Vous noterez quelque chose de très important, à savoir : lorsque nous aurons besoin de cibler un conteneur nous pourrons le faire grâce à son Contener ID complet, les trois premiers caractères seulement ou par la dernière colonne : Name. Car, oui, en effet par défaut, chaque conteneur se voit attribuer un petit surnom comme : kickass_perlman ou autre pensive_poincare.

Reprendre la main sur un conteneur

Maintenant que nous savons comment récupérer le nom ou l'ID d'un conteneur, nous pouvons reprendre la main dessus en deux étapes. La première est de redémarrer notre conteneur avec la commande :

docker start kickass_perlman

Dans mon cas kickass_perlman correspond à mon conteneur il est donc à remplacer chez vous par le bon Name que vous aura donné la commande "ps".

Puis :

docker attach kickass_perlman

Éteindre un conteneur

Si vous souhaitez éteindre un conteneur que vous avez démarré rien de plus simple :

docker stop kickass_perlman

Toujours pareil, kickass_perlman est à remplacer par le nom de votre conteneur

Aller plus loin

Gestion des noms

Pour compléter et synthétiser un point important qui est la gestion des noms avec Docker voici un petit récapitulatif de la structure :

utilisateur/nomdelimage:laversion

Cette gestion des noms vous permet de télécharger une version particulière d'une image par exemple :

docker pull debian:wheezy

Dans le cas où vous voulez télécharger toutes les images nommées "apache-php" venues d'un autre utilisateur que le dépôt officiel, il faudrait écrire par exemple :

docker pull eboraas/apache-php

Une version plus complète pourrait ressembler à ceci :

docker pull eborass/apache-php:latest

Chercher la documentation

Pour en apprendre plus par vous même  vous devrez chercher la documentation à coup de "--help", mais dans notre cas la commande "docker" donnera la liste des commandes disponibles :

docker
Usage: docker [OPTIONS] COMMAND [arg...]
 -H=[unix:///var/run/docker.sock]: tcp://host:port to bind/connect to or unix://path/to/socket to use

A self-sufficient runtime for linux containers.

Commands:
    attach    Attach to a running container
    build     Build an image from a Dockerfile
    commit    Create a new image from a container's changes
    cp        Copy files/folders from a container's filesystem to the host path
    diff      Inspect changes on a container's filesystem
    events    Get real time events from the server
    export    Stream the contents of a container as a tar archive
    history   Show the history of an image

Pour en savoir plus sur le commit par exemple il nous faudra écrire :

docker commit

Quelques liens utiles

Conclusion

Le but de ce tutoriel est de vous donner les bonnes bases pour bien commencer avec Docker. Les informations en français sont relativement compliquées à trouver, mais la documentation en ligne est riche en précieuses informations.

Mais ce tutoriel est incomplet. Si vous avez acquis grâce à ce tutoriel une bonne prise en main de Docker, je vous invite maintenant à vous tourner du côté du Dockerfile qui est très important, car un des principes essentiels de Docker c'est sa capacité à déployer rapidement un conteneur configuré comme il le faut, et c'est possible grâce au Dockerfile.

J’espère que ce tutoriel vous aura bien aidé à appréhender Docker et vous aura donné le goût d'aller plus loin. Un second tutoriel arrivera, nous verrons la gestion du réseau, le DockerFile la liaison entre les conteneurs et nous utiliserons des exemples d'applications concrètes à déployer.

Mon dépôt sur le Docker Hub

Commentaires