Docker
1. Qu’est-ce que Docker ?#
Docker permet d’empaqueter une application et ses dépendances dans un conteneur isolé, qui peut être exécuté sur n’importe quel serveur. Il ne s’agit pas de virtualisation, mais de conteneurisation, une forme plus légère qui s’appuie sur certaines parties de la machine hôte pour son fonctionnement. Cette approche permet d’accroître la flexibilité et la portabilité d’exécution d’une application, laquelle peut tourner de façon fiable et prévisible sur une grande variété de machines hôtes, que ce soit sur une machine locale, un cloud privé ou public, une machine nue, etc
1.1 La diférence entre VM et conteneur Docker#
| Machine Virtuelle | Conteneur Docker | |
|---|---|---|
| OS | OS complet sur la VM | OS partagé avec l’hôte |
| Taille | Plusieurs Go | Quelques Mo |
| Démarrage | Minutes | Quelques secondes |
| Isolation | Forte (hyperviseur) | Bonne (namespaces noyau) |
Les conteneurs sont beaucoup plus légers car ils partagent le noyau du système hôte au lieu d’en embarquer un entier.
2. Installation sur Debian#
2.1 Configuration des sources APT#
# Add Docker's official GPG key:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
2.2 Installation des packages#
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2.3 Changement du CIDR par défaut des réseaux Docker#
Éditer le fichier /etc/docker/daemon.json :
{
"bip": "10.0.20.1/24",
"default-address-pools": [
{ "base": "10.0.20.0/18", "size": 24 }
]
}
La variable bip (Bridge IP) définit la plage d’adresses IP accordée à l’interface docker0.
La variable default-address-pools définit la plage d’adresses IP accordée à l’interface docker_gwbridge.
2.4 Redémarrer Docker :#
sudo systemctl restart docker
3. Utilisation#
3.1 Dockerfile - la recette#
FROM python:3.11-slim
WORKDIR /app
COPY . .
CMD ["python", "-m", "http.server"]
Le fichier Dockerfile d’un container est en quelque sorte la recette de cuisine du container. Dans cette exemple la première ligne définie l’image de base du container, permettant ne pas tout recréer. L’instruction WORKDIR permet de définir le répertoire de travail du container. COPY permet de copier des fichiers lors de la construction du container. Enfin CMD permet de définir la commande exécutée au lancement du container.
Voici la documentation officielle de Dockerfile : https://docs.docker.com/build/concepts/dockerfile/
3.2 Construction du container#
docker build -t nomDuContainer .
La commande est à taper dans le dossier où se trouve le fichier Dockerfile. Elle va créer une image du container avec comme nom nomDuContainer.
3.3 Lancement du container#
docker run -p 8001:8000 nomDuContainer
docker run -d -p 8001:8000 nomDuContainer
Ces deux commandes permet de lancer un container dont l’image est nomDuContainer.
L’argument -p 8001:8000 permet de lier le port 8001 de l’hôte sur le port 8000 du container.
L’arguement -d permet de lancer le container en tâche de fond et donc de récupérer le terminal quand le container est lancé.
3.4 Arrêt du container#
docker stop nomDuContainer
3.4 Logs du container#
docker logs nomDuContainer
3.5 Entrer dans le container#
docker exec -it nomDuContainer /bin/bash
4. Docker compose#
4.1 Fichier compose.yml#
services:
python:
image: python:3.15-rc-alpine
hostname: python
restart: unless-stopped
networks:
- network_python
web:
image: nginx:latest
hostname: web
restart: unless-stopped
ports:
- 80:80
- 443:443
networks:
- network_python
networks:
network_python:
driver: overlay
La structure du fichier compose est la suivante :
services:
python: # nom du service
image: python:3.15-rc-alpine # image du container
hostname: python # nom d'hôte du container
restart: unless-stopped # paramètre de redémarrage
networks: # réseaux docker branchés sur le container
- network_python
web:
image: nginx:latest
hostname: web
restart: unless-stopped
ports: # ports exposés sur le container
- 80:80
- 192.168.1.42:443:443 # la syntaxe IP_HOTE:PORT_HOTE:PORT_DOCKER permet de limiter sur l'hôte l'ip sur laquelle le port est ouvert
networks:
- network_python
networks: # paramétrage des réseaux
network_python:
driver: overlay
4.2 Lancement des containers#
docker compose up
docker compose -c compose.yml up
docker compose up -d
L’argurment -c compose.yml permet de spécifier le chemin du fichier compose lorsque le fichier ne se nomme pas compose.yaml, compose.yml, docker-compose.yaml, docker-compose.yml.
L’argument -d permet, comme pour la commande docker, de lancer les containers du compose en tâche de fond.
4.3 Arret des containers#
docker compose down
4.4 Logs des containers#
docker compose logs