Un article sans prétention aucune sur Docker. Certains l'adorent, d'autres le détestent. Personnellement, je fais partie de la première catégorie bien qu'étant sur Mac. Mais avant de discuter de ses avantages et inconvénients, reprenons depuis le début.
Qu'est-ce que Docker ?
Docker est un logiciel open source qui va nous permettre de faire tourner nos applications dans des conteneurs. À l'instar d'un système de virtualisation classique comme Vagrant avec Virtualbox, Docker, basé sur Linux, est nettement plus rapide et léger. Sa particularité est qu'il ne possède pas de système d'exploitation et qu'il se base sur les fonctionnalités disponibles sur la machine hôte. C'est pour cela que pendant longtemps seuls les développeurs travaillant sous linux pouvait l'utiliser sans contraintes. Fort heureusement, les choses ont changé ! Docker for Mac fonctionne très bien et Docker for Windows également ( à condition d'avoir Windows 10 Pro ).
Okay, mais à quoi ça peut me servir d'apprendre à utiliser Docker ?
On perd souvent beaucoup de temps à installer des outils sur notre machine physique, des fois juste pour "tester" quelque chose. Il n'y a pas longtemps d'ailleurs, j'ai eu besoin d'une base de données SQL Server ( SGBD de chez Microsoft... Je suis sur Mac ! ) dans le cadre d'une formation. Et bien, grâce à Docker, en une commande j'avais la solution à mon problème. Quand on est développeur, on est souvent amené à jouer avec beaucoup de technologies différentes. Le fait de pouvoir les créer simplement et rapidement en tant que conteneurs, et de les supprimer lorsque l'on en a plus besoin est un véritable plaisir.
Entrons de le vif du sujet !
Je ne connais pas toutes les commandes Docker, mais celles que j'ai acquises constituent pour moi un véritable couteau suisse. Pour commencer, rendez-vous sur docker et téléchargez la version qui correspond à votre environnement.
Une fois que c'est fait et que Docker est bien démarré sur votre système, vérifiez que l'installation est correcte en jouant l'image hello-world. Si vous avez le même résultat que moi, on va pouvoir passer à la pratique !
❯ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:8c5aeeb6a5f3ba4883347d3747a7249f491766ca1caa47e5da5dfcf6b9b717c0
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Le principe de Docker est de faire tourner nos applications dans des conteneurs. Prenons un exemple simple, un site internet statique que je souhaite faire tourner sur nginx. L'objectif est d'avoir dans mon conteneur le serveur web nginx ainsi que la page html que je souhaite afficher.
Pour construire ce container, je vais avoir besoin d'une image. Dans l'idéal, j'aimerais une image avec uniquement nginx. Il existe tout un lot d'images disponibles sur le site hub.docker.com. En cherchant nginx dans la barre de recherche, je trouve très rapidement l'image officielle. En regardant les images disponibles, vous allez peut être vous demander ce qu'est Alpine ? Et bien Alpine c'est une distribution très légère de linux. Personnellement, j'essaie toujours de la privilégier pour des questions de performances.
Pour créer notre premier conteneur docker, nous allons lancer la commande suivante :
❯ docker run -p 8080:80 nginx:1.19.3-alpine
L'option -p permet de dire "redirige moi le trafic provenant du port 8080 de la machine physique vers le port 80 du conteneur". Si vous allez dans votre navigateur sur localhost:8080, vous devriez voir "Welcome to nginx" ainsi que les headers de la requête dans votre terminal. Simple non ? :)
Maintenant, stoppez votre conteneur en faisant un simple Ctrl + C sur votre terminal. Si vous retournez sur localhost:8080, le site ne sera plus accessible.
On va relancer notre conteneur avec une option qui va permettre de le détacher de notre terminal.
❯ docker run -d -p 8080:80 nginx:1.19.3-alpine
187785a2e3fe67023c4a62b0a738f5f1930be560a1197c590f2c35342de7201f
Notre conteneur nginx est désormais détaché de notre terminal et son identifiant est cette longue chaîne de caractères. Il est possible très simplement de voir tout les conteneurs en place sur votre système grâce à la commande docker ps.
❯ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
187785a2e3fe nginx:1.19.3-alpine "/docker-entrypoint.…" 39 seconds ago Up 38 seconds 0.0.0.0:8080->80/tcp blissful_germain
Pas mal d'informations intéressantes nous sont fournies par cette commande docker. Je connais son ID, l'image sur laquelle le conteneur est construit, la commande lancée au démarrage du conteneur, le port et son nom ( que j'aurai pu définir lors de la création du conteneur en lui passant --name, mais là ça sera un nom aléatoire : blissful_germain )
Si jamais vous avez besoin d'entrer dans votre conteneur, vous pouvez le faire via cette commande
❯ docker exec -it blissful_germain sh
Cette commande peut être très utile pour comprendre un problème ou détecter un manquement dans la création de votre conteneur. Bien sûr, cette commande n'a pas de raison d'être utilisé sur une production.
Pour le moment, on n'affiche toujours pas de page web dans notre conteneur. Commençons par stopper puis supprimer le conteneur nginx qui tourne actuellement.
❯ docker stop blissful_germain
Cette commande va stopper le conteneur ( vous ne pouvez plus accéder à localhost:8080 ) mais le conteneur lui, existe toujours. Il n'est juste plus disponible. Vous pouvez d'ailleurs le redémarrer avec la commande inverse : docker start.
Si on veut vraiment gagner de l'espace disque, on va devoir le supprimer avec la commande suivante ( on peut ajouter l'option -f si le conteneur n'est pas stoppé et que l'on souhaite forcer sa suppression )
❯ docker rm blissful_germain
A partir de ce moment là, on a perdu notre conteneur. On ainsi pouvoir le recréer en y ajoutant notre magnifique site internet en HTML. J'ai créé sur mon ordinateur un répertoire monsite dans lequel j'ai mis un fichier index.html ( qui contient juste mon Hello World ).
Je vais relancer ma commande en ajoutant l'option -v qui va me permettre de monter un volume dans mon conteneur.
❯ docker run -p 8080:80 -v /Users/ychocteau/monsite/:/usr/share/nginx/html:ro -d nginx
Et si vous retournez sur localhost:8080 ... Victoire ! On voit notre Hello World :)
Avec la pratique, vous allez voir que l'on se retrouve toujours à devoir gérer des problèmes d'espace disque. En effet, les images, volumes, conteneurs stoppés prennent de la place sur votre système. Fort heureusement, il existe une commande qui permet de faire le ménage sur votre système.
❯ docker system prune -a --volumes
Cette commande supprime tout ce qui n'est plus utilisé sur votre système et libère ainsi beaucoup de mémoire !