49 0 933KB
Tekup 2020/2021
T.ABAR, K.AMMAR, M.Ben SAID, Y.ABASSI
TP Conteneurisation : Docker L’objectif principal de ce TP est de se familiariser avec les aspects nécessaires pour le déploiement d’applications virtuelles en exploitant la technologie des containers. Cette technique de virtualisation sera exploitée et exécutée en utilisant le gestionnaire de containers Docker. Pour ce faire, ce TP est organisé comme suit : Mise en place et installation de Docker (sous Linux) Manipulation d’un conteneur simple, Hello world
Outils Les outils qui seront utilisés tout au long de ce TP sont comme suit : Ubuntu desktop (ubuntu-18.04).
Prérequis Disposer des droits d'administration. Disposer d'une connexion à Internet configurée et activée.
Installation de Docker Docker est un projet open-source sous licence Apache 2 pour automatiser le déploiement d'application sous forme de containers LXC (conteneurs Linux). Il permet de créer un container sur une machine puis de l'exécuter sur n'importe quelle autre. Il fournit un dépôt de conteneurs avec des images officielles et des images créées par les utilisateurs enregistrés, un peu à la manière des dépôts GIT. Docker nécessite une installation 64 bits quel que soit votre version d'Ubuntu. En outre, votre noyau doit être 3.10 au minimum. Les anciens noyaux (moins de 3,10) manquent certaines des caractéristiques nécessaires à l'exécution des conteneurs Docker. Pour vérifier votre version actuelle du noyau, ouvrez un suivante :
terminal et utilisez la commande
$ uname –r
1- Advanced Packaging Tool (APT) est un système complet et avancé de gestion de paquets, permettant une recherche facile et efficace, une installation simple et une désinstallation propre
Tekup 2020/2021
T.ABAR, K.AMMAR, M.Ben SAID, Y.ABASSI
de logiciels et utilitaires. La première étape de ce TP consiste à faire la mise à jour des informations de package et de vérifier que APT prend bien en charge la méthode https, et que les certificats CA sont installés. $ sudo apt-get update $ sudo apt install apt-transport-https ca-certificates curl software-properties-common
2- Pour ajouter un nouveau dépôt et afin d’éviter le message d’avertissement indiquant que le dépôt n’est pas identifié, il est nécessaire dans un premier temps d’installer la clé GPG du dépôt sur le serveur. $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Ensuite, on peut ajouter le dépôt $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release
-cs) stable" 3- Après cela, il suffit de mettre à jour les informations du dépôt : $ sudo apt-get update 4- Purger l’ancien s’il existe: $ sudo apt-get purge lxc-docker
5- Installer docker sur ubuntu 18 $ sudo apt install docker-ce
6- Une fois l’installation terminée, il est conseillé de vérifier l’état du service. $ sudo systemctl status docker
7- Pour éviter d’avoir à utiliser « sudo » lorsque vous utilisez le docker, créer un groupe nommé docker et lui ajouter des utilisateurs. Pour créer le groupe « docker » et lui ajouter l’utilisateur : $ sudo groupadd docker $ sudo usermod –aG docker $USER
Tekup 2020/2021
T.ABAR, K.AMMAR, M.Ben SAID, Y.ABASSI
Hello world, Docker Comme toute technologie informatique, DOCKER dispose d’un exemple « Hello World », soit dans notre cas un conteneur qui ne fait rien à part afficher un message de bienvenue. L’intérêt de ce conteneur est de vérifier que la plateforme fonctionne correctement : $ docker run hello-world
La commande "docker run" indique au daemon docker de démarrer un conteneur nommé hello-world.
Récupération de l’image Pour exécuter la commande "docker run hello-world", le démon Docker cherche d’abord dans les fichiers locaux de votre système pour trouver l’image de conteneur correspondante. Si Docker ne peut pas trouver l’image souhaitée sur le système local, le démon lance un processus de téléchargement (pulling) à partir du registre Docker. Comme abordé dans le cours, Docker dispose d’un dépôt d’images auxquelles il peut accéder par Internet. Ce dépôt, accessible par l’URL https://registry.hub.docker.com. Après un téléchargement réussi, le conteneur est alors mis en marche. Il contient un simple script hello-world avec le message suivant :
Tekup 2020/2021
T.ABAR, K.AMMAR, M.Ben SAID, Y.ABASSI
Utilisation de la commande Docker La syntaxe de la commande docker prend la forme suivante : $ docker [option] [sub-command] [arguments]
Pour afficher toutes les sous-commandes disponibles, on tape la commande : $ docker
Pour afficher les options disponibles pour une commande spécifique, tapez : $ docker [sub-command] --help
Anatomie de l’image obtenue Une recherche sur le registre Docker permet de localiser la page correspondante à l’image en ligne, à savoir https://hub.docker.com/_/hello-world.
Cliquez sur le lien https://github.com/docker-library/hello-world qui permet d’accéder à la version actuelle de cette image qui est stockée sur le dépôt de code source GitHub, plus précisément on va examiner le fichier Dockerfile.
Tekup 2020/2021
T.ABAR, K.AMMAR, M.Ben SAID, Y.ABASSI
Voici rapidement l’explication de ces trois lignes : o La première définit sur quelle image la présente image va se baser. Dans notre cas, le mot-clé scratch correspond à une image vide. o La seconde fait en sorte que, lorsque le fichier Dockerfile sera lu pour générer une image, le contenu du fichier hello sera ajouté dans la racine du système de fichiers de l’image. o Enfin, la troisième établit que le démarrage de l’image provoquera le lancement de la commande /hello, qui exécutera le contenu du fichier précédemment recopié.
Gestion des images et des conteneurs L’image hello-world contient un processus prévu pour réaliser une tache - en l’occurrence afficher un message de bienvenue - puis s’arrêter. Nous pouvons donc suivre le processus par les commandes ci-dessous : #Lister les conteneurs en cours (actifs) $ docker ps
#Lister tous les conteneurs $ docker ps -a
Reprenons les différentes informations :
Tekup 2020/2021
T.ABAR, K.AMMAR, M.Ben SAID, Y.ABASSI
o CONTAINER ID: l’identifiant unique du conteneur. Il est créé à chaque fois du lancement du conteneur, même pour instancier la même image. o IMAGE : il s’agit du nom de l’image utilisée pour instancier le conteneur. Le suffixe : latest indique que c’est la dernière version disponible (par défaut). o COMMAND: cette information reprend le contenu de la ligne CMD du fichier Dockerfile, o CREATED : donne la date d’initialisation du conteneur. o STATUS : contient plusieurs informations. Dans notre cas, le conteneur s’est arrêté, et le processus interne est sorti avec le code 0, qui correspond par convention à un déroulement sans erreur. o PORTS : les ports réseaux exposés par le conteneur, en l’occurrence aucun dans le cas de ce simple exemple n’affichant que du texte. o NAMES : un nom est affecté au conteneur lors de son lancement, pour pouvoir le manipuler plus facilement que par son identifiant. #Lister les images $ docker images Ce qui affiche un résultat comme suit :
o REPOSITORY : le nom de l’image dans le dépôt. o TAG : la version de l’image. o IMAGE ID : un identifiant unique pour l’image o CREATED : la date de création de l’image. o VIRTUAL SIZE : la taille (virtuelle) de l’image. Dans notre cas, la taille affichée de la couche hello-world s’agit de sa taille réelle car elle ne se base pas sur une couche inférieure. #Chercher une image Pour trouver une image, vous pouvez faire la chercher dans le registre Docker Hub via son interface de recherche ou en utilisant l'interface de ligne de commande. La recherche peut trouver des images par nom de l'image, le nom d'utilisateur, ou la description : $ docker search
Dans la figure ci-dessous, la commande « docker search » est exécutée pour chercher une image « centos ». Le résultat affiché indique la présence de deux types d’images :
Images officielles supportées par Docker (comme l’image Hello-world étudiée précédemment). Elles sont désignées par un nom qui n’est pas préfixé par celui de leur propriétaire. La liste des images officielles est maintenue sur le dépôt GitHub nommé dockerlibrary/.
Tekup 2020/2021
T.ABAR, K.AMMAR, M.Ben SAID, Y.ABASSI
Images construites par des utilisateurs et déposées de manière publique, de façon que d’autres puissent les utiliser, voire s’en servir de base pour créer de nouvelles images plus sophistiquées. Par exemple la ligne tutum/centos montre que l’image provient du dépôt public d'un utilisateur nommé tutum/. Le caractère "/" sépare le dépôt d'un utilisateur du nom de l'image.
Les colonnes d’informations renvoient : Le nom de l’image La description de l’image Le nombre d’étoiles Une indication du caractère officiel de l’image Une indication du fait que la compilation de l’image a été réalisée de manière automatique Pour chercher toutes les images contenant le mot-clé centos et disposant d’au moins cinq étoiles en notation on utilise la commande suivante : $ docker search --filter=stars=5 centos
Une fois que vous avez trouvé l'image que vous voulez, vous pouvez la télécharger avec la commande suivante : $ docker pull centos $ docker run -it centos
Ces deux commandes permettent de télécharger l’image "centos" et d’accéder à son terminal d’une manière interactive. #Suppression des conteneurs La commande "docker rm" permet de supprimer un ou plusieurs conteneurs spécifiques (par nom ou identifiant) : $ docker rm …
Tekup 2020/2021
T.ABAR, K.AMMAR, M.Ben SAID, Y.ABASSI
Par défaut, docker ne supprime pas un conteneur en cours d'exécution. Pour supprimer un conteneur, quel que soit son état : $ docker rm -f
Pour supprimer un conteneur automatiquement à sa fermeture (après son exécution) : $ docker run --rm
Pour supprimer tous les conteneurs, vous pouvez utiliser cette instruction : $ docker rm $(docker ps -a -q)
Pour supprimer tous les conteneurs, quel que soit leur état : $ docker rm -f $(docker ps -qa)
#Suppression des images Utiliser le "help" pour effectuer les tâches suivantes :
Supprimer des images par leur identifiant ou nom Supprimer toutes les images sans conteneur démarré Supprimer toutes les images, qu'elles aient ou non un conteneur démarré
Construction et publication d’une image Nous allons créer une application web "Hello World" en utilisant Node.js et le framework Express. Ensuite nous allons mettre cette application dans un conteneur Docker et l’héberger dans le Docker Hub pour qu’il soit accessible par les autres utilisateurs de docker.
Tekup 2020/2021
T.ABAR, K.AMMAR, M.Ben SAID, Y.ABASSI
1. Installez Node.js avec la commande : $ sudo apt install nodejs
Vérifiez que l'installation a réussi en tapant la commande : Command 'node' not found, but can be installed with: $ nodejs -v
Installez ensuite le gestionnaire de package Node.js: sudo apt installnpm, nodejs $ sudo apt install npm
2. Créer le dossier qui va contenir l’application en utilisant la commande et accéder à ce dossier comme suit : $ mkdir && cd
3. Créer un fichier package.json qui contient des descriptions sur l’application ainsi que les dépendances ou les modules qu’on va utiliser pour le développement. Methode1 : utiliser un assistant pour créer le fichier package.json : $ npm init
Afficher le contenu du fichier $ nano package.json
Ajouter Framework express aux dépendances : $ npm install express --save
Rouvrir le fichier pour vérifier. Méthode 2 : créer le fichier manuellement : $ nano package.json
Tekup 2020/2021
T.ABAR, K.AMMAR, M.Ben SAID, Y.ABASSI
Par exemple : { "name": "nom-du-dossier", "version": "1.0.0", "description": "Hello world web application", "author": "", "license": "MIT", "main": "app.js", "keywords": [ "nodejs", "express" ], "dependencies": { "express": "^4.17.1" } } 4. Créer le fichier app.js avec la configuration suivante : const express = require('express') const app = express() const PORT = 8080; app.get('/', function (req, res) { res.send('Hello World!') }) app.listen(PORT, function () { console.log('Listening on port ' + PORT) }) Lancer l’application avec la commande : $ node app.js
Accéder à l’adresse http://localhost:8080/ dans votre navigateur et vérifier l’affichage du message 'Hello World !'. 5. Sous la racine du projet, créer le fichier Dockerfile qui est la base de la création de l’image Docker :
Tekup 2020/2021
T.ABAR, K.AMMAR, M.Ben SAID, Y.ABASSI
FROM node:carbon WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 8080 CMD ["node", "app.js"] FROM : Il s’agit de la première instruction. Elle définit l’image de base pour notre fichier Dockerfile. COPY : Cette commande ajoute des fichiers et des dossiers dans votre image. RUN : permet d’exécuter toute commande souhaitée pour créer une nouvelle couche sur l’image. CMD : spécifie une commande à exécuter lors du lancement du conteneur. EXPOSE : informe Docker que le conteneur est joignable sur les ports spécifiés. WORKDIR : définit le répertoire de travail. 6. Une fois le fichier Dockerfile est créé, on construit notre image avec la commande "docker build", l’option -t permet de nommer notre image : $ docker build -t . N’oublier pas de mettre un point à la fin de la commande qui précise le path du fichier Dockerfile Vérifier la bonne construction de l’image. 7. L’étape suivante est d’instancier depuis cette image un conteneur à qui on assigne un numéro de port avec l’option -p pour rediriger un port public vers un port privé à l'intérieur du conteneur. $ docker run -p 3000:8080 -d L’option -d permet d’exécuter le conteneur en arrière-plan. 8. Récupérer l’id du votre conteneur. 9. Connecter à votre conteneur en utilisant cette commande : $ docker exec -it
sh
10. Lister le contenu de votre conteneur. 11. Vérifier l’installation de node.js sur votre conteneur. 12. Accéder à l’adresse http://localhost:3000/ dans votre navigateur et vérifier l’affichage du message 'Hello World !'.
Tekup 2020/2021
T.ABAR, K.AMMAR, M.Ben SAID, Y.ABASSI
(OPTIONNEL) 13. Pour avoir la possibilité de publier votre image dans le registre Docker Hub, vous devez créer votre propre compte sur le lien https://hub.docker.com/. Une fois votre compte a été créé, vous pouvez vous connecter à partir du terminal en exécutant la commande $ docker login La déconnexion se fait avec la commande : $ docker logout 14. Récupérer l’id de votre image. 15. Ajouter le tag "latest" à votre image : $ docker tag / 16. Connecter-vous à votre compte Docker Hub. 17. Publier votre image avec la commande : $ docker push /: 18. Vérifier la publication de votre image sur Docker Hub
Bon Travail