Skip to content

Latest commit

 

History

History
160 lines (121 loc) · 7.18 KB

Exercice08_DockerImage.md

File metadata and controls

160 lines (121 loc) · 7.18 KB

Exercice 8 - Docker : image

  • Évaluation : formative
  • Durée estimée : 2 heures
  • Système d'exploitation : Ubuntu Client
  • Environnement : docker

Objectifs

  • Analyser les différents scénarios de déploiement proposés dans les documents de conception.
  • Distinguer les services à installer sur les serveurs.
  • Distinguer les services à installer sur le réseau.
  • Déterminer les étapes à entreprendre pour installer et configurer les services réseau.

Section 1 - Créez le programme hello-world

#include <iostream>

int main(int argc, char** argv) {
    std::cout << "Bonjour à tous" << std::endl;
}
  • Pour compiler votre programme, utilisez la commande g++ premier-programme.cpp -o premier-programme -static.

  • Créez dans le même répertoire que votre fichier "premier-programme" précédemment compilé, le fichier "Dockerfile" avec le contenu suivant :

    FROM scratch
    COPY premier-programme /
    ENTRYPOINT ["/premier-programme"]
  • À partir du fichier et de la documentation, décrivez ce que fait le fichier Dockerfile

  • Tapez la commande docker build --tag premier-programme:latest .

  • Vérifiez que l'image a bien été créée

  • Lancez un conteneur qui utilise votre image

docker container run --rm premier-programme
  • Modifiez le programme précédent pour qu'il corresponde au listage suivant (n'oubliez pas de compiler de nouveau) :
#include <iostream>

int main(int argc, char** argv) {
    std::cout << argv[1] << std::endl;
}
  • Modifiez votre Dockerfile afin que par défaut, le programme reçoive "!!Bonjour à tous !!" en paramètre.

    Modification du Dockerfile
    FROM scratch
    COPY premier-programme /
    ENTRYPOINT ["/premier-programme"]
    cmd [ "Bonjour à tous" ]
  • Reconstruisez votre image de conteneur

  • Essayez de lancer un nouveau conteneur en utilisant les mêmes lignes de commandes que précédemment.

  • Essayez de lancer un nouveau conteneur en utilisant en ajoutant à la fin la chaîne de caractères "Un paramètre qui vient de l'extérieur du conteneur".

Pour vérification

Remettre une capture d’écran de la dernière création et du dernier test de l'image.
Exemple de remise

Section 2 - Créer une image à partir d'une autre image

Une image est construite à partir d’un fichier Dockerfile : si vous voulez utiliser un autre nom de fichier, vous devez utiliser la commande :

docker build -f un_fichier_dockerfile
  • Consultez le Dockerfile de nginx : https://github.com/nginxinc/docker-nginx/blob/ef8e9912a2de9b51ce9d1f79a5c047eb48b05fc1/mainline/debian/Dockerfile

  • Consultez le site https://docs.docker.com/engine/reference/builder/ pour comprendre les commandes FROM, ENV, RUN, EXPOSE, ENTRYPOINT, CMD. Vous pouvez constater que nginx s'exécute à partir d'une image Debian minimale.

    Quelle est la différence entre ENTRYPOINT et CMD ?

    Réponse [The Difference Between CMD and ENTRYPOINT in Docker Images](https://www.howtogeek.com/devops/the-difference-between-cmd-and-entrypoint-in-docker-images/)
  • Créez un répertoire de travail : par exemple Docker.

  • Dézipper le fichier dockerfile-exemple.zip dans votre répertoire de travail.

  • Allez dans le répertoire dockerfile-exemple. Ouvrez le fichier Dockerfile. Le fichier index.html va nous servir « d’application » à intégrer dans notre serveur nginx.

  • Voici ce que fait le Dockerfile :

    • Nous allons utiliser une image officielle (la commande FROM). On peut utiliser une image officielle comme image de départ, c’est même recommandé et ça rend notre tâche beaucoup plus simple.
    • Par la suite, nous allons nous placer dans le répertoire /usr/share/nginx/html (la commande WORKDIR, nous aurions également pu utiliser la commande RUN avec cd).
    • Finalement, nous allons copier le fichier index.html de notre répertoire hôte dans le répertoire /usr/share/nginx/html de notre conteneur : on n’inclut pas le chemin (path), car nous sommes déjà dans le répertoire.
    • On n'a pas à spécifier EXPOSE pour les ports ou CMD car ils sont dans l'image initiale incluse avec la commande FROM. De là l’avantage d’utiliser une image existante.
  • Exécutez la commande pour construire votre image et exécuter un conteneur (le -t ajoute un tag à notre image, il y a un point à la fin).

docker image build -t monimage .
docker container run -p 8080:80 --rm monimage
  • Ouvrez un navigateur à localhost:8080.
  • Votre fichier index s’affiche-t-il ? (Si vous avez la page de nginx, vous pouvez essayer de rafraichir la page ou de vider l'historique de votre navigateur).
  • Faites la commande Ctrl-c pour arrêter votre conteneur.
  • Vérifier les images de votre hôte pour voir que votre nouvelle image s’y trouve.

Section 3 - Un peu de nettoyage

Les images et les conteneurs que vous utilisez prennent de l’espace sur votre disque, il faut donc quelques fois faire un peu de ménage.
Vous pouvez utiliser les commandes prune pour nettoyer les images, les volumes, les espaces tampons et les conteneurs.
Par exemple, pour nettoyer les images « pendantes » :

docker image prune

Ou, pour tout nettoyer :

docker system prune  

Pour nettoyer toutes les images non utilisées :

docker image prune -a
  • Nettoyez les images non utilisées de votre système.
  • Utilisez la commande suivante pour voir l'utilisation de l'espace par Docker :
docker system df

N'oubliez pas que chacune de ces commandes a des options que vous découvrez avec --help.
Par contre, ayant un compte Docker gratuit vous êtes limité au nombre de téléchargements d’images que vous pouvez faire en 6 heures : https://docs.docker.com/docker-hub/download-rate-limit/. Vous devez donc bien balancer la gestion de votre espace local et le téléchargement de nouvelles images.

Références

https://docs.docker.com/engine/reference/builder/
https://www.howtogeek.com/devops/the-difference-between-cmd-and-entrypoint-in-docker-images/
https://docs.docker.com/docker-hub/download-rate-limit/