Docker est une plateforme de conteneurisation qui permet d'empaqueter une application avec toutes ses dépendances. Les conteneurs sont légers, rapides et portables.
Pourquoi utiliser Docker ? - Isolation des applications - Portabilité (fonctionne partout) - Déploiement rapide - Ressources minimales
sudo apt update
sudo apt install -y docker.io docker-compose
sudo systemctl start docker
sudo systemctl enable docker
docker --version
docker-compose --version
docker run hello-world
Registre public contenant des milliers d'images prédéfinies.
# Télécharger une image
docker pull nginx
docker pull ubuntu:22.04
docker pull python:3.11
# Lister les images locales
docker images
docker images -a
# Supprimer une image
docker rmi nginx
docker rmi -f nginx
# Mode interactif
docker run -it ubuntu /bin/bash
# Mode détaché (arrière-plan)
docker run -d --name mon_nginx -p 8080:80 nginx
# Avec variables d'environnement
docker run -d --name ma_db -e MYSQL_ROOT_PASSWORD=mdp123 mysql
# Avec volume persisté
docker run -d -v /data:/app --name mon_app ubuntu
# Avec restart automatique
docker run -d --restart=always --name nginx nginx
| Option | Description |
|---|---|
-d |
Mode détaché |
-p |
Mapping de ports (hôte:conteneur) |
--name |
Nom du conteneur |
-v |
Volume |
-e |
Variable d'environnement |
--restart |
Politique de redémarrage |
--network |
Réseau Docker |
# Lister les conteneurs
docker ps # actifs
docker ps -a # tous
docker ps -q # juste les IDs
# Arrêter/démarrer
docker stop mon_nginx
docker start mon_nginx
docker restart mon_nginx
# Supprimer
docker rm mon_nginx
docker rm -f mon_nginx # forcer
# Voir les logs
docker logs mon_nginx
docker logs -f mon_nginx # temps réel
docker logs --tail 100 mon_nginx
# Exécuter une commande
docker exec -it mon_nginx bash
docker exec mon_nginx cat /etc/hostname
# Inspecter un conteneur
docker inspect mon_nginx
docker stats mon_nginx # ressources en temps réel
# Commentaire
FROM ubuntu:22.04
# Mise à jour et installation
RUN apt update && apt install -y python3 python3-pip
# Variable d'environnement
ENV APP_ENV=production
# Répertoire de travail
WORKDIR /app
# Copier les fichiers
COPY requirements.txt .
COPY . .
# Exposer un port
EXPOSE 5000
# Commande par défaut
CMD ["python3", "app.py"]
| Instruction | Description |
|---|---|
| FROM | Image de base |
| RUN | Commande à exécuter |
| COPY | Copier des fichiers |
| WORKDIR | Répertoire de travail |
| ENV | Variable d'environnement |
| EXPOSE | Port à exposer |
| CMD | Commande par défaut |
| ENTRYPOINT | Point d'entrée |
# Construire l'image
docker build -t mon_app:latest .
# Vérifier
docker images | grep mon_app
# Lancer
docker run -d -p 5000:5000 --name mon_app mon_app:latest
docker volume create mes_donnees
docker run -d -v mes_donnees:/data --name app ubuntu
docker run -d -v ~/mon_repertoire:/app --name app ubuntu
docker run -d --tmpfs /tmp --name app ubuntu
# Lister
docker volume ls
# Inspecter
docker volume inspect mon_volume
# Supprimer
docker volume rm mon_volume
docker volume prune # nettoyer les volumes inutilisés
# Lister les réseaux
docker network ls
# Créer un réseau personnalisé
docker network create mon_reseau
# Créer avec driver spécifique
docker network create --driver bridge mon_reseau
# Lancer sur un réseau
docker run -d --network mon_reseau --name web nginx
docker run -d --network mon_reseau --name db mysql
# Les conteneurs peuvent maintenant se contacter par nom
Les conteneurs sur le même réseau peuvent se trouver par leur nom.
Docker Compose permet de définir et exécuter des applications multi-conteneurs.
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- api
networks:
- frontend
- backend
api:
build: ./api
environment:
- DB_HOST=db
depends_on:
- db
networks:
- backend
db:
image: postgres:15
environment:
- POSTGRES_PASSWORD=mdp123
- POSTGRES_DB=mondb
volumes:
- db_data:/var/lib/postgresql/data
networks:
- backend
networks:
frontend:
backend:
volumes:
db_data:
# Lancer tous les services
docker-compose up
docker-compose up -d # détaché
# Arrêter
docker-compose down
docker-compose down -v # supprimer aussi les volumes
# Logs
docker-compose logs -f
docker-compose logs -f web # service spécifique
# Statut
docker-compose ps
docker-compose top
# Reconstruire
docker-compose build
docker-compose up --build
docker run -d -p 80:80 --name nginx nginx:alpine
docker run -d \
--name postgres \
-e POSTGRES_PASSWORD=mdp123 \
-e POSTGRES_DB=mondb \
-v pgdata:/var/lib/postgresql/data \
postgres:15
docker run -it -p 5000:5000 -v $(pwd):/app python:3.11 sh -c "pip install flask && cd /app && flask run --host=0.0.0.0"
docker run -d -p 9090:9090 --name prometheus prom/prometheus
# Ne pas exécuter en root
USER nobody
# Scanner les vulnérabilités
docker scan mon_image
# Utiliser des images officielles
docker pull nginx:latest
# Combiner les couches RUN
RUN apt update && apt install -y package1 package2 && rm -rf /var/lib/apt/lists/*
# Utiliser des images légères
docker pull alpine
docker pull nginx:alpine
# Nettoyer les caches
docker builder prune
.git
node_modules
__pycache__
*.log
.env
# Voir tous les conteneurs (même arrêtés)
docker ps -a
# Logs en temps réel
docker logs -f --tail 50 conteneur
# Ressources utilisées
docker stats
# Entrer dans le conteneur
docker exec -it conteneur bash
# Inspecter la configuration
docker inspect conteneur
# Voir les processus
docker top conteneur
# Redémarrer un conteneur planté
docker restart conteneur
# Nettoyer tout
docker system prune -a
| Commande | Action |
|---|---|
docker pull image |
Télécharger une image |
docker run -d -p 80:80 --name nom image |
Lancer un conteneur |
docker ps |
Lister les conteneurs actifs |
docker stop nom |
Arrêter |
docker rm nom |
Supprimer |
docker exec -it nom bash |
Terminal dans le conteneur |
docker logs -f nom |
Voir les logs |
docker build -t nom . |
Construire une image |
docker-compose up -d |
Lancer une application |
docker volume create nom |
Créer un volume |
docker network create nom |
Créer un réseau |