docker hub – Introduction

27 janvier 2021

Publier une IMAGE à partir d’un conteneur PERSONNALISÉ et Stockage PERSISTANT

Dans ce module nous verrons comment;

PRÉ-REQUIS: Un compte d’accès à hub.docker.com


Mise en situation

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?


Mais avant, un petit retour en arrière

# 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")

Étape 1 – Créer un nouveau dépôt sur hub.docker.com

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


Étape 2 – Personnaliser un conteneur à partir de l’image de nginx

É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 commandeexec


Étape 3 – Créer une image à partir du conteneur

À 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.2Vérifier la présence de la nouvelle image

docker images

3.3Connexion 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.4Publier (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.5Vérifier la présence de l’image sur votre dépôt hub.docker


4 – Tester l’image qui se trouve sur hub.docker.com

4.1Obtenir 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.2Tester dans un fureteur


4.3 – Conclusion

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‘.


Étape 5 – Stockage persistant

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

&lt;center&gt;&lt;h1&gt;Vive le sirop d'&amp;eacute;rable ;-)&lt;/h1&gt;&lt;/center&gt;

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.5Ajoutons 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.6Déplacer l’app vers le dossier lié au conteneur:

mv bootstrap4/ /dossier/web/conteneur/bs

5.7Tester 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.


Laboratoire

  1. En utilisant votre compte hub.docker.com, créer un dépôt labo-01
  2. Bâtir un conteneur personnalisé à partir de l’image apache officielle
  3. Installer au besoin, dans le conteneur, les outils requis pour réaliser la tâche; apt update, apt install, …
  4. Remplacer la page d’accueil par l’application web du bootstrap-cheat-sheet.  L’application doit être installée dans le conteneur et non pas dans un dossier lié.
  5. Tester le conteneur sur le port 8080 – le bootstrap-cheat-sheet doit s’afficher sans fournir de nom de dossier dans l’URL.
  6. Corriger au besoin
  7. Créer une image, à partir du conteneur personnalisé, sous le nom ‘VotrenomDomaineDocker/labo-01:latest
  8. Publier l’image dans votre dépôt docker
  9. Effacer l’image locale – rmi
  10. Exécuter l’image à partir de votre dépôt docker.
  11. Afficher la page d’accueil du serveur web

Document rédigé par Alain Boudreault (c) 2021-2023 – révision 2023.01.31.01