Blog

TP : Prise en main de Docker

Docker-Logo
Développement web & mobile

TP : Prise en main de Docker

Objectifs du TP : 

Apprendre en pratiquant

  • Installer la bonne version de Docker pour votre projet ;
  • Créer, lancer et partager des images Docker ;
  • Orchestrer des images Docker grâce à Docker Compose.

Découvrons les conteneurs dans Docker

Un conteneur Linux est un processus ou un ensemble de processus isolés du reste du système, tout en étant légers.

Le conteneur permet de faire de la virtualisation légère, c’est-à-dire qu’il ne virtualise pas les ressources, il ne crée qu’une isolation des processus. Le conteneur partage donc les ressources avec le système hôte.

Les conteneurs n’ayant pas besoin d’une virtualisation des ressources mais seulement d’une isolation, ils peuvent démarrer beaucoup plus rapidement et plus fréquemment qu’une machine virtuelle sur nos serveurs hôtes, et ainsi réduire encore un peu les frais de l’infrastructure.

Ici nous commençons à ressentir les avantages de DevOps

En dehors de la question pécuniaire, il y a aussi la possibilité de faire tourner des conteneurs sur le poste des développeurs, et ainsi de réduire les différences entre la « sainte » production, et l’environnement local sur le poste des développeurs.

Les conteneurs permettent de réduire les coûts, d’augmenter la densité de l’infrastructure, tout en améliorant le cycle de déploiement.

Nous retrouvons les conteneurs dans de nombreux contextes. Par exemple, les outils d’intégration continue (CI) de grandes sociétés utilisent des conteneurs. BlaBlaCar utilise des conteneurs pour créer et isoler rapidement des tests/builds d’application.

Docker a été créé pour les besoins d’une société de Platform as a Service (PaaS) appelée DotCloud. Finalement, en mars 2013, l’entreprise a créé une nouvelle structure nommée Docker Inc et a placé en open source son produit Docker.

Docker répond à une problématique forte dans le monde du développement.

Prenons un exemple : vous avez développé votre projet de Twitter Lite en local. Tout fonctionne bien, mais au moment de mettre en production, vous vous rendez compte que vous ne savez pas comment déployer votre projet. Un autre exemple : vous êtes dans une équipe de 10 personnes et chacun utilise un OS différent (Ubuntu, macOS, Windows, CentOS, etc.). Comment faire pour avoir un environnement unifié et fonctionnel chez l’ensemble des développeurs ?

Docker répond à ces problématiques en créant des conteneurs. Grâce à Docker, vous n’aurez plus de problème de différence d’environnement, et votre code marchera partout !

On retrouve aussi Docker dans les domaines de la CI (Continous Integration, ou Intégration Continue) et de la CD (Continous Delivery, ou Livraison Continue). Cela permet à la CI/CD de créer rapidement des espaces isolés pour faire tourner vos tests.

Docker Inc distribue 3 versions de Docker différentes :

  • Docker Community Edition (Linux seulement) ;
  • Docker Desktop (Mac ou Windows) ;
  • Docker Enterprise (Linux seulement).

Docker Desktop et Docker Community Edition (CE) sont deux versions de Docker gratuites. Avec les deux solutions, vous aurez un Docker fonctionnel sur votre ordinateur.

Si vous êtes sous Windows ou macOS, utilisez Docker Desktop qui va créer pour vous l’ensemble des services nécessaires au bon fonctionnement de Docker.
Si vous êtes sous Linux, prenez la version Community Edition (CE) ; vous utiliserez aussi cette version pour vos serveurs.

Installez Docker sur votre poste

Docker Hub

Le Docker Hub est un service fourni par Docker Inc ; vous pouvez le comparer à GitHub ou GitLab, mais spécialisé dans le stockage d’image pour Docker.

Pour télécharger et utiliser Docker (et donc pour la suite de ce TP), il vous faudra créer un compte sur le Docker Hub

Version Stable et version Edge

Docker Inc distribue deux versions des clients Docker pour Mac et Docker pour Windows.

Ainsi, il existe une version Stable qui est mise à jour tous les trimestres, et une version Edge qui dispose des fonctionnalités encore en beta, et qui est disponible tous les mois.

Dans notre cas, nous allons préférer l’utilisation de la version Stable, car celle-ci assure d’avoir un environnement fonctionnel et stable tout au long de votre découverte de Docker.

Maintenant que vous avez un compte Docker Hub fonctionnel, et que nous savons quelle version nous souhaitons utiliser, nous allons pouvoir installer Docker pour Windows et Docker pour Mac.

Docker for Windows

Pour faire fonctionner Docker sous Windows, nous aurions de nombreuses manipulations à faire ; cependant, Docker Inc a créé un outil qui permet d’automatiser l’ensemble des tâches, et ainsi d’avoir rapidement Docker sous Windows.

Attention, vous devez avoir un Windows Enterprise ou Windows Professional pour que cette fonctionnalité soit disponible. Dans le cas contraire, il faudra vous tourner vers l’utilisation de Docker Toolbox.

Téléchargement ⇒ https://hub.docker.com/editions/community/docker-ce-desktop-windows 

Une fois le téléchargement réalisé, vous pourrez lancer l’utilitaire et suivre la procédure d’installation de celui-ci. Attention, vous devrez certainement redémarrer votre PC.

Une fois l’installation terminée, vous allez être invité à connecter votre compte Docker Hub créé précédemment.

Vous avez maintenant un Docker for Windows totalement fonctionnel sur votre PC !

Docker pour Mac

L’installation de Docker pour Mac fonctionne comme pour Docker pour Windows.

Vous devrez télécharger l’utilitaire à cette adresse.

Captures à l’installation sur windows

Lançons notre premier conteneur en local

Le Docker Hub

Avant de démarrer votre premier conteneur Docker, rappelez-vous quand vous avez créé votre compte sur le Docker Hub pour télécharger votre version de Docker. Celui-ci est aussi la registry officielle de Docker.

Pour démarrer votre premier conteneur, vous devez utiliser la commande docker run hello-world

Avant de lancer commande voyons quelques commandes intéressantes

docker images, permet de lister les images existantes sur votre machine

docker ps, permet de lister les images disponibles sur votre machine

docker pull nom_image, permet de télécharger une image dans docker hub

docker run -it node, permet de faire tourner (démarrer) l’image node & nous pourrions le vérifier avec docker ps

docker stop container_id, permet de stopper un container

docker run -id -d nom_image, pour faire tourner l’image en détacher (en arrière plan)

Revenons au démarrage de notre premier conteneur, vous devez utiliser la commande suivante : 

docker run hello-word

Attention : cette commande pourrait ne pas marcher dans certains environnements,

D’ailleurs une longue discussion à eu dessus sur la documentation officielle, je ne vais pas revenir dans les détails mais une commande en alternative a été mis en place pour bien démarrer, c’est la suivante : 

docker run -d -p 80:80 docker/getting-started

Néanmoins vous pouvez toujours aller dans docker hub, créer votre image ou repository & utiliser la commande docker pull pour y travailler en local

docker pull senyr9/hello-word 

Malheureusement, faudra disposer de la version pro de docker hub pour avoir l’image et le tag (latest)

Démarrez un serveur Nginx avec un conteneur Docker

Vous savez maintenant lancer un conteneur, et vous avez compris les actions effectuées par le daemon Docker lors de l’utilisation de la commande docker run  .

Maintenant, nous allons aller plus loin avec celui-ci. Nous allons lancer un conteneur qui démarre un serveur Nginx en utilisant deux options : docker run -d -p 8080:80 nginx  .

Dans cette commande, nous avons utilisé deux options :

  • -d pour détacher le conteneur du processus principal de la console. Il vous permet de continuer à utiliser la console pendant que votre conteneur tourne sur un autre processus ;
  • -p pour définir l’utilisation de ports. Dans notre cas, nous lui avons demandé de transférer le trafic du port 8080 vers le port 80 du conteneur. Ainsi, en vous rendant sur l’adresse  http://127.0.0.1:8080  , vous aurez la page par défaut de Nginx.

Vous pourriez aussi avoir besoin de « rentrer » dans votre conteneur Docker pour pouvoir y effectuer des actions. Pour cela, vous devez utiliser la commande docker exec -ti ID_RETOURNÉ_LORS_DU_DOCKER_RUN bash  . Dans cette commande, l’argument -ti permet d’avoir un shell bash pleinement opérationnel. Une fois que vous êtes dans votre conteneur, vous pouvez vous rendre, via la commande cd /usr/share/nginx/html  , dans le répertoire où se trouve le fichier index.html  , pour modifier son contenu et voir le résultat en direct à l’adresse http://127.0.0.1:8080  .

Arrêtez votre conteneur Docker

Vous avez créé un conteneur avec l’option –detach  , vous aurez donc sûrement besoin de l’arrêter ! Pour cela, faites appel à la commande docker stop ID_RETOURNÉ_LORS_DU_DOCKER_RUN  .

Maintenant que votre conteneur Docker a été arrêté, vous pouvez le supprimer avec la commande docker rm ID_RETOURNÉ_LORS_DU_DOCKER_RUN  . Celle-ci va détruire le conteneur et son contenu ; cependant, vous pouvez toujours recréer votre conteneur avec la commande docker run vue plus haut.

Comment nettoyer mon système

Après avoir fait de nombreux tests sur votre ordinateur, vous pouvez avoir besoin de faire un peu de ménage. Pour cela, vous pouvez supprimer l’ensemble des ressources manuelles dans Docker.

Ou vous pouvez laisser faire Docker pour qu’il fasse lui-même le ménage. Voici la commande que vous devez utiliser pour faire le ménage :  

docker system prune 

Celle-ci va supprimer les données suivantes :

  • l’ensemble des conteneurs Docker qui ne sont pas en status running ;
  • l’ensemble des réseaux créés par Docker qui ne sont pas utilisés par au moins un conteneur ;
  • l’ensemble des images Docker non utilisées ;
  • l’ensemble des caches utilisés pour la création d’images Docker.

Créez votre premier Dockerfile

Vous savez maintenant utiliser l’interface de commande de Docker et récupérer des images depuis le Docker Hub. Mais comment créer votre propre image ?

Nous allons créer ensemble une image Docker, dans laquelle nous allons installer Node.js, ainsi que les différentes dépendances de notre projet.

Pour cela, nous allons créer un fichier nommé « Dockerfile ». Dans ce fichier Dockerfile, vous allez trouver l’ensemble de la recette décrivant l’image Docker dont vous avez besoin pour votre projet.

À titre de comparaison, vous pouvez voir le Dockerfile comme l’équivalent d’un fichier package.json en Node.js, ou composer.json en PHP

Créer un dossier & à l’intérieur créer dessus le fichier dockerfile (à ouvrir avec un éditeur)

Pour créer une image Docker, vous savez utiliser les instructions suivantes :

  • FROM qui vous permet de définir l’image source ;
  • RUN qui vous permet d’exécuter des commandes dans votre conteneur ;
  • ADD qui vous permet d’ajouter des fichiers dans votre conteneur ;
  • WORKDIR qui vous permet de définir votre répertoire de travail ;
  • EXPOSE qui permet de définir les ports d’écoute par défaut ;
  • VOLUME qui permet de définir les volumes utilisables ;
  • CMD qui permet de définir la commande par défaut lors de l’exécution de vos conteneurs Docker.

Pour construire l’image dans le dossier de référence, on utilise la commande suivante : 

docker build -t nom_image .

Pour lancer l’image : docker run nom_image

EXERCICE A FAIRE  : TP ICIdocker

Vous avez maintenant créé votre propre image via un Dockerfile, et vous souhaitez partager cette image avec vos collègues. Pour cela, il existe deux solutions :

  • soit vous partagez votre fichier Dockerfile à chacun de vos collègues, et vous leur demandez de créer eux-mêmes leur propre image avec un docker build  ;
  • soit vous envoyez votre image sur votre propre registry.

La première solution, bien qu’étant totalement fonctionnelle, force vos collègues à recréer eux-mêmes chacune des images, et cela peut prendre beaucoup de temps.

Pour améliorer cela, vous pouvez utiliser une registry Docker qui vous permet de partager directement votre image.

Créez votre image sur le Docker Hub

Envoyez votre image sur le Docker Hub

Voici la première commande que vous allez utiliser : 

docker tag nom_image:latest your_username/nom_image:latest

Vous pouvez maintenant exécuter la dernière commande nécessaire pour envoyer votre image vers le Docker Hub. Pour cela, vous allez exécuter la commande

docker push your_username/nom_image:latest

Nous pouvons vérifier tout cela dans notre docker hub

Vous pouvez créer d’autres versions de votre image en remplaçant le :latest par une autre chaîne de caractères. Cependant, il faut bien faire attention, car l’image utilisée par défaut sera toujours l’image :latest

Trouvez l’image qui vous correspond

Vous pouvez avoir besoin de rechercher des images dans le Docker Hub, mais il existe deux types d’images différents :

  • les images officielles ;
  • les images personnelles.

Docker Inc propose à ce jour 152 images officielles qu’il maintient à jour continuellement, et vous les retrouverez directement sur le Docker Hub à cette adresse.

Il y a aussi de très nombreuses images personnelles créées par différents membres de la communauté, et même par certains éditeurs de solutions open source.

Si vous recherchez une image, vous avez deux façons de procéder :

  • la solution du barbu en ligne de commande ;
  • la solution classique avec l’interface web.

Pour la solution du barbu, vous devez utiliser la commande docker search

Comme vous pouvez le voir, le CLI Docker vous retourne une liste d’images Docker disponibles.

Vous pouvez aussi faire la même action via le Docker Hub, si nous recherchons la même image sur celui-ci : voici l’URL de la recherche. Nous retrouverons là aussi une liste d’images avec les filtres nécessaires pour classer les images comme nous le souhaitons.

Découvrez et installez Docker Compose

Vous avez un nouveau projet de site avec WordPress. Pour simplifier la gestion de l’infrastructure, vous souhaitez déployer l’ensemble des composants dans des conteneurs Docker. Pour cela, nous allons avoir besoin de deux conteneurs :

  • un conteneur MySQL ;
  • un conteneur WordPress.

Installation de Docker Compose

Si vous avez utilisé Docker for Mac ou Docker for Windows, vous avez déjà la dernière version de Docker Compose installée dans votre système.

À la découverte du CLI de Docker Compose

Pour utiliser le CLI (Command Line Interface) de Docker Compose, nous avons besoin d’un fichier docker-compose.yml que nous allons créer dans le suite! 

Le fait que les deux interfaces en ligne de commande soient très similaires nous évite d’apprendre un nouveau CLI. Si vous connaissez celui de Docker, vous savez globalement utiliser celui de Docker Compose !

Si vous souhaitez lancer la création de l’ensemble des conteneurs, vous devez lancer la commande docker-compose up (pour rappel, vous faites un docker run pour lancer un seul conteneur).

docker-compose ps d’après vous ?

Vous connaissez maintenant les commandes principales pour utiliser une stack Docker Compose. Voici les commandes les plus importantes :

  • docker-compose up -d vous permettra de démarrer l’ensemble des conteneurs en arrière-plan ;
  • docker-compose ps vous permettra de voir le statut de l’ensemble de votre stack ;
  • docker-compose logs -f --tail 5 vous permettra d’afficher les logs de votre stack ;
  • docker-compose stop vous permettra d’arrêter l’ensemble des services d’une stack ;
  • docker-compose down vous permettra de détruire l’ensemble des ressources d’une stack ;
  • docker-compose config vous permettra de valider la syntaxe de votre fichier docker-compose.yml

Créez votre fichier docker-compose.yml

Nous avons vu dans le chapitre précédent comment utiliser l’interface en ligne de commande de Docker Compose ; vous allez maintenant apprendre à créer un fichier docker-compose.yml  

Décrivez votre premier service : db

Définissez la version de Docker Compose

Un fichier docker-compose.yml commence toujours par les informations suivantes :

version: ‘3’

L’argument version permet de spécifier à Docker Compose quelle version on souhaite utiliser, et donc d’utiliser ou pas certaines versions. Dans notre cas, nous utiliserons la version 3, qui est actuellement la version la plus utilisée.

Déclarez le premier service et son image

Nous allons maintenant déclarer notre premier service, et donc créer notre stack WordPress !

L’ensemble des conteneurs qui doivent être créés doivent être définis sous l’argument services  . Chaque conteneur commence avec un nom qui lui est propre ; dans notre cas, notre premier conteneur se nommera db  .

services:

 db:

   image: mysql:5.7

vol

Puis, vous devez décrire votre conteneur ; dans notre cas, nous utilisons l’argument image qui nous permet de définir l’image Docker que nous souhaitons utiliser.

Nous aurions pu aussi utiliser l’argument build en lui spécifiant le chemin vers notre fichier Dockerfile ; ainsi, lors de l’exécution de Docker Compose, il aurait construit le conteneur via le Dockerfile avant de l’exécuter.

Définissez le volume pour faire persister vos données

services:

 db:

   image: mysql:5.7

   volumes:

    – db_data:/var/lib/mysql

Pour rappel, nous avons vu précédemment que les conteneurs Docker ne sont pas faits pour faire fonctionner des services stateful, et une base de données est par définition un service stateful. Cependant, vous pouvez utiliser l’argument volumes qui vous permet de stocker l’ensemble du contenu du dossier /var/lib/mysql dans un disque persistant. Et donc, de pouvoir garder les données en local sur notre host.

Cette description est présente grâce à la ligne db_data:/var/lib/mysql  . db_data est un volume créé par Docker directement, qui permet d’écrire les données sur le disque hôte sans spécifier l’emplacement exact. Vous auriez pu aussi faire un /data/mysql:/var/lib/mysql qui serait aussi fonctionnel.

Définissez la politique de redémarrage du conteneur

services:

 db:

   image: mysql:5.7

   volumes:

    – db_data:/var/lib/mysql

   restart: always

Un conteneur étant par définition monoprocessus, s’il rencontre une erreur fatale, il peut être amené à s’arrêter. Dans notre cas, si le serveur MySQL s’arrête, celui-ci redémarrera automatiquement grâce à l’argument restart: always  .

Définissez les variables d’environnement

services:

 db:

   image: mysql:5.7

   volumes:

    – db_data:/var/lib/mysql

   restart: always

   environment:

    MYSQL_ROOT_PASSWORD: somewordpress

    MYSQL_DATABASE: wordpress

    MYSQL_USER: wordpress

    MYSQL_PASSWORD: wordpress

L’image MySQL fournie dispose de plusieurs variables d’environnement que vous pouvez utiliser ; dans votre cas, nous allons donner au conteneur les valeurs des différents mots de passe et utilisateurs qui doivent exister sur cette base. Quand vous souhaitez donner des variables d’environnement à un conteneur, vous devez utiliser l’argument environment  , comme nous l’avons utilisé dans le fichier docker-compose.yml ci-dessus.

Décrivez votre second service : WordPress

Dans le second service, nous créons un conteneur qui contiendra le nécessaire pour faire fonctionner votre site avec WordPress. Cela nous permet d’introduire deux arguments supplémentaires.

services:

 wordpress:

   depends_on:

    – db

   image: wordpress:latest

   ports:

    – « 8000:80 »

   restart: always

   environment:

    WORDPRESS_DB_HOST: db:3306

    WORDPRESS_DB_USER: wordpress

    WORDPRESS_DB_PASSWORD: wordpress

    WORDPRESS_DB_NAME: wordpress

Le premier argument, depends_on  , nous permet de créer une dépendance entre deux conteneurs. Ainsi, Docker démarrera le service db avant de démarrer le service WordPress. Ce qui est un comportement souhaitable, car WordPress dépend de la base de données pour fonctionner correctement.

Le second argument, ports  , permet de dire à Docker Compose qu’on veut exposer un port de notre machine hôte vers notre conteneur, et ainsi le rendre accessible depuis l’extérieur.

Voici le fichier docker-compose.yml dans sa version finale :

version: ‘3’

services:

 db:

   image: mysql:5.7

   volumes:

    – db_data:/var/lib/mysql

   restart: always

   environment:

    MYSQL_ROOT_PASSWORD: somewordpress

    MYSQL_DATABASE: wordpress

    MYSQL_USER: wordpress

    MYSQL_PASSWORD: wordpress

 wordpress:

   depends_on:

    – db

   image: wordpress:latest

   ports:

    – « 8000:80 »

   restart: always

   environment:

    WORDPRESS_DB_HOST: db:3306

    WORDPRESS_DB_USER: wordpress

    WORDPRESS_DB_PASSWORD: wordpress

    WORDPRESS_DB_NAME: wordpress

volumes:

 db_data: {}

Lancez votre stack Docker Compose

Quand vous lancerez vos conteneurs avec la commande docker-compose up -d  , vous devriez avoir le résultat suivant :

$ docker-compose up -d

Lors de l’exécution de cette commande, Docker Compose commence par vérifier si nous disposons bien en local des images nécessaires au lancement des stacks. Dans le cas contraire, il les télécharge depuis une registry, ou les build via un docker build  .

Puis celui-ci lance les deux conteneurs sur votre système ; dans notre cas, vous pourrez voir le résultat en vous ouvrant l’URL suivante dans votre navigateur :  http://127.0.0.1:8000  .

Laissez votre pensée ici

Select the fields to be shown. Others will be hidden. Drag and drop to rearrange the order.
  • Image
  • SKU
  • Rating
  • Price
  • Stock
  • Availability
  • Add to cart
  • Description
  • Content
  • Weight
  • Dimensions
  • Additional information
Click outside to hide the comparison bar
Compare