L'outil en ligne de commande Docker offre une gestion complète du cycle de vie des conteneurs. Pour afficher la liste des commandes disponibles, exécutez simplement la commande suivante :
docker
Une approche pédagogique efficace consiste à maîtriser d'abord les commandes de gestion des images, puis celles des conteneurs, et enfin les commandes relatives aux volumes de données et aux réseaux.
Gestion des images Docker
Lister les images locales
docker images
La sortie comprend les informations clés : le nom du dépôt (Repository), la balise (Tag), l'identifiant unique de l'image (Image ID), la date de création (Created) et la taille (Size).
Rechercher des images
docker search <nom_image>
Cette commande interroge Docker Hub et retourne le nom du dépôt, sa description, le statut de construction officiel (OFFICIAL), l'état de l'auto-build et le nombre d'étoiles (STARS).
Télécharger des images
# Télécharger une version spécifique
docker pull nginx:1.21
# Télécharger la dernière version (par défaut)
docker pull nginx
En environnement de production, il est fortement recommandé de spécifier une version précise pour éviter les incompatibilités potentielles liées aux mises à jour de la balise latest.
Supprimer des images
# Supprimer une image spécifique
docker rmi nginx:1.21
# Suppression forcée même si des conteneurs l'utilisent
docker rmi -f nginx
Gestion des conteneurs
Création et options principales
La commande de base pour créer un conteneur est :
docker run [options] nom_image [commande]
Les options essentielles incluent :
- Exécution en arrière-plan :
docker run -d nginxempêche l'arrêt du conteneur si le terminal est fermé. - Nommage personnalisé :
docker run -d --name=serveur_web nginxfacilite l'identification. - Mappage de ports :
docker run -d -p 8080:80 nginxexpose le port 80 du conteneur sur le port 8080 de l'hôte.
Exemple complet :
docker run -d --name=serveur_web -p 80:80 nginx:latest
Surveiller l'état des conteneurs
# Conteneurs en cours d'exécution
docker ps
# Tous les conteneurs (y compris arrêtés)
docker ps -a
Pour inspecter les détails d'un conteneur :
docker inspect serveur_web
Pour accéder à son environnement interne :
# Session interactive
docker exec -it serveur_web /bin/bash
# Exécution d'une commande unique
docker exec serveur_web ls /etc/nginx
Gestion du cycle de vie
Commandes pour contrôler l'état des conteneurs :
# Arrêt gracieux
docker stop serveur_web
# Démarrage d'un conteneur arrêté
docker start serveur_web
# Arrêt forcé
docker kill serveur_web
# Redémarrage
docker restart serveur_web
Suppression d'un conteneur :
# Suppression d'un conteneur arrêté
docker rm serveur_web
# Suppression forcée d'un conteneur actif
docker rm -f serveur_web
Configuration du redémarrage automatique :
# À la création
docker run -d --restart=always --name=serveur_web nginx
# Mise à jour d'un conteneur existant
docker update --restart=always serveur_web
Opérations à l'intérieur des conteneurs
Copie de fichiers :
# De l'hôte vers le conteneur
docker cp /chemin/local/index.html serveur_web:/usr/share/nginx/html/
# Du conteneur vers l'hôte
docker cp serveur_web:/etc/nginx/nginx.conf /chemin/local/
Consultation des journaux :
# Journaux complets
docker logs serveur_web
# Suivi en temps réel
docker logs -f serveur_web
# Dernières N lignes
docker logs --tail 100 serveur_web
Persistance des données avec les volumes
Pourquoi utiliser des volumes ?
Les conteneurs ont des limitations intrinsèques : les données disparaissent à l'arrêt ou à la suppression, l'échenge de fichiers avec l'hôte n'est pas direct, et le partage entre conteneurs nécessite une configuration dédiée.
Solution via les volumes
Un volume est un répertoire ou fichier sur l'hôte, monté dans un conteneur pour :
- Stocker les données de manière persistante.
- Partager des données entre l'hôte et les conteneurs.
- Partager des données entre plusieurs conteneurs.
Syntaxe de montage :
docker run -v /chemin/hôte:/chemin_conteneur nom_image
Règles importantes : utiliser des chemins absolus, le répertoire hôte est créé s'il n'existe pas, et un montage sur un répertoire vide écrase le contenu du conteneur.
Déploiement pratique avec persistance
Installation de MySQL
Étape 1 : Préparer les répertoires de volume.
mkdir -p /opt/mysql/{conf,data,logs}
Étape 2 : Télécharger l'image.
docker pull mysql:5.7
Étape 3 : Copier la configuraton initiale via un conteneur temporaire.
docker run -d --name=mysql_temp mysql:5.7
docker cp mysql_temp:/etc/mysql/ /opt/mysql/conf/
docker rm -f mysql_temp
Étape 4 : Lancer le conteneur MySQL final.
docker run -d \
--name=mysql_prod \
-p 3306:3306 \
-v /opt/mysql/conf:/etc/mysql \
-v /opt/mysql/data:/var/lib/mysql \
-v /opt/mysql/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=votremotdepasse \
mysql:5.7
Installation de Nginx
Préparation des répertoires.
mkdir -p /opt/nginx/{conf,html,logs}
Configuration avec un conteneur temporaire.
docker run -d --name=nginx_temp nginx
docker cp nginx_temp:/etc/nginx/ /opt/nginx/conf/
# Vérifier et recréer les liens symboliques si nécessaire
ln -sf /usr/lib/nginx/modules /opt/nginx/conf/nginx/modules
docker rm -f nginx_temp
Créer une page de test.
echo "test nginx" > /opt/nginx/html/index.html
Démarrer le conteneur Nginx.
docker run -d \
--name=nginx_prod \
-p 80:80 \
-v /opt/nginx/conf:/etc/nginx \
-v /opt/nginx/html:/usr/share/nginx/html \
-v /opt/nginx/logs:/var/log/nginx \
nginx
Pour vérifier, accédez à http://adresse_ip_hôte et confirmez l'affichage de "test nginx". Les logs se trouvent dans /opt/nginx/logs/access.log.
Installation de Tomcat
Préparer les volumes.
mkdir -p /opt/tomcat
docker run -d --name=tomcat_temp tomcat:9.0
docker cp tomcat_temp:/usr/local/tomcat/ /opt/tomcat/
docker rm -f tomcat_temp
Lancer le conteneur.
docker run -d \
--name=tomcat_prod \
-p 8080:8080 \
-v /opt/tomcat:/usr/local/tomcat \
tomcat:9.0
Bonnes pratiques
Pour la sécurité, évitez d'utiliser l'utilisateur root dans les conteneurs, mettez régulièrement à jour les images, et limitez les ressources :
docker run -d --memory=512m --cpus=1.5 nginx
Pour optimiser les performances, utilisez un fichier .dockerignore, gérez judicieusement les volumes, et employez des constructions multi-étapes pour réduire la taille des images.
En cas de conflit de port, changez le port mappé :
docker run -d -p 81:80 nginx
Pour déboguer un démarrage échoué, consultez les logs ou lencez une session interactive :
docker run -it --rm nom_image sh