Docker : présentation et premiers pas
Docker… ce fameux logiciel libre qui fait tant parler de lui depuis quelques années maintenant ! Nous allons aborder ici la notion de conteneurs, voir ce qu’est réellement Docker et pourquoi est-il si populaire, puis nous l’installerons et créerons ensemble un premier conteneur pour voir tout ça !
Pour faire simple, et selon la société Red Hat, le nom Docker fait référence au projet Open Source en premier lieu, puis à ses outils du même nom, et enfin à la société Docker Inc. qui constitue le principal soutient de ce fameux projet.
Ça ne nous avance pas réellement, n’est-ce pas ? Expliquons plus en détails dans ce cas ! Docker est donc un outil permettant d’empaqueter (de conteneuriser dirons-nous) des applications avec leurs dépendances, de façon à pouvoir exécuter cette dite application sur n’importe quel serveur GNU/Linux, qu’importe la distribution utilisée. Là, c’est bien plus clair et surtout ça peut devenir intéressant !
1) Conteneurs ≠ Virtualisation
Bien, nous allons donc d’abord voir un peu la différence entre une machine virtuelle classique, et un conteneur.
Pour faire simple, lorsque l’on créer une machine virtuelle, par exemple une VM pour un serveur Linux Debian, celle-ci va comporter un noyau Linux, ses librairies, et ses applications. Classique, et il en va de même si l’on souhaite créer une VM Windows.
Là ou ça devient intéressant, c’est qu’un conteneur (Docker ou non, mais nous verrons cela plus bas) ne va pas créer un nouveau noyau, il va s’appuyer sur le noyau de la machine hôte
Cela implique donc plusieurs choses :
- On ne peut (à l’heure actuelle) que créer des conteneurs GNU/Linux ;
- Les conteneurs, s’appuyant tous sur le noyau de l’hôte, n’ont pas besoin d’avoir le leur donc économie de ressources ;
- Économie de ressources comme dit précédemment, mais aussi économie au niveau du temps d’exécution, car redémarrer/migrer un conteneur est bien plus rapide qu’une machine virtuelle ;
Comme j’ai dit aussi, Docker n’est pas le seul logiciel permettant de créer des Dockers, et la création de conteneurs sous GNU/Linux ne date pas d’hier. En effet, de base nous avons LXC qui est inclut nativement au noyau linux (depuis sa version 2.6.24), et qui permet justement de créer des conteneurs. Docker est d’ailleurs basé sur celui-ci ! Le soucis, c’est que la plupart des utilisateurs le trouve assez austère, assez peu « user-friendly » et pour d’autres raisons un peu plus techniques.
2) Le fonctionnement de Docker
Docker utilise donc le noyau Linux pour séparer les processus afin que ceux-ci puissent s’exécuter de manière indépendante comme dit plus haut. Tout ceci est basé sur un modèle d’image : il est donc bien plus facile de partager une application ou un ensemble de services avec toutes leurs dépendances entre plusieurs environnements. Il est à noter qu’en plus de pouvoir empaqueter des applications, Docker permet aussi d’automatiser leur déploiement, mais nous le verrons par la suite.
Globalement, à l’installation, nous aurons trois composants :
- Le démon Docker, qui va se gérer de faire fonctionner nos
conteneurs ; - Le client Docker, qui va nous permettre tout simplement d’effectuer des commandes relatives aux conteneurs (création, modification, interaction…) ;
- Le logiciel DockerToolBox, qui permet d’utiliser Docker sur d’autres OS que GNU/Linux (MacOS, Windows…) et que l’on peut télécharger à part ;
Pour doucement rentrer dans le bain, nous allons directement passer à l’installation (ici, et comme souvent lors de mes labs, ce sera sur une Debian stretch) :
# On installe les dépendances requises
sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg2 curl
# On récupère et on ajoute la clé du dépôt
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
# On rajoute le fameux dépôt
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
# On met à jour sa liste de dépôts puis on installe Docker
sudo apt update
sudo apt install docker-ce
Bien, à partir de là Docker est installé et fonctionnel ! Nous allons donc aborder la fameuse notion d’Images Docker, qui est en réalité extrêmement simple.
Pour commencer, il faut savoir qu’il existe un Hub où se trouvent diverses Images -officielles ou non- de systèmes ou d’applications. Ces fameuses images, une fois téléchargées, peuvent être démarrées par Docker ; ce sont donc des templates de conteneurs ! Nous pouvons aussi créer un fichier de config Dockerfile qui va permettre de créer une image, qui ensuite pourra être utilisée pour créer un conteneur, mais nous verrons ça par la suite.
Nous allons prendre un cas concret. Je me rends sur le Docker Hub pour chercher une image d’un conteneur WordPress, qui comprendra donc un serveur web Apache, une base de données MySQL, les dépendances PHP, ainsi que WordPress lui-même… et bien pour cela, rien de plus facile :
On choisi l’image officielle :
En cliquant nous avons donc accès à toute la documentation, mais surtout au nom exacte de l’image pour pouvoir la télécharger !
Ensuite, nous allons passer à son installation…
3) Téléchargement & installation d’un conteneur WordPress
Bien ! Tout d’abord nous allons simplement voir en vitesse les différentes commandes de base proposées par Docker, puis nous pourrons ensuite télécharger notre image et créer notre conteneur.
- docker ps : affiche les conteneurs en cours d’exécution ;
- docker run nom_image : exécute une image, soit en la téléchargeant depuis le hub, soit en allant la cherchant en local si déjà téléchargée ;
- docker pull nom_image : télécharge une image depuis le hub ;
- docker pull debian:sid : télécharge une image depuis le hub mais en renseignant un tag supplémentaire affiché sur la page du conteneur, permettant par exemple ici de télécharger la version sid de l’image debian ;
- docker search nom_image : permet de rechercher une image ;
- docker rm nom_conteneur : permet de supprimer un conteneur ;
- docker image ps : affiche les images présentes en local ;
Bien, on peut (enfin ?) s’attaquer à notre premier conteneur ! Donc, nous allons déjà télécharger l’image de notre fameux conteneur WordPress :
docker pull wordpress
Ensuite, nous allons le démarrer :
docker run --name dev-lab-01 -ti -p 8080:80 wordpress
Comme toujours, on va décortiquer les arguments de cette commande !
- docker run, pour démarrer notre conteneur ;
- –name dev-lab-01, qui permet tout simplement de donner un nom à notre conteneur pour s’y retrouver ;
- -ti, permettant d’accéder au shell du conteneur directement après son exécution (sinon celui-ci reste en fond) ;
- -p 8080:80, qui permet de bind un port de l’hôte à un port du conteneur. Je m’explique : WordPress (ou plutôt Apache) tourne sur le port 80, nous avons donc bind le port 8080 de notre hôte sur le port 80 du conteneur pour que lorsque nous irons sur « ip-du-conteneur:8080 », cela nous redirige sur le port 80 du conteneur, c’est-à-dire sur le site WordPress qui sera entrain de tourner !
- wordpress, tout simplement le nom de l’image ;
Comme vous pouvez le voir, ce n’est rien de très compliqué ! Et encore une fois, le « -p 8080:80 » n’est pas obligatoire si notre conteneur n’a pas de serveur web.
Et tadaaaaa, nous voici à l’intérieur de notre premier conteneur ! Comme vous pouvez le voir avec la commande cat /etc/debian_version, nous sommes bien sur une Debian, pourtant ma machine hôte n’en est pas une !
Alors tout ça est très beau, mais si par mégarde vous faites un Ctrl + C ou un exit, vous vous rendrez compte que le conteneur n’a pas sauvegardé vos modifications… alors dans le cas d’un rm -rf /* (à ne JAMAIS faire !), vous serez bien content, mais si vous venez d’enfin réussir à faire fonctionner votre application web sur ce conteneur et qu’à la sortie, vous devez tout refaire… c’est un poil plus embêtant.
Il faut savoir que notre conteneur se base sur l’image que nous allons exécuter, c’est donc pour cela qu’aucune modification n’est enregistrée. Pour remédier à cela, il nous suffit de sauvegarder l’état actuel de notre conteneur et d’en faire une autre image, tout simplement !
Pour cela, on ouvre un second shell et on rentre ces commandes là :
# Cette commande nous permet de voir les différents changements comparés à l'image initiale
docker diff dev-lab-01
# Et pour sauvegarder ces changements dans une nouvelle image, il nous suffit de faire un "commit"
docker commit dev-lab-01 wordpress:test01
Ici j’ai nommé mon image wordpress:test01 mais j’aurais très bien pu la nommer test, c’était simplement pour rester un minimum cohérent 😉
Voici donc le résultat :
Et si l’on vérifie maintenant les images que l’on possède :
On peut clairement voir notre fameuse wordpress | test01 !
Et enfin, pour terminer en beauté, voici comment exporter notre image pour pouvoir la transférer sur d’autres serveurs ou même la publier sur le Hub !
docker save wordpress:test01 >> /var/lab/wordpress:test01.tar
Comme on peut le voir, la taille n’est que de 500Mo, ce qui est bien plus léger que pour une machine virtuelle ! Et encore, ici c’est une image assez grosse ; elle reprend apache, mysql, php, wordpress… bref, toute une pile logiciels.
Et bien je pense que l’on va pouvoir s’arrêter ici ! Pour cette première approche avec Docker, nous aurons vu la différence vm/conteneur, l’utilisation du hub, la création d’un conteneur, puis comment sauvegarder et exporter une image. Pas mal !
Laisser un commentaire