Page d'accueil Mes articles

Docker-compose pour la production ( 2 / 3 )

Nous avons réussi à créer les images de production, essayons maintenant de déployer tout cela en production sur un vrai VPS.

Publié en Novembre 2021.
Dernière mise à jour Septembre 2022.

Pour commencer, je tiens à préciser que je ne suis pas sponsorisé par Scaleway :) Plusieurs hébergeurs vous propose des VPS ( Virtual Private Server ), les prix varient et les services également. J'ai choisi Scaleway après plusieurs années chez OVH pour deux raisons : leur localisation et l'implémentation du connecteur S3 pour l'object storage ( j'y reviendrai plus tard dans d'autres articles ).

[Edit Novembre 2021] Désormais je suis revenu sur OVH, le connecteur S3 est disponible !

L'avantage non négligeable de Scaleway pour ma démonstration, c'est que la facturation s'effectue à l'heure. Je vais donc commander une petite machine à 0,01€/heure que je supprimerai à la fin de la démonstration.

Lors de la création de votre VPS chez Scaleway, choisissez bien l'offre la moins chère

Texte alternatif

Donnez lui un petit nom, puis lancez la création de votre instance

Texte alternatif

Une fois l'instance créée, vous allez pouvoir vous y connecter très simplement grâce à une authentification ssh.

Texte alternatif

Une fois connecté en SSH sur cette nouvelle machine ubuntu, j'installe docker et docker-compose ( pour plus d'infos, rendez-vous sur la documentation de docker )

[Edit] Il est possible que ce script ne fonctionne plus. Je vous invite à vous rendre sur la documentation

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker root
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Maintenant que docker et docker-compose sont installés sur ma machine de prod, je me déconnecte et je reviens sur mon ordinateur. Je vais maintenant créer un pont entre mon ordinateur et mon VPS distant de manière à contrôler mes conteneurs directement depuis mon poste ( sans me connecter en ssh ).

❯ docker-machine create -d generic --generic-ip-address 51.15.141.141 --generic-ssh-user root demo-docker
...
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env demo-docker

Cette commande peut être un peu longue. Une fois terminé, je vais définir mon docker host comme étant mon VPS. De cette façon, je vais être capable de créer / stopper / supprimer mes conteneurs directement depuis mon poste.

Et pour cela, rien de plus simple :

❯ eval $(docker-machine env demo-docker)

A partir de ce moment, toutes les commandes docker que vous allez lancer seront exécutées sur votre VPS. ( Lorsque l'on est sur une prod, on a intérêt à savoir ce que l'on fait ).

Comme je l'avais créé sur ma machine de dev, je vais créer le réseau demo_docker sur mon VPS

❯ docker network create demo_docker

Puis, depuis mon répertoire demo_docker, je lance alors l'instruction suivante :

❯ docker-compose -f docker-compose-prod.yaml up -d

Et maintenant, si sur votre navigateur vous saisissez l'IP de votre VPS suivi du port 8080, vous devriez voir une jolie erreur SQL ... Mais on peut dire que ça marche déjà pas mal 😁

Ma prochaine étape est de créer une base de données sur mon VPS à laquelle mon application pourra se connecter. Je vais donc me baser sur le fichier docker-compose.yml que j'avais mis dans le répertoire mariadb précédemment, mises à part quelques modifications dedans pour y rajouter un mot de passe par exemple, ça sera le même.

❯ scp docker-compose.yaml root@51.15.141.141:~/ 

Grace à la commande scp, j'envoie ce fichier docker-compose.yaml sur mon VPS.

❯ ssh root@51.15.141.141
❯ mkdir mariadb
❯ mv docker-compose.yaml mariadb
❯ vim docker-compose.yaml

J'édite alors mon fichier en changeant les variables d'environnements :

    db:
        image: mariadb:10.5.6
        environment:
            MYSQL_ROOT_PASSWORD: "verysecret"

Je sauvegarde et je quitte ( :wq ), puis je démarre ma base de donnée avec la commande docker-compose up -d

Maintenant retournez sur votre navigateur puis saisissez l'ip de votre VPS suivi du port 8080. Et là, surprise, nous n'avons plus la même erreur !

Texte alternatif

La connexion est refusée puisque nous utilisons les variables d'environnement de développement où nous n'avons pas défini de mot de passe pour l'utilisateur root.

Dans notre répertoire demo_docker, on va donc copier notre fichier .env en fichier .env.prod.

❯ cp .env .env.prod

Puis on va définir dans notre fichier .env.prod la variable d'environnement DB_PASSWORD avec le mot de passe de la prod.

# .env.prod
...
DB_PASSWORD=verysecret

Maintenant, il suffit de recréer mes conteneurs de production en tenant compte de ces nouvelles variables d'environnement.

❯ docker-compose --env-file .env.prod -f docker-compose-prod.yaml up -d --force-recreate

Avec docker ps, j'identifie rapidement le nom de mon conteneur mariadb ( mariadb_db_1 ). Je vais donc pouvoir facilement créer la base de donnée en m'y connectant

❯ docker exec -it mariadb_db_1 mysql -pverysecret
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 10.5.6-MariaDB-1:10.5.6+maria~focal mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE demo;
Query OK, 1 row affected (0.001 sec)

Et maintenant, si on se rend dans notre navigateur et que l'on saisit l'IP de notre VPS suivi du port 8080... Victoire ! Nous avons notre Hello World de production !

Bien sûr, notre mise en production n'est pas terminée, car il est bien évident que nous allons devoir mettre en place un firewall sur notre VPS et se protéger des tentatives d'intrusions grâce à un outil très intéressant qu'est fail2ban.

Et en dernière étape, nous allons devoir configurer un domaine avec du SSL.

Suite au prochain épisode !

Cet article vous a été utile ? Faites le connaître sur les réseaux sociaux Twitter twitter LinkedIn linkedin

Un commentaire ?

codeur
Ou connectez-vous avec GitHub