Docker Partie 2

Utilisation de Docker

Dans la première partie je vous ai présenté Docker et montré ce que c’est et comment l’installer. Dans cette partie, je vais vous montrer comment utiliser Docker.

On va commencer par un peu de pratique pour bien comprendre comment Docker marche, et après on va voir comment créer nos propres images et conteneurs.

La pratique

Les images

Vous devez savoir que Docker utilise ce qu’on appelle des “images” pour créer ces fameux “containers”. Les images sont des fichiers qui ont tout ce qu’il faut pour créer un conteneur, c’est-à-dire, le code, les bibliothèques, les variables d’environnement, etc.

Il faut vraiment faire la différence entre une image et un conteneur. Une image c’est un fichier, et un conteneur c’est un processus qui exécute cette image. On peut créer autant de conteneurs qu’on veut à partir d’une seule image.

Pour bien comprendre ce que c’est une image et comment on peut l’utiliser, on va commencer par télécharger une image déjà prête. Pour ça, on va utiliser la commande docker pull suivi du nom de l’image qu’on veut télécharger.

docker pull alpine

La commande ci-dessus va télécharger l’image “alpine” qui est une image très légère de Linux. Vous pouvez vérifier que l’image a été téléchargée en utilisant la commande docker images.

docker images

Voilà ce que vous devriez voir :

capture alpine

On constate que l’image “alpine” fait 7.38MB. C’est une image très légère !!

Ce qu’il s’est passé lors de l’exécution de la commande docker pull, c’est que Docker a téléchargé l’image “alpine” depuis le Docker Hub qui est un registre d’images Docker. Vous pouvez trouver des images prêtes à l’emploi sur le Docker Hub.

Les images c’est en quelque sorte des templates pour créer des conteneurs. Vous pouvez créer autant de conteneurs que vous voulez à partir d’une seule image. Il y a des images pour tout ce qu’on veut et déjà prêtes à l’emploi. Comme par exemple, des images pour des serveurs web, des bases de données, des applications, etc. Et même des images pour des systèmes d’exploitation du genre Ubuntu, Debian, Fedora, etc.

Mais aussi vous pouvez créer vos propres images, cela on le verra dans une autre partie. L’utilité de cela est que vous pouvez, en quelque sorte, encapsuler votre application dans une image et la distribuer à n’importe qui. Et cette personne pourra créer un conteneur à partir de cette image et exécuter votre application sans avoir à installer quoi que ce soit.

Les conteneurs

Avant de vous parler de toutes les options qu’on peut utiliser pour créer un conteneur, je vous prie de lancer cette commande :

docker run --rm -p  8080:80 nginx

Voilà ce que vous devriez voir :

Texte alternatif

On constate qu’en moins de 5 secondes on a un serveur web fonctionnel. C’est magique n’est-ce pas ??

La commande docker run est la commande qu’on utilise pour créer un conteneur à partir d’une image. Dans notre cas, on a utilisé l’image nginx qui est une image pour un serveur web Nginx. La commande docker run a plusieurs options qu’on peut utiliser pour configurer le conteneur. Dans notre cas, on a utilisé l’option -p pour mapper le port 8080 de notre machine hôte au port 80 du conteneur. C’est pour cela qu’on peut accéder au serveur web en utilisant le port 8080.

L’option --rm est une option qui permet de supprimer le conteneur dès qu’on l’arrête. C’est très utile pour nettoyer l’environnement après avoir testé un conteneur.

Voilà une petite liste des options les plus utilisées avec la commande docker run :

  • -d : pour lancer le conteneur en mode détaché
  • -p : pour mapper les ports
  • -v : pour monter des volumes
  • --name : pour donner un nom au conteneur
  • --rm : pour supprimer le conteneur dès qu’on l’arrête
  • -e : pour définir des variables d’environnement
  • --network : pour définir le réseau sur lequel le conteneur va être connecté
  • --link : pour lier le conteneur à un autre conteneur
  • --restart : pour définir la politique de redémarrage du conteneur
  • --privileged : pour donner des droits spéciaux au conteneur
  • --security-opt : pour définir des options de sécurité
  • --ulimit : pour définir des limites sur les ressources du conteneur

Je ne vais pas m’attarder une par une sur ces options, car dans la pratique on n’utilise quasiment jamais la commande docker run.

Malgré que cette commande permet de créer un conteneur très rapidement, elle est très limitée. Car on ne peut pas sauvegarder les options qu’on utilise pour créer un nouveau conteneur. Ou meme de creer un genre de template pour creer 500 conteneurs avec les memes options. Il faudra lancer la commande docker run 500 fois avec les memes options.

On utilise plutôt des fichiers de configuration pour définir les options qu’on veut utiliser pour créer un conteneur. Ces fichiers de configuration sont appelés des “Dockerfiles” (pour customiser nos images) et/ou Docker-Compose (Pour customiser le conteneur). On va voir comment créer un Dockerfile et des Docker-Compose dans la prochaine partie.

Dockerfile

Comme je l’ai dit un peu plus haut, un Dockerfile est un fichier de configuration qui permet de définir comment créer une image. Un Dockerfile contient une série d’instructions qui permettent de définir l’environnement dans lequel l’application va être exécutée.

On va prendre un exemple. J’ai dans mon répertoire un fichier site.html qui contient un simple serveur de page web HTML. Voilà le contenu de ce fichier :

<!DOCTYPE html>
<html>
    <body>
        <h1>Docker c'est incroyable !!</h1>
    </body>
</html>

Je veux mettre ce fichier dans un conteneur et le servir en utilisant un serveur web.

Pour cela, je vais créer un Dockerfile qui va définir comment créer une image qui contient ce fichier et un

serveur web. La communauté Docker nous donne déjà le travail presque fait. On peut utiliser une image qui contient déjà un serveur web et qui est prête à l’emploi. On va utiliser l’image httpd qui est une image pour un serveur web Apache2.

Une fois que j’aurais créé mon image avec mon Dockerfile, je pourrais créer un conteneur à partir de cette image et exécuter mon serveur web. Et ça, n’importe où, sans avoir à refaire tout le travail.

Voilà le contenu de mon Dockerfile :

FROM httpd:2.4
COPY site.html /usr/local/apache2/htdocs/index.html

La première ligne FROM httpd:2.4 permet de définir l’image de base à utiliser pour créer notre image. Dans notre cas, on utilise l’image httpd qui est. Pour savoir les possibilités qu’on a avec cette image, on peut consulter la documentation de l’image sur le Docker Hub.

Également vous pouvez voir que j’ai spécifié la version de l’image httpd que je veux utiliser. C’est pour éviter d’avoir des surprises lors de la création de l’image. Si je ne spécifie pas la version, Docker va utiliser la dernière version de l’image httpd qui est disponible sur le Docker Hub. Donc par défaut, Docker va utiliser le flag :latest pour la version de l’image.

La deuxième ligne COPY site.html /usr/local/apache2/htdocs/index.html permet de copier le fichier site.html dans le répertoire /usr/local/apache2/htdocs/ de l’image. C’est dans ce répertoire que le serveur web Apache2 va chercher les fichiers à servir. Et on a renommé le fichier site.html en index.html pour que le serveur web le serve par défaut.

Pour créer une image à partir de ce Dockerfile, on utilise la commande docker build suivi du chemin du répertoire où se trouve le Dockerfile. Dans notre cas, le Dockerfile se trouve dans le même répertoire que le fichier site.html. Donc on peut utiliser la commande suivante :

docker build -f Dockerfile -t makhal/site_simple .

La commande ci-dessus va créer une image avec le tag makhal/site_simple à partir du Dockerfile qui se trouve dans le répertoire courant. Le flag -f permet de spécifier le nom du Dockerfile à utiliser. Si on ne spécifie pas le nom du Dockerfile, Docker va chercher un fichier Dockerfile dans le répertoire courant.

Le point à la fin de la commande permet de spécifier le chemin du contexte à utiliser pour la construction de l’image. Le contexte c’est le répertoire où se trouve le Dockerfile et les fichiers qu’on veut copier dans l’image. Dans notre cas, le contexte c’est le répertoire courant.

Maintenant, votre image est faite si cela s’est passé sans erreur. Vous pouvez vérifier que l’image a été créée en utilisant la commande docker images.

docker images

Mais si jamais vous vous êtes trompé dans le Dockerfile, vous pouvez toujours supprimer l’image en utilisant la commande docker rmi suivi du nom de l’image.

docker rmi makhal/site_simple

Maintenant que notre image est créée, on peut créer un conteneur à partir de cette image et exécuter notre serveur web. Pour cela, on utilise la commande docker run suivi du nom de l’image.

docker run -p 8080:80 makhal/site_simple

La commande ci-dessus va créer un conteneur à partir de l’image makhal/site_simple et le lancer en utilisant le port 8080 de notre machine hôte. Vous pouvez vérifier que le conteneur a été créé en utilisant la commande docker ps.

docker ps

Voilà ce que vous devriez voir :

docker ps

On constate que le conteneur est en train de tourner. Vous pouvez vérifier que le serveur web fonctionne en utilisant un navigateur web et en allant à l’adresse http://localhost:8080.

Conclusion

Dans cette partie, on a vu comment utiliser Docker pour créer des images et des conteneurs. On a vu comment télécharger une image depuis le Docker Hub et comment créer une image à partir d’un Dockerfile. On a également vu comment créer un conteneur à partir d’une image et comment le configurer.

Dans la prochaine partie, on va voir comment créer un Docker-Compose pour paramétrer nos conteneurs.

N’hésitez pas à me contacter si vous avez des questions ou des suggestions.