Retour aux articles
blog — devops — zsh$ cat devops.md# 15 juin 2022Docker expliqué sans teprendre la tête
5 min de lecture

Les containers c'est pas des VMs. Voilà ce que c'est vraiment, avec des analogies qui tiennent la route.

DockerContainersDevOps

“Ça marche sur ma machine”

Si t’as jamais entendu cette phrase, soit tu bosses seul, soit tu mens. L’app tourne nickel sur ton laptop, tu push, et ça explose en prod. Mauvaise version de Python. Librairie manquante. Chemin de config foireux. Un classique

Docker règle ça en empaquetant ton app avec tout ce qu’il lui faut pour tourner. Même environnement partout. Ton laptop, le laptop du collègue, la staging, la prod. Identique

L’analogie du container maritime

Avant les containers standardisés, le transport de marchandises c’était le bordel. Chaque navire avait des cales différentes. Chaque port avait des équipements différents. Charger un bateau prenait des semaines parce que les dockers devaient trouver comment empiler des trucs de tailles bizarres

Et puis quelqu’un a inventé le container standard. Même taille partout. Les navires sont conçus pour. Les ports sont équipés. Maintenant tu peux envoyer des marchandises de Shanghai à Rotterdam sans jamais ouvrir la boîte

Les containers Docker c’est la même idée pour le software. Tu packages ton app une fois, tu la fais tourner n’importe où y a Docker. L’hôte s’en fout de ce qu’il y a dedans. Une app Python? Java? Un truc legacy bizarre de 2008? Osef. C’est un container, ça tourne

Porte-conteneurs chargé de containers standardisés

Les containers c’est pas des VMs

Ça embrouille beaucoup de monde. Les machines virtuelles émulent des ordinateurs entiers. Elles ont leur propre kernel, leur propre OS, leur propre tout. C’est lourd, lent à démarrer, gourmand en ressources

Les containers partagent le kernel de l’hôte. Ce sont juste des process isolés avec leur propre système de fichiers. Léger, rapide à démarrer, efficace

Vois ça comme ça: une VM c’est louer un appart entier. T’as ta propre cuisine, ta salle de bain, tes murs. Un container c’est avoir ta chambre dans une coloc. T’as ton intimité et tes affaires, mais tu partages la plomberie et l’électricité

C’est pour ça que tu peux faire tourner 50 containers sur un laptop mais galérer avec 5 VMs

Y a quoi dans un container

Une image de container contient:

  • Le code de ton app
  • Le runtime (Python, Node, Java, ce que tu veux)
  • Les librairies système dont ton app a besoin
  • Les fichiers de config
  • Les variables d’environnement

Le tout empilé en couches. La couche de base c’est peut-être Ubuntu minimal. La couche suivante ajoute Python. Celle d’après tes dépendances. Celle du dessus ton code

Quand tu mets à jour ton code, Docker rebuild que la couche du haut. Le reste vient du cache. Des builds rapides, des téléchargements légers

Les bases

Pull une image:

docker pull python:3.11

Lance un container:

docker run -it python:3.11 python

T’es maintenant dans un shell Python à l’intérieur d’un container. Tu sors et il disparaît. Propre

Lance un truc utile:

docker run -d -p 8080:80 nginx

Ça fait tourner Nginx en tâche de fond, le port 80 dans le container mappé sur le 8080 de ta machine. Va sur localhost:8080, tu verras la page d’accueil Nginx

Liste les containers qui tournent:

docker ps

Arrêtes-en un:

docker stop <container_id>

Construis ta propre image

Voilà une app Python simple. Crée un fichier app.py:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello from Docker!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Maintenant crée un Dockerfile:

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY app.py .

EXPOSE 5000
CMD ["python", "app.py"]

Et un requirements.txt:

flask

Build:

docker build -t myapp .

Lance:

docker run -d -p 5000:5000 myapp

Va sur localhost:5000. Ton app tourne dans un container. Push cette image sur un registry et n’importe qui peut faire tourner exactement la même chose

L’argument du “j’ai qu’à utiliser virtualenv”

Ouais, virtualenv isole les packages Python. Mais ça isole pas:

  • Les librairies système
  • La version de Python elle-même
  • Les dépendances au niveau OS
  • Les chemins de fichiers
  • Les variables d’environnement

Ton app a besoin d’ImageMagick? Faut espérer que le serveur de prod a la même version. Elle a besoin d’un OpenSSL spécifique? Bonne chance

Les containers embarquent tout ça. L’environnement entier voyage avec ton app

Quand Docker a du sens

Bons cas d’usage:

  • Des environnements de dev cohérents dans une équipe
  • Les pipelines CI/CD
  • Déployer chez n’importe quel cloud provider
  • Faire tourner plusieurs services en local
  • Isoler les dépendances entre projets

Overkill:

  • Des scripts simples que tu lances une fois
  • Des outils locaux qui marchent très bien en natif
  • Quand t’es le seul à faire tourner le truc

Containerise pas tout juste parce que tu peux. Mais pour tout ce qui doit tourner ailleurs, les containers te sauvent du “ça marche sur ma machine” pour toujours

Une dernière analogie

Pense à une recette vs un plat

Un Dockerfile c’est une recette. Elle liste les ingrédients (image de base), les étapes de préparation (commandes RUN), et comment servir (CMD)

Une image c’est un plat surgelé. Préparé une fois, stocké, réchauffable n’importe où

Un container c’est le plat en train d’être mangé. Actif, en train de faire son taf, terminé quand c’est fini

T’écris la recette une fois. Docker prépare le plat surgelé. Tu le fais tourner quand t’en as besoin, où t’en as besoin

Voilà. Les containers c’est pas magique. C’est juste une très bonne façon d’empaqueter du software pour qu’il tourne pareil partout. Une fois que t’as pigé ça, le reste c’est que des commandes et de la config

Vous avez aimé cet article ?

Faites-le savoir ! Un partage, c'est toujours apprécié.

À propos de l'auteur

Sofiane Djerbi

Sofiane Djerbi

Architecte Cloud & Kubernetes, Expert FinOps. J'aide les entreprises à construire des infrastructures scalables, sécurisées et rentables.

Commentaires