Découvrez comment et pourquoi j’ai utilisé Docker pour la première fois

Dans cet article, je vais vous expliquer comment et pourquoi, j’ai utilisé Docker pour la première fois, depuis, je suis devenu un grand fan de cette technologie, et dès que cela est possible, je l’utilise pour le déploiment de services et d’applicartions.

Nous allons voir ensemble comment installer Docker et un cas un concret d’usage de Docker.

Au moment de la rédaction de ce tutoriel (en 2021) en tant que SysAdmin, j’avais beaucoup de mal à trouver une utilisation concrète aux conteneurs notamment Docker (alors je vous laisse imaginer Kubernetes).

C’est pas forcément vrai, en environnement PROD, j’ai quelques exemples, mais pas de quoi emballer la planète …

La plupart des tutoriels, que l’on trouve sur Internet, explique comment installer Docker et ensuite créer un ou plusieurs conteneurs pour utiliser un serveur LAMP, chose qui se fait très bien sans conteneur et de façon aussi rapide …

Je ne dis pas que les tutoriels ne sont pas bon, juste le manque d’intérêt …

Souhaitant remettre en place une solution de type forums pour RDR-IT, j’ai trouvé discourse qui me permet de lier un forum et les commentaires pour mes différents sites WordPress.

Après un test en local sur une VM dédiée, je valide la solution, j’adore, arrive ensuite le moment de réfléchir à comment le mettre en production … J’ai actuellement deux VPS (une dédiée à l’hébergement Web avec Cyberpanel et une autre où je fais tourner seulement mon serveur gitlab).

Je ne souhaite pas installer les prérequis Disourse sur le serveur Web, car Discourse à besoin de pas mal de choses (Serveur Web, PostgreSQL, Redis, Ruby …), sur le serveur au Gitlab fonctionne, j’ai un peu peur, car les Gitlab et Discourse utilisent les même composants … Je commence à me dire qu’il me faut un troisième serveur … et je commence à faire machine arrière, car c’est de l’argent supplémentaire et mes différentes tentatives pour mettre en place un forum ont été à chaque fois des échecs.

Une lumière s’illumine, Gitlab et Discourse proposent tous les deux des conteneurs Docker … et je me dis que c’est peut-être le moment de tester ça et je commence enfin à trouver une application aux conteneurs et je me décide donc à tester cette solution en lab (local), qui me permettrais de faire tourner sur un même serveur mon Gitlab et discourse.

Il reste un problème à résoudre qui est l’utilisation par les deux applications d’un serveur Web et leur utilisation du port 80 et 443, pour résoudre ce problème, je vais utiliser Nginx en reverse proxy installé en local sur le serveur (j’aurais aussi pu utiliser le conteneur Nginx pour ça …).

Dans ce tutoriel, je vais utiliser une machine virtuelle sur Ubuntu Server 20.04

Installation des prérequis

Avant de se lancer dans l’installation de Docker, nous allons d’abord installer quelques paquets :

  • Cockpit : qui est une interface graphique Web qui va nous permettre d’administrer notre serveur Ubuntu et les conteneurs
  • Nginx : qui sera utilisé en reverse proxy pour publier les Gitlab et Discourse
  • certbot : qui va permettre de générer des certificats Let’s Encrypt

Installation de Cockpit

Entrer la commande suivante :

Ubuntu cockpit install

Une fois cockpit installé, celui-ci est disponible à l’adresse suivante : https://ip_du_serveur:9090

Afin de pouvoir gérer des conteneurs Docker, il est nécessaire d’installer un module supplémentaire.

Au moment de la rédaction, le module n’est pas officiel disponible pour la version 20.04, mais la version 19.10 fonctionne.

Télécharger le .deb à l’aide de la commande wget

Installer le .deb :

Patienter pendant l’installation :

Cockpit Docker install

Une fois installée, retourner sur l’interface de cockpit et actualiser, le menu Docker Container est disponible.

Module docker container available on cockpit

L’installation du module cockpit-docker installe le paquet Docker, celui-ci sera désinstallé après pour utiliser le dépôt officiel Docker.

Il est aussi possible d’installer le module cockpit-docker après l’installation de Docker, ce qui évite la désinstallation.

Installation de Nginx

Comme plusieurs serveurs Web vont être exposé avec les conteneurs, on va installer Nginx afin d’avoir un reverse proxy, il est aussi possible d’utiliser Apache2.

On aurait pu aussi utiliser le conteneur Nginx.

Utiliser l’une des commandes ci-dessous pour installer Nginx sur le serveur :

Installation de Certbot

Cette installation est facultative, elle va permettre de générer des certificats Let’s Encrypt pour afin de rendre accessible en HTTPS, les différentes applications.

Pour installer Certbot pour Nginx entrer la commande :

Install certbot for nginx

Maintenant que nous avons installé les prérequis nécessaires, nous allons passer à l’installation de Docker sur le serveur Ubuntu.

Installation de Docker sur Ubuntu

Avant de pouvoir utiliser des conteneurs, nous avons besoin d’installer Docker sur notre serveur Ubuntu qui va se charger de les gérer.

Pour faire simple : Docker est le gestionnaire de conteneur, ce qu’est Hyper-V ou VMware à la virtualisation.

En plus de Docker, on va installer docker-compose, qui permet de configurer des conteneurs docker avec des fichiers au format yml.

Pour ce tutoriel, je vais me baser sur la documentation officiel Docker.

Installer Docker engine

Cette première de ligne commande est facultative, on va dans un premier temps désinstaller Docker si celui-ci est présent, notamment si vous avez installé le module cockpit-docker.

Remove docker

Installer, les prérequis pour Docker :

Installer la clef du dépot :

Ajouter le dépot

Mettre à jour la liste des paquets :

sudo apt update
Update repositories

On peut voir que le dépôt Docker a bien été ajouté

Installer Docker :

install docker

Si à la fin de l’installation, vous avez une erreur : Errors were encountered while processing : docker-ce. Relancer l’installation du paquet.

Tester le bon fonctionnement de Docker à l’aide de la commande :

sudo systemctl status docker
docker status

Installer Docker Compose

Cette partie est optionnelle, comme je vous l’ai expliqué précédent Docker Compose permet de configurer des conteneurs à l’aide d’un fichier au format yml.

Télécharger Docker Compose :

Docker Compose Download

Rendre exécutable Docker Compose :

Tester le bon fonctionnement à l’aide de la commande suivante :

Tester Docker avec Hello World

On va maintenant tester notre installation de Docker en déployant notre premier conteneur Hello World.

Ce conteneur ne fait rien de particulier, mais il va nous permettre de s’assurer de bon fonctionnement de notre service.

Entrer la commande ci-dessous pour lancer le conteneur hello-world :

sudo docker run hello-world
docker run hello-world

Si vous avez le message Hello from Docker ! C’est tout bon, félicitation, vous avez déployé votre premier conteneur.

Entrer la commande suivante pour afficher les conteneurs sur le serveur et leur status :

sudo docker ps -a

On peut voir le conteneur hello-world.

Dans Cockpit, on peut également voir notre conteneur.

Pour afficher les conteneurs « éteints » sélectionner Everything en haut.


Docker est maintenant installé et fonctionnel sur le serveur, on va pouvoir passer au déploiement de conteneur, avant de se lancer dans l’installation de conteneur, je vais vous donner quelques informations utiles avant d’aller plus loin.

Docker : quelques informations utiles avant …

Avant se lancer dans notre déploiement de conteneurs (Gitlab et Discourse) voici quelques informations (un peu en vrac) à savoir sur les conteneurs.

Le réseau

C’est ce qui est un peu déroutant au départ quand on pense virtualisation, par défaut, les conteneurs ne sont pas exposés directement une IP de votre LAN, il utilise un système de NAT/PAT pour publier les services.

Il est effectivement possible d’avoir plusieurs conteneurs utilisant des serveurs Web, on peut par exemple avoir un conteneur Nginx et Apache2, mais les deux conteneurs ne pourront pas exposés le port 80 par exemple.

C’est pour cela qu’en prérequis, nous avons installé Nginx en tant que reverse proxy.

Il est possible d’exposer un conteneur avec « sa propre IP » en passant par un pont (Bridge).

Plus d’information : Networking overview | Docker Documentation

Un conteneur est persistant mais attention

Le stockage d’un conteneur est persistant, c’est-à-dire que les modifications s’écrivent dans l’image du conteneur, mais attention, lors d’un rebuild de l’image, mise à jour, les données seront perdues.

Vous pouvez arrêter un conteneur sans risque de perdre les données.

Pour palier à ce problème de reconstruction / mise à jour, il est possible de rediriger des dossiers du conteneur vers un dossier sur le serveur hôte

Si on prend par exemple, un conteneur Apache2, on va rediriger le dossier /var/www du conteneur vers un dossier qui se trouve sur l’hôte, si présente deux avantages :

  • Pouvoir accéder aux dossiers et fichiers du serveur web que l’on publie
  • De mettre çà jour le conteneur sans perdre de données.

Où trouver des images

L’ensemble des images Docker sont disponibles ici : Docker Hub

Le hub étant ouvert à tout le monde, bien faire attention au choix des images et choisir de préférence les images Officiel qui sont marqués par un ruban.

Le tag latest

Comme on peut le voir sur la capture ci-dessous, pour une même image, il existe plusieurs tags, souvent cela correspond à la version du logiciel que l’on souhaite.

Comme on peut le voir le tag latest pointe sur la version 10.5 de MariaDB.

Je suppose que vous avez compris à quoi sert le tag latest, il pointe sur la version stable la plus récente.

Dans certaine situation, il faut se méfier de ce tag, notamment quand on utilise plusieurs conteneurs pour faire tourner une application.

Partons du principe, que je souhaite faire fonctionner une application Web, qui a besoin de Apache2, PHP et MariaDB 10.5

Au jour de la rédaction de tutoriel, je peux utiliser le tag latest sur mon conteneur MariaDB car il est sur la version 10.5.

Au bout de 6 mois, je souhaite changer de serveur et je me lance dans l’installation des conteneurs, mon application doit fonctionner avec MariaDB 10.5, mais depuis le tag latest est porté sur la 10.6, ce qui fait que mon application ne fonctionnera pas.

Tout ça pour dire de faire attention avec Tag, pour des applications packagées en conteneur comme Gitlab ou Discourse, l’utilisation du tag latest nous permet par contre de maintenant à jour notre application.

Penser à vérifier les versions derrière latest.

Installation de Gitlab avec Docker

On va maintenant rentrer dans les choses sérieuses de notre tutoriel, on va commencer par installer l’image Docker Gitlab.

En faite, il n’y a rien de compliquer, il y a juste une commande à passer et oui, c’est tout l’intérêt d’utiliser Docker, mais je vais vous expliquer ce que fait la commande, car faire c’est bien, comprendre c’est encore mieux.

Voici la commande que nous allons passer pour installer notre conteneur GitLab :

La première ligne permet de démarrer le conteneur docker-run et le paramètre --detach ou -d permet de lancer en arrière-plan, sans ce paramètre le conteneur va être lié au terminal et donc s’arrête quand vous fermerez la session.

La seconde ligne permet de spécifier le nom de l’hôte --hostname gitlab.rdr-it.local

La troisième ligne indiquer la publication des ports avec les paramètres --publish ou -p. Dans l’exemple je mappe le port 31443 de l’hôte (Ubuntu) sur le port 443 du conteneur et ainsi de suite. Dans la théorie, je pourrais accéder à gitlab par https://ip_du_serveur:31443

La quatrième ligne avec le paramètre --name, indiquer le nom du conteneur au niveau de l’hôte.

La cinquième ligne --restart always permet d’indiquer de toujours démarrer le conteneur.

De la sixième ligne à la huitième, on configure les redirections de dossier à l’aide du paramètre --volume. La première partie correspond au dossier sur l’hôte (Ubuntu) et la seconde après le : le dossier de l’image du conteneur.

La dernière ligne gitlab/gitlab-ce:latest est l’image que l’on souhaite récupérer sur Docker Hub.

Maintenant que vous savez ce que fait la commande, on peut passer à l’installation de notre conteneur.

Avant, on va créer les dossiers sur le serveur

Installer le conteneur gitlab, adapter à votre environnement :

Patienter pendant le téléchargement et la configuration du conteneur Gitlab …

L’installation de l’image est terminée quand on récupère la main sur la console.

Docker image installed

Pour vérifier le bon fonctionne de l’image Gitlab entrer la commande ci-dessous :

sudo docker ps

On voit bien le conteneur avec le status UP et on peut voir également le mappage de port.

Depuis l’interface Cockpit, on peut aussi voir le status du conteneur.

Si on regarde dans les dossiers que l’on a créés pour les volumes, on peut voir que des fichiers et dossiers ont été créés, donc la redirection fonctionne.

Maintenant que notre image est installée, on va configurer Nginx en tant que reverse proxy.

Normalement Gitlab devrait être disponible sur le port 31080, mais je vous déconseille de procéder à sa configuration en passant par le port de l’hôte.

Dans le dossier /etc/nginx/sites-available créer un fichier nano et utiliser la configuration ci-dessous :

Adapter à votre configuration la ligne 3 en indiquant l’URL de l’accès à l’application et la ligne 6 proxy_pass en configurant le port qui correspond à votre conteneur.

Sauvegarder le fichier.

Créer un lien symbolique du fichier dans le dossier /etc/nginx/sites-enable/.

sudo ln -s /etc/nginx/sites-available/<file-name> /etc/nginx/sites-enabled/

Vérifier la configuration de Nginx :

sudo nginx -t

Si tout est bon, recharger la configuration de nginx

sudo systemctl reload nginx

Depuis un navigateur, aller à l’url configuré dans nginx, vous devriez normalement arriver sur le formulaire de configuration du mot de passe du compte root de Gitlab.

Cas d’utilisation de l’HTTPS.

La première étape va être de générer un certificat SSL à l’aide de certbot, utiliser la commande ci-dessous et suivre l’assistant.

sudo certbot

Si tout se passe bien, un certificat Let’s Encrypt est généré et la configuration Nginx adapté à l’utilisation de l’HTTPS.

Pour fonctionner correctement, il faut modifier la configuration de Gitlab pour éviter les erreurs de « mixed content ». Pour le moment celui-ci est configuré en HTTP, il faut donc configurer Gitlab pour lui dire qu’il est accessible en HTTPS depuis le port 80 de son serveur Web.

Ouvrir le fichier gitlab.rb qui se trouve dans /var/gitlab/config/.

Dans le fichier de chercher les éléments de configuration ci-dessous et configurer les de la même façon sauf pour le paramètre external_url.

external_url 'https://git.example.com'
nginx['listen_port'] = 80
nginx['listen_https'] = false

Relancer la configuration de Gitlab :

sudo docker exec -it gitlab gitlab-ctl reconfigure

Adapter la commande à votre conteneur, gitlab après -it correspond au nom du conteneur (--name).

Je ne vous en ai pas encore parlé, la commande docker exec permet d’exécuter des commandes dans le conteneur.


À travers cette partie du tutoriel, on a vu comment installer un conteneur avec le mappage des ports réseau et des dossiers, comment créer une règle de reverse proxy avec Nginx et comment exécuter une commande dans un conteneur depuis l’hôte.

Installation de Discourse avec Docker

Dans ce second exemple d’installation d’une image Docker, on va voir comment installer l’image Discourse qui est un forum et qui utilise quasiment les mêmes composantes serveurs comme :

  • PostgreSQL
  • Ruby
  • Redis

Après cette installation sur un même serveur, nous aurons deux applications totalement indépendantes avec certain composant en « double » et sans conflit.

Sur un serveur, un même serveur, la cohabitation de Discourse et Gitlab n’est pas facile à faire, même impossible, dans les faits je n’ai pas essayé.

Pour l’installation de Discourse, je ne vais pas rentrer dans le détail comme avec Gitlab, car un « utilitaire » de gestion du conteneur est founis.

Sur le serveur, créer un dossier pour Discourse :

sudo mkdir /var/discourse/

Cloner le repository git dans le dossier :

sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse/

La configuration de Discourse et du conteneur se fait l’aide d’un fichier, copier le fichier d’exemple standalone.yml dans le dossier containers en le nommant app.yml

sudo cp /var/discourse/samples/standalone.yml /var/discourse/containers/app.yml

Editer le fichier app.yml à l’aide de nano

sudo nano /var/discourse/containers/app.yml

Dans le fichier, configurer la section expose, indiquant les ports pour http / https.

expose:
  - "32080:80"   # http
  - "32443:443" # https

Configurer les variables d’environnement suivantes :

DISCOURSE_HOSTNAME: 'discourse.rdr-it.local'
DISCOURSE_DEVELOPER_EMAILS: '[email protected],[email protected]'

Configurer un serveur SMTP valide, c’est « obligatoire ».

Enregistrer ensuite le fichier.

Si ce n’est pas fait, aller dans le dossier /var/discourse/.

Lancer la génération de l’image du conteneur :

sudo ./launcher bootstrap app

Patienter pendant le téléchargement et la configuration de l’image.

Maintenant démarrer le conteneur avec la commande :

sudo./launcher start app

Vérifier le bon fonctionnement avec la commande :

sudo docker ps

Dans Cockpit, on peut voir également les deux conteneurs :

Comme pour Girtlab, on va créer un virtualhost, comme cela a été vu précédent, je vais uniquement mettre ici la configuration du virtualhost.

Une fois le virtualhost de configurer, lancer un navigateur et aller à l’url configurée.

Discourse est installé et fonctionnel.

Comme pour Gitlab, il est possible de générer un certificat SSL Let’s Encrypts.

Comme pour Gitlab pour éviter les problèmes de mixed content, il faut forcer le SSL dans la configuration de Discourse

Pour conclure sur ce tutoriel Docker

Ce premier tutoriel dédié à Docker s’arrête (d’autres vont suivre) ici et si je devais conclure en un mot, je dirais : Géniale !

Pendant longtemps, j’ai eu du mal à percevoir l’intérêt de Docker et des conteneurs, car souvent dans le tutoriel on présente Docker pour installer un site Internet avec WordPress et ce type de démonstration est assez limité pour percevoir l’intérêt de la conteneurisation, car on le fait aussi bien avec des virtualhosts.

J’avoue que cette expérience avec l’installation de Gitlab et Discourse en conteneur qui présente des environnements assez complexes m’a ouvert les yeux sur Docker et je crois que je suis devenu de fan (je commence même à entre voir des déploiements en entreprise …).

J’espère que ce tutoriel vous a plu et comme moi vous donne envie d’aller plus loin Docker.

Petit conseil pour finir, si vous souhaitez en apprendre plus avec Docker, je vous conseille de suivre cocadmin et de regarder sa playlist dédiée à Docker.

Romain Drouche
Architecte Système | MCSE: Core Infrastructure
Expert en infrastructures IT avec plus de 15 ans d’expérience sur le terrain. Actuellement Chef de projet Systèmes et Réseaux et Référent SSI (Sécurité des Systèmes d’Information), je mets mon expertise au service de la fiabilité et de la sécurité des environnements technologiques.

Laisser un commentaire