Docker est une plateforme open source de virtualisation de conteneurs (développée en Go) destinée à construire, empaqueter, déployer et exécuter des applications ainsi que tous leurs envrionnements de dépendance (par exemple : une application Java nécessite l'environnement JDK pour s'exécuter, MySQL a besoin de bibliothèques comme OpenSSL, ncurses et zlib...).
Grâce à Docker, les développeurs peuvent empaqueter leurs applications et leurs environnements dans une unité légère et indépendante appelée conteneur.
Ces conteneurs peuvent s'exécuter dans n'importe quel environnement compatible Docker, garantissant un comportement cohérent de l'application entre différents environnements (développement, test, production...).
Les développeurs peuvent utiliser les mêmes conteneurs dans les environnements de développement, de test et de production, réduisant ainsi les problèmes causés par les différences d'environnement.
Avantages de Docker
- Portabilité : les conteneurs Docker peuvent s'exécuter dans n'importe quel environnement compatible Docker, y compris les environnements de développement local, de test et de production, améliorant ainsi la portabilité des applications.
- Extensibilité : les conteneurs Docker peuvent être rapidement étendus ou réduits en fonction des variations de charge, répondant ainsi mieux aux besoins des applications.
- Isolation : les conteneurs Docker fournissent un environnement d'exécution isolé, permettant aux applications s'exécutant dans différents conteneurs d'être isolées les unes des autres, évitant ainsi les interférences entre applications.
Architecture Docker
Docker repose sur une architecture client-serveur.
Le client Docker n'a besoin que d'envoyer des demandes au serveur Docker (démon), c'est-à-dire d'entrer des commandes, le serveur analyse et exécute les commandes puis renvoie les résultats.
Concepts clés de Docker
- Image : Une image Docker est un modèle en lecture seule qui contient tous les fichiers, dépendances, variables d'environnement, etc. nécessaires à l'exécution d'une application. L'image peut servir de base à des conteneurs, plusieurs conteneurs pouvant partager la même image.
- Conteneur : Un conteneur est une instance créée à partir d'une image, c'est un processus en cours d'exécution avec des espaces de noms, un système de fichiers et des limites de ressources indépendants. Les conteneurs peuvent être facilement démarrés, arrêtés, supprimés et peuvent être déplacés entre différents hôtes et environnements, garantissant ainsi la cohérence de l'environnement.
- Hub Docker : Docker Hub est un référentiel d'images public (officiel) où les développeurs peuvent trouver diverses images courantes et également télécharger leurs propres images pour que les autres les utilisent. De plus, Docker Hub prend en charge les référentiels d'images privés pour la gestion des images internes aux organisations.
- Référentiel : Divisé en référentiels publics et privés :
- Référentiel public : accessible à tous
- Référentiel privé : référentiel interne à une entreprise, pouvant être configuré avec Harbor
- Conteneur : Une instance dynamique créée à partir d'une image, contenant l'application en cours d'exécution et son environnement de dépendance.
- Dockerfile : Utilisé pour construire des fichiers d'images personnalisés. Par exemple, créer une image personnalisée pour un service utilisateur (application SpringBoot.jar) en utilisant dockerfile pour la construction.
- Docker Compose : Outil d'orchestration de conteneurs. Lorsque de nombreux conteneurs sont nécessaires, docker compose peut être utilisé pour les créer par lots et spécifier les dépendances entre les conteneurs.
Solutions pour les problèmes de connexion d'outils tiers à Linux
- Vérifier si le pare-feu est désactivé
- Vérifier si le conteneur est démarré
- Vérifier si le serveur IP est toujours accessible
- S'il n'y a pas d'IP, exécuter la commande dans le répertoire racine
Opérations Docker
Spécification de version
Recherche d'images
# Commande :
docker search mot-clé-image
# Exemple : recherche d'images dont le nom contient le mot-clé redis
docker search redis
Colonnes :
- name : Nom de la source du référentiel d'images
- description : Description de l'image
- official : Publié par l'équipe officielle Docker
- stars : Nombre de favoris de l'image, plus le nombre est élevé, plus l'image est populaire
- automated : Construction automatique
Téléchargement d'images
# tag représente l'étiquette de l'image, qui peut être considérée comme la version de l'image
docker pull nom-image[:tag]
# Exemple 1 : Téléchargement par défaut de la dernière image redis
docker pull redis # équivalent à docker pull redis:latest
# Exemple 2 : Téléchargement de l'image redis 7.0.10, pour connaître les étiquettes disponibles d'une image, consulter Docker Hub
docker pull redis:7.0.10
Visualisation des images locales
Commande :
docker images
Colonnes :
- repository : Nom de la source du référentiel d'images
- tag : Étiquette de l'image
- image id : ID de l'image
- created : Date de création
- size : Taille de l'image
Suppression d'images locales
# Suppression par nom:image
docker rmi nom-image:étiquette-image
# Suppression par ID d'image
docker rmi ID-image
Note : Si une image a des conteneurs associés, elle ne peut pas être supprimée. Il faut d'abord supprimer les conteneurs, puis l'image.
Consultation de la documentation d'aide
Docker fournit de nombreuses commandes, chacune pouvant avoir de nombreuses options de paramètres. Mémoriser toutes les commandes et leurs options n'est pas réaliste.
Vous pouvez consulter la documentation d'aide Docker pour apprendre les commandes courantes et l'utilisation des options de paramètres.
# Consulter les commandes disponibles dans docker
docker --help
# Consulter la documentation de la commande images
docker images --help
Opérations sur les conteneurs
Recherche de conteneurs
# Afficher les conteneurs locaux en cours d'exécution
docker ps
# Afficher tous les conteneurs, y compris ceux non exécutés
docker ps -a
Création de conteneurs
Types de conteneurs :
- Conteneur interactif : Possède un terminal d'entrée et de sortie interactif avec l'utilisateur, entre automatiquement dans le conteneur après sa création, et se ferme automatiquement après la sortie du conteneur.
# Création d'un conteneur interactif
docker run -it --name java01 java:latest /bin/bash
Sortie du conteneur : exit
/bin/bash ouvre une fenêtre de commande
Après la sortie du conteneur interactif, le conteneur se ferme et passe à l'état arrêté.
- Conteneur en arrière-plan : N'a pas de terminal interactif avec l'utilisateur, nécessite d'utiliser docker exec pour entrer dans le conteneur. Après la sortie, le conteneur ne se ferme pas.
# Création d'un conteneur en arrière-plan
docker run -id --name redis02 redis:latest
# Entrée dans le conteneur :
docker exec
docker exec -it java02 /bin/bash # Entrer dans le conteneur et ouvrir une fenêtre shell
Après la création, aucune fenêtre de commande ne s'ouvre, on reste toujours dans le terminal de l'hôte.
Gestion des conteneurs
docker stop nom-conteneur/ID-conteneur # Arrêter le conteneur
docker start nom-conteneur/ID-conteneur # Démarrer le conteneur
docker restart nom-conteneur/ID-conteneur # Redémarrer le conteneur
Suppression de conteneurs
docker rm nom-conteneur/ID-conteneur # Supprimer un conteneur arrêté
docker rm -f nom-conteneur/ID-conteneur # Forcer la suppression d'un conteneur en cours d'exécution
Note : Les commandes ci-dessus ne peuvent supprimer que les conteneurs déjà arrêtés. Pour supprimer un conteneur en cours d'exécution, ajoutez l'option -f.
Entrée dans les conteneurs
docker exec -it java02 /bin/bash # Entrer dans le conteneur et ouvrir une fenêtre shell
Autres commandes (journaux, copie, IP)
docker logs -f nom-conteneur/ID-conteneur # Consulter les journaux des processus du conteneur, -f pour la surveillance en temps réel
docker inspect nom-conteneur/ID-conteneur # Consulter les informations détaillées du conteneur
docker cp # Effectuer la copie de fichiers entre le conteneur et l'hôte
Exemples :
docker logs -f redis01 # Consulter en temps réel les journaux du conteneur redis01
docker inspect redis01 # Consulter les informations détaillées du conteneur, principalement : mappage de répertoires, mappage de ports, adresse IP
docker cp a.txt redis01:/root # Copier le fichier a.txt de l'hôte vers le répertoire root de redis01
docker cp redis01:/root/a.txt . # Copier le fichier a.txt du répertoire root du conteneur vers le répertoire actuel de l'hôte
Sauvegarde et migration
// Utilisation :
docker commit nom-conteneur/ID-conteneur nom-image # Sauvegarder un conteneur Docker en tant qu'image
docker save -o nom-fichier-tar-image nom-image/ID-image # Sauvegarder une image en tant que fichier tar
docker load -i nom-fichier-tar # Restaurer un fichier tar en tant qu'image
// Exemple :
docker commit mycentos10 mycentos # Sauvegarder le conteneur mycentos10 en tant qu'image
docker save -o mycentos.tar mycentos # Sauvegarder l'image mycentos en tant que fichier tar
docker rmi mycentos # Supprimer l'image mycentos précédente
docker load -i mycentos.tar # Restaurer mycentos.tar en tant qu'image
Modes de migration
Version personnalisée (peut être définie lors de l'installation)
Mappage de ports
Configuration du mappage de ports lors de la création du conteneur
Utiliser le port de l'hôte pour mapper le port du conteneur, accéder au port de l'hôte = accéder au port du conteneur
Port hôte : port conteneur
Volumes de données
Question à considérer : Les données stockées dans le conteneur Redis, si le conteneur Redis est supprimé, les données existent-elles toujours ?
Solution : Stocker les données dans le répertoire du disque de l'hôte Linux.
Présentation des volumes de données : Un volume de données est un répertoire virtuel fourni par Docker, ce répertoire virtuel correspond à un répertoire réel sur l'hôte.
Lors de la création d'un conteneur, ce volume de données peut être monté dans un répertoire spécifique du conteneur. Les données générées dans ce répertoire seront alors stockées dans le répertoire de l'hôte, réalisant ainsi le partage de fichiers entre le conteneur et l'hôte.
Répertoire réel de l'hôte : /var/lib/docker/volumes/redis-data/_data
Création d'un volume de données
docker volume create redis-data
Consultation des détails d'un volume de données
docker volume inspect nom-volume
Liste des volumes de données
docker volume ls
Suppression d'un volume de données
docker volume rm redis-data
Le répertoire physique du volume de données ne peut pas être modifié.
Montage de volumes de données
Les données générées dans le conteneur sont sauvegardées dans le fichier de l'hôte
Répertoire virtuel pointant vers le répertoire physique de l'hôte
- Montage lors de la création du conteneur
- Format : -v nom-volume:répertoire-conteneur
- Exemple : docker run -id --name=redis02 -p 6379:6379 -v redis-data:/data redis
Précautions :
- Si le volume de données n'est pas créé à l'avance, il sera créé automatiquement lors de la création du conteneur
- Le nom du volume de données n'est pas précédé de / lors du montage
- Si le répertoire du conteneur n'existe pas, il sera créé automatiquement
- Si le répertoire du volume de données n'est pas vide, le contenu du répertoire du volume de données écrasera le contenu du répertoire du conteneur
- Si le répertoire du volume de données est vide et que le répertoire du conteneur ne l'est pas, le contenu du répertoire du conteneur écrasera le contenu du répertoire du volume de données
Montage de répertoires
Montage d'un répertoire personnalisé avec un répertoire du conteneur
Création de Tomcat发现 les liens n'affichent pas de page
Raison : Le répertoire du conteneur ne contient pas de fichier index.jsp
Méthode de création du fichier index.html :
- Copier dans le répertoire
- Monter dans le répertoire
Scénarios d'application des deux méthodes de montage
Outil Portainer
Installation de Portainer
La gestion des conteneurs et des images ci-dessus est basée sur le client Docker via des commandes, ce qui n'est pas très pratique.
Pour faciliter la gestion des objets Docker (images, conteneurs, volumes de données...), on peut utiliser Portainer.
Portainer est un outil de gestion graphique et visuelle des conteneurs et des images, qui permet de construire, gérer et maintenir facilement l'environnement Docker.
Installation de Portainer
# Récupération de l'image
docker pull portainer/portainer
# Création et démarrage du conteneur portainer
# Montage du fichier docker.sock via -v, le conteneur portainer communiquera avec le démon Docker via ce fichier pour gérer les objets Docker.
# --restart=always signifie qu'il démarrera avec le service Docker
docker run -id -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
Démarre avec le service Docker (prérequis : le service Docker doit être configuré pour démarrer au démarrage du système : systemctl enable docker)
Le port de Portainer est 9000
Dockerfile
Introduction à Dockerfile
Les images que nous avons utilisées précédemment étaient toutes construites par d'autres, mais elles ne peuvent pas toujours répondre à nos besoins.
Comment construire une image personnalisée ? Utiliser Dockerfile.
Un Dockerfile est un fichier texte dans lequel on peut utiliser certaines instructions fournies par Docker pour spécifier les détails de la construction de notre image, et ultérieurement utiliser ce fichier Dockerfile pour construire notre propre image.
Le contenu du fichier Dockerfile se divise généralement en 4 parties :
1. Informations sur l'image de base (obligatoire)
2. Informations sur le mainteneur (optionnel)
3. Instructions d'opération sur l'image (optionnel)
4. Instructions exécutées au démarrage du conteneur (optionnel)
| Instruction | Utilisation | Fonction |
|---|---|---|
| FROM | FROM nom_image:tag | Spécifie une image source de base pour construire l'image, si elle n'existe pas localement, elle sera récupérée du référentiel public, si aucune étiquette n'est spécifiée, le tag par défaut latest sera utilisé, peut apparaître plusieurs fois si plusieurs images doivent être construites dans un même Dockerfile. |
| MAINTAINER | MAINTAINER nom_utilisateur | Décrit le créateur de l'image, nom et email |
| RUN | RUN "commande" "param1" "param2" | Utilisée pour exécuter certaines commandes, plusieurs commandes peuvent être écrites |
| ENV | ENV clé valeur | Définit les variables d'environnement du conteneur, plusieurs peuvent être définies |
| ADD | ADD répertoire_source/fichier | Copie les fichiers de l'hôte vers l'intérieur du conteneur, si c'est un fichier compressé, il sera automatiquement décompressé après la copie |
| ENTRYPOINT | ENTRYPOINT "commande" "param1" "param2" | Utilisée pour spécifier la commande exécutée au démarrage du conteneur |
Construction d'un conteneur JDK17
Méthode 1
- docker pull récupère une image de base centos:latest
Définition du conteneur pour qu'il démarre automatiquement au démarrage du système
docker update --restart=always nom-conteneur
Méthode 2 via un script Dockerfile
Création du fichier Dockerfile
FROM centos:7
RUN mkdir -p /usr/local/java
ADD jdk-17.0.7_linux-x64_bin.tar.gz /usr/local/java/
ENV JAVA_HOME=/usr/local/java/jdk-17.0.7
ENV PATH=$PATH:$JAVA_HOME/bin
Placer le fichier Dockerfile et le fichier tar dans le même répertoire
Utiliser la commande
docker build -t nouveau-nom-image .
Le point . à la fin signifie utiliser le fichier d'image personnalisé du répertoire actuel
Création d'un conteneur MySQL
Téléchargement de l'image mysql:8.0.30
docker pull mysql:8.0.30
Exécution de la commande suivante
# Création du conteneur. -e: définition des variables d'environnement --privileged=true permet aux processus à l'intérieur du conteneur d'avoir des permissions sur l'hôte
docker run -id --name=mysql -p 3306:3306 -v mysql_data:/var/lib/mysql -v mysql_conf:/etc/mysql --privileged=true -e MYSQL_ROOT_PASSWORD=1234 mysql:8.0.30
# Entrée dans le conteneur
docker exec -it mysql /bin/bash
mysql -uroot -p # Connexion à mysql
# Création et sélection de la base de données
create database docker;
use docker;
# Création de la table
CREATE TABLE `tb_school` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# Ajout de données de test
INSERT INTO `tb_school` VALUES (1, 'Shangguigu-Beijing', 'Beijing Changping Hongfu Technology Park Building 2 Floor 3');
INSERT INTO `tb_school` VALUES (2, 'Shangguigu-Shanghai', 'Shanghai Songjiang Valley Road North 166 Dayang Building 3 Floor');
INSERT INTO `tb_school` VALUES (3, 'Shangguigu-Shenzhen', 'Shenzhen Bao'an Western Silicon Valley Building B District 1 Floor');
INSERT INTO `tb_school` VALUES (4, 'Shangguigu-Xi''an', 'Xi'an Yantaqu Hefa Smart Building B Floor 3');
INSERT INTO `tb_school` VALUES (5, 'Shangguigu-Chengdu', 'Chengdu Chenghua Beichenxingqing Comprehensive Building 3 Floor');
INSERT INTO `tb_school` VALUES (6, 'Shangguigu-Wuhan', 'Wuhan East Lake High-tech Zone East Lake Valley Building 6 Floor 4');
Déploiement de SpringBoot
Plugin de packaging SpringBoot
Sans ce plugin, le fichier jar généré n'est pas un jar complet, il ne contient que les fichiers source du projet actuel.
Jar exécutable
Original est simplement le fichier de code source
FROM centos7-jdk17
MAINTAINER atguigu
EXPOSE 8081
ADD ebuy-docker-1.0-SNAPSHOT.jar /ebuy-docker-1.0-SNAPSHOT.jar
WORKDIR /
ENTRYPOINT ["java" , "-jar" , "ebuy-docker-1.0-SNAPSHOT.jar"]