PRÉ-REQUIS: Un compte d’accès à hub.docker.com
La vidéo suivante n’a rien avoir avec le cours mais est fortement instructive comme introduction aux technologies de la virtualisation matérielle.
Lors du dernier module, nous avons apprivoisé quelques commandes de base sur des conteneurs d’images préexistantes.
Pourquoi ne pas créer notre propre image à partir du conteneur d’une de ces images?
# Afficher l'aide de docker docker # Afficher l'aide d'un sous-système docker docker container -- help docker container ls # Recherche d'une image sur hub.docker.com docker search arch # Obtenir une image de hub.docker.com docker pull archlinux # Démarrer un conteneur en arrière plan docker run -d archlinux # Le conteneur archlinux n'a pas de tâche en boucle il va donc s'arrêter. # Démarrer un conteneur en mode interactif docker run -it archlinux #Installer nano dans le conteneur archlinux pacman -Sy nano nano hello.txt exit # La commande 'exit' provoque l'arrêt du conteneur # Il est possible de sortir sans provoquer l'arrêt avec CTRL P+Q docker ps docker ps -a # Démarrer un conteneur arrêté - sans créer une nouvelle instance docker start ID-archlinux # Note restart = stop/start docker attach ID-archlinux exit NOTE: le conteneur s'est arrêté. # Exécuter, en mode interactif, une commande d'un conteneur docker start ID-archlinux docker exec -it ID-archlinux /usr/bin/bash exit docker ps # Note: le conteneur roule toujours car 'exec' s'exécute dans une file différente. # Renommer un conteneur docker rename [name-archlinux|ID] nouveauNom # Effacer un conteneur docker rm ID-conteneur # Effacer une image docker rmi ID-Image # Exécuter un conteneur avec une fusion de ports IP docker run -d --name web1 -p 80:80 nginx docker run -d --name web2 -p 81:80 nginx # Tester le serveur web1 curl localhost:80 # Afficher les logs d'un conteneur docker logs web1 # Afficher les statistiques des conteneurs - CRTL C pour quitter. docker stats # Lister le ID de tous les conteneurs d'une image docker ps -a --filter="ancestor=nginx" # Lister le ID de tous les conteneurs dont le nom est comme: docker ps -a -q --filter="name=web" # Arrêter tous les conteneurs d'une image docker stop $(docker ps -a -q --filter="name=web") # Effacer tous les conteneurs d'une image docker rm $(docker ps -a -q --filter="ancestor=nginx")
Ici, nous nous apprêtons à créer un dépôt de conteneurs pour un projet à venir. Nous pourrons, par la suite, y archiver toutes les versions du projet.
1.0 – En utilisant votre compte personnel, connectez-vous à hub.docker.com
1.1 – Sélectionner l’item menu ‘Repositories, suivi de l’option ‘Create …’
1.2 – Renseigner les informations de départ du nouveau dépôt 420-4d4
Note: Que des caractères minuscules dans le nom.
1.3 – Consulter le sommaire du nouveau dépôt
Évidement, ne voulant pas avoir à programmer, à partir de rien, une serveur web 😉, nous allons bâtir notre fondation sur l’image de nginx.
2.1 – Créer un conteneur ´web01´ à partir de l’image nginx:latest
docker run -d --name web01 -p 80:80 nginx
2.2 – Se connecter au ‘shell’ du conteneur ‘web01‘
docker exec -it web01 /bin/bash
2.3 – Installer, dans le conteneur, l’éditeur de texte ‘nano‘
apt update apt install nano
2.4 – Remplacer le contenu du fichier ‘/usr/share/nginx/html/index.html‘
rm /usr/share/nginx/html/index.html nano /usr/share/nginx/html/index.html
2.5 – Par le code suivant:
<!DOCTYPE html> <html> <head> <title>Bienvenue au cours 420-4D4</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } h1 { color: #6f82bf; font-weight: normal; } </style> </head> <body> <h1>Bienvenue au cours 420-4D4</h1> <p>Si vous voyez cette page, c'est que tout va bien!</p> <p>L'image docker est disponible avec 'docker pull VOTRECOMPTE/420-4d4:1.0' <br/><br/> Pour lancer le conteneur:<br/><br/><strong> docker run -it -d -p 80:80 --name serveurweb VOTRECOMPTE/420-4d4:1.0</strong><br> <br/><a href="http://ve2cuy.com/420-4d4b/">Contenu du cours</a>.</p> <p><em>Ceci est la version 1.0 de l'application<br/><br/>(c) Votre prénom nom - 2023</em></p> </body> </html>
2.6 – Quitter le ‘shell’ du conteneur et tester le serveur web:
exit
Note: L’exécution du conteneur ne sera pas arrêtée par cette opération, car nous nous sommes connectés avec la commande ‘exec‘
À ce point, nous avons adapté un conteneur à nos besoins. Il est temps d’en faire une image qui pourra être, par la suite, distribuée à l’infini.
3.1 – Créer une image dont le nom est composé de votre nomDomaineDocker/nomDépôt:version(tag)
docker ps docker commit web01 VOTRECOMPTE/420-4d4:1.0
3.2 – Vérifier la présence de la nouvelle image
docker images
3.3 – Connexion au compte hub.docker.com
Pour être en mesure de pouvoir publier notre nouvelle image sur hub.docker, il faut obligatoirement s’authentifier, à partir de votre fenêtre terminal ou, alternativement, via l’application ‘docker desktop’.
Voici comment y arriver:
docker login --username=VOTRECOMPTE password: FOURNIRLEMOTDEPASSE (ou TOKEN)
Au besoin, il faut créer un « Access Token »
3.4 – Publier (push) l’image vers le dépôt 420-4d4 sur hub.docker.com
Maintenant que nous sommes authentifiés au dépôt docker il ne nous reste plus qu’à publier la nouvelle image en utilisant la commande suivante:
docker push VOTRECOMPTE/420-4d4:1.0
3.5 – Vérifier la présence de l’image sur votre dépôt hub.docker
4.1 – Obtenir et exécuter l’application en utilisant le port 88
docker run -d -p 88:80 --name web-test VOTRECOMPTE/420-4d4:1.0
4.2 – Tester dans un fureteur
Nous avons maintenant accès, à partir d’un dépôt hub.docker, à l’image personnalisée d’un serveur nginx, qui propose une page d’accueil sur mesure ainsi que l’éditeur de texte ‘nano‘.
TRISTESSE – À chaque fois que nous recréons un conteneur à partir d’une image, nous retrouvons le système de fichiers dans son état de départ.
Cela pose un problème non négligeable lors des mises à jour de l’image.
Pour contrer cet état de fait, docker propose les stockages persistants.
Grace à une série d’exemples, voyons comment cela fonctionne.
5.1 – Créer un répertoire local pour les fichiers du site web
mkdir /home/alain/docker-folder/siteweb
5.2 – Créer le fichier info.html dans le répertoire de l’étape 5.1
<center><h1>Vive le sirop d'&eacute;rable ;-)</h1></center>
5.3 – Démarrer un conteneur à partir de la syntaxe suivante:
docker run --name mon-nginx -v /home/alain/docker-folder/siteweb:/usr/share/nginx/html:rw -d -p 8080:80 nginx # Sous Windows: docker run --name mon-nginx -v C:\Users\4204D4\semaine02:/usr/share/nginx/html:rw -d -p 8080:80 nginx
5.4 – Tester la page ‘info.html‘ dans un fureteur
http://localhost:8080/info.html
Wow, quelle merveilleuse page web ☺️ :
5.5 – Ajoutons un peu plus de substance à notre site web:
Dans un dossier de téléchargement, par exemple, : /home/$USER/download,
git clone https://github.com/creativetimofficial/bootstrap4-cheatsheet.git
5.6 – Déplacer l’app vers le dossier lié au conteneur:
mv bootstrap4/ /dossier/web/conteneur/bs
5.7 – Tester l’app – http://localhost:8080/bs/
Wow, vraiment làlà, une merveilleuse page web 👍:
Note: Nous n’avons pas à publier une nouvelle version de l’image de l’application. Les nouveaux contenus sont stockés localement.