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ù.
- Comprendre la conteneurisation : isolation et portabilité.
- Utiliser des images existantes du Docker Hub.
- Écrire son premier Dockerfile.
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
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
prenom@serveur:~$ sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
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.
prenom@serveur:~$ docker pull nginx:alpine
prenom@serveur:~$ docker run -d -p 8080:80 --name alpes nginx:alpine
prenom@serveur:~$ docker ps
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
# On part de l'image alpine (Linux mini, ~5 Mo)
FROM alpine:3.19
# La commande lancee au demarrage
CMD ["echo", "Hello depuis Docker !"]
prenom@serveur:~$ docker build -t hello-docker .
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
WORKDIR
COPY
RUN
ENV
EXPOSE
CMD
ENTRYPOINT
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
ubuntu / debian ~30-80
nginx ~25 Mo
httpd (apache) ~145 Mo
php varie
node ~50 Mo
python ~50 Mo
mysql / postgres ~200-400
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 !