← Semaine 12
semaine 12 - conteneurs

Docker : le paquet cadeau de vos applications

Bienvenue dans le module Automatisations ! Première étape : emballer une application avec TOUT ce qu'il lui faut, et l'envoyer n'importe où.
le concept

Une image Docker, c'est un paquet cadeau

Dans la boîte, tout ce qu'il faut à votre application :

Le contenu
  • Code de l'application
  • Runtime / interpréteur (PHP, Node, Python...)
  • Bibliothèques système (libssl, libcurl...)
L'emballage
  • Outils CLI nécessaires
  • Fichiers de config (php.ini, nginx.conf...)
  • Variables d'environnement
« Ça marche sur ma machine » devient « ça marche partout », parce qu'on emballe la machine avec le code.
trois facons

Natif, VM ou conteneur ?

Installation native
L'app s'éparpille : /usr/bin, /etc, /var/lib, ~/.cache, PATH modifié... Désinstaller proprement = mission impossible.
Machine virtuelle
Un OS complet par app (module 2, VirtualBox !). Isolation parfaite mais lourde : chaque VM embarque son propre kernel.
Conteneur Docker
Tout reste dans la boîte. docker rm = tout disparaît, zéro résidu. Léger : pas de kernel embarqué.
l'architecture

Pourquoi si léger ? Le kernel partagé

Machine virtuelle
Matériel, OS hôte, hyperviseur (VirtualBox), puis UN OS INVITÉ COMPLET par application. Chaque app traîne son kernel.
Docker
Matériel, OS hôte, Docker Engine... et les conteneurs PARTAGENT le kernel de l'hôte. Trois apps, un seul kernel.

Docker ne virtualise rien : il isole des processus en utilisant le kernel de l'hôte. C'est la raison fondamentale de la différence de poids.

installation

Installer Docker sur Ubuntu

# 1. Ajouter le depot officiel Docker prenom@serveur:~$ sudo apt-get update prenom@serveur:~$ sudo apt-get install -y ca-certificates curl prenom@serveur:~$ sudo install -m 0755 -d /etc/apt/keyrings prenom@serveur:~$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc prenom@serveur:~$ sudo chmod a+r /etc/apt/keyrings/docker.asc # (+ la ligne deb ... docker.list du guide d'installation) # 2. Installer Docker Engine + Compose + Buildx prenom@serveur:~$ sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 3. Tester, puis se liberer du sudo prenom@serveur:~$ sudo docker run hello-world prenom@serveur:~$ sudo usermod -aG docker $USER prenom@serveur:~$ newgrp docker prenom@serveur:~$ docker run hello-world
docker hub

Les 4 commandes de tous les jours

Docker Hub (hub.docker.com) : la bibliothèque mondiale d'images prêtes à l'emploi.

# Telecharger l'image nginx (variante Alpine, ultra legere) prenom@serveur:~$ docker pull nginx:alpine # Lancer en arriere-plan, port 8080 hote -> 80 conteneur prenom@serveur:~$ docker run -d -p 8080:80 --name alpes nginx:alpine # Lister les conteneurs en cours prenom@serveur:~$ docker ps # Ouvrir un shell DANS le conteneur prenom@serveur:~$ docker exec -it alpes sh
vocabulaire

Trois mots à ne plus confondre

Dockerfile
La recette. Un fichier texte nommé exactement « Dockerfile », versionné dans Git.
Image
Le plan figé. Immuable, en lecture seule. Se stocke, se partage sur Docker Hub.
Conteneur
Le plan en action. On peut lancer 50 conteneurs depuis la même image.
Dockerfile → docker build → Image → docker run → Conteneur
premier dockerfile

Le Hello World de Docker : 3 lignes

# Fichier nomme exactement : Dockerfile # On part de l'image alpine (Linux mini, ~5 Mo) FROM alpine:3.19 # La commande lancee au demarrage CMD ["echo", "Hello depuis Docker !"]
# Construire l'image (le point = repertoire courant) prenom@serveur:~$ docker build -t hello-docker . # Lancer un conteneur depuis cette image prenom@serveur:~$ docker run hello-docker Hello depuis Docker !
Commencez toujours simple : ajoutez les lignes une par une et rebuildez à chaque fois.
les instructions

Les instructions essentielles (95 % du temps)

FROM # image de base a heriter FROM node:20-alpine WORKDIR # repertoire de travail WORKDIR /app COPY # copier hote -> image COPY package.json . RUN # commande pendant le build RUN npm install ENV # variable d'environnement ENV NODE_ENV=production EXPOSE # port que l'app ecoute EXPOSE 3000 CMD # commande au demarrage CMD ["node", "server.js"] ENTRYPOINT # point d'entree fixe ENTRYPOINT ["./run.sh"]
Astuce cache : Docker met chaque instruction en cache par couches. Mettez ce qui change souvent (votre code) en BAS du Dockerfile : les rebuilds deviennent instantanés.
exemple complet

Un Dockerfile PHP + Apache décortiqué

# On part d'une image officielle PHP+Apache FROM php:8.3-apache # Installer les extensions PHP necessaires RUN docker-php-ext-install pdo pdo_mysql # Copier le code source dans l'image COPY ./src/ /var/www/html/ # Variables d'environnement ENV APP_ENV=production # Port que le conteneur ecoute EXPOSE 80 # Commande lancee au demarrage CMD ["apache2-foreground"]
prenom@serveur:~$ docker build -t mon_php_app . prenom@serveur:~$ docker run -d -p 8080:80 mon_php_app
personnaliser

Personnaliser une image existante : 3 techniques

1. Étendre avec FROM
Le cas normal : hériter de l'image officielle et rajouter sa couche (COPY mon-site, COPY nginx.conf).
2. docker commit
Bricoler dans un conteneur vivant (run -it, apt install...) puis figer. Pratique mais PAS reproductible : pour la prod, Dockerfile.
3. Forker le Dockerfile
Chaque image officielle du Hub a un lien GitHub vers son Dockerfile : git clone, modifier, rebuild.
les images de base

Les images à connaître

alpine ~5 Mo # Linux ultra-mini, paquets via apk ubuntu / debian ~30-80 # distribution classique, outils standards nginx ~25 Mo # serveur web + reverse proxy httpd (apache) ~145 Mo # le Apache du module 1 ! php varie # php:cli, php:fpm, php:8.3-apache node ~50 Mo # runtime JavaScript python ~50 Mo # scripts, data, ML (-slim) mysql / postgres ~200-400 # bases configurees par variables d'env

Le pattern fréquent : nginx (ou apache) + php-fpm + mysql + votre code, orchestrés avec docker compose - le squelette de 80 % des projets web.

resume

Votre pile LAMP... en conteneurs

Le concept
Emballer la machine avec le code : isolation, portabilité, zéro résidu.
La chaîne
Dockerfile, build, image, run, conteneur.
La suite
Ces conteneurs, on va bientôt les lancer automatiquement : scripts, cron et services s'en viennent.

Au laboratoire de la semaine 12 : installez Docker et construisez vos premières images !