Dans cet article on va voir comment déployer des container docker d’une application multicontainer dans un VPS à l’aide de Docker-compose. Sur DigitalOcean, la manipulation est plus facile que sur Azure ou AWS (le plus complexe)
Contenu
- 1 Création du Droplet
- 2 Cloner votre projet depuis Github
- 3 Installer docker-compose
- 4 Clonage du projet depuis Github
- 5 Copie du fichier docker-compose-prod.yml depuis votre poste vers votre droplet
- 6 Démarrage du docker-compose avec le fichier de prod
- 7 Accès à l’application sur DigitalOcean
- 8 Les problèmes rencontrés et leurs solutions
Création du Droplet
Un droplet sur DigitalOcean (un prestataire Cloud abordable et pas trop compliqué à utiliser),
1/Créer un compte sur DigitalOcean
2/créer un droplet l’équivalent d’un VPS, choisir Ubuntu comme OS avec Docker préinstallé en vous aidant du Marketplace. Vous créerez par la même occasion un projet qui apparaitra dans la sidebar.
Ensuite vous choisissez le Datacenter le plus proche de chez vous, en France l’on choisira Amsterdam par exemple.
Dans la section « Choose an image« , cliquez sur l’onglet Marketplace, puis sur l’image Docker on Ubuntu, ici l’image représente une machine virtuelle bien sûr et pas une image Docker.
Ensuite choisissez les options les moins chères, dans Droplet Type, choisissez « Basic« , dans CPU options, choisissez « Regular« , et la formule au mois la moins chère.
Dans « Choose Authentication Method« , choisissez Password pour faire simple, et SSH Key pour faire pratique (pas de mémorisation de mot de passe et login nécessaire). Allez sur ce post pour générer et mettre votre clé sur le service. Enfin cliquez sur « Create Droplet ». Au bout d’un certain temps votre droplet sera créée avec Docker installé, cependant Docker-Compose ne sera pas encore installé. Il vous faudra faire via la console.
Si vous voulez installer à la main Docker, les instruction sont sur cette page :
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04
Cloner votre projet depuis Github
Pour vous connecter en console dans votre Droplet dans la sidebar « Projects« , cliquez sur votre projet
Installer docker-compose
Une fois dedans cliquez sur « Console« , cela ouvrira un shell. Installez docker-compose
///sudo apt-get install docker-compose-plugin ou tapez docker-compose, une erreur avec un message sur comment installer docker-compose s'affichera. apt install docker-compose
Vous êtes en connecté en root, allez à /home et cloner le projet. Le projet consiste en un front end en ReactJS, un backend en Node/Express et de MongoDB. Ce dernier est directement tiré du hub de Docker. Alors que le front et le back vont être transformé en image via leurs Dockerfiles respectifs.
Clonage du projet depuis Github
/home# git clone git@github.com:refschool/vidly.git
On clone soit en SSH car Github ne supporte plus l’authentification par login et mot de passe. ou alors il faut utiliser un PAT personal access token. L’ennui avec la clé SSH est qu’il faut en créer une sur le droplet et la mettre sur Github, cela fait beaucoup de manipulations. Le mieux est de créer le PAT sur Github. Il s’utilise comme un mot de passe.
git clone https://<PAT>@github.com/refschool/vidly.git
Copie du fichier docker-compose-prod.yml depuis votre poste vers votre droplet
A ce stade il n’y a pas grand d’installé ni de configuré pour votre droplet (pas de FTP etc). Le moyen le plus simple d’envoyer un fichier vers le droplet est d’utiliser l’utilitaire rsync pour envoyer ce fichier. Mais le problème est que ce n’est pas simple d’avoir rsync sur Windows (pas un problème sur Linux). On va utiliser scp depuis le terminal DOS.
scp -i C:\Users\admin\.ssh\id_rsa E:\mosh\vidly\docker-compose-prod.yml root@188.166.87.69:/home/
Update :
Si le fichier docker-compose-prod.yml est dans le git, pas besoin de faire cette manipulation finalement.
Démarrage du docker-compose avec le fichier de prod
Dans la racine du projet où il y a le fichier docker-compose-prod.yml
docker-compose -f docker-compose-prod.yml up -d
Cette unique ligne va créer ou importer les images, démarrer les containers et in fine votre application.
Accès à l’application sur DigitalOcean
Si tout s’est bien passé, vous allez pouvoir accéder à votre application sur le droplet à l’adresse IP que vous pouvez retrouver dans votre interface chez DigitalOcean, sur le port 3000.
Les problèmes rencontrés et leurs solutions
An accédant via l’adresse IP l’application, on rencontre une première erreur :
Problème de CORS
La preière fois que vous accédez à votre application, vous allez rencontrer ce message « Could not fetch movie »
Ceci est vraisemblablement dû à un problème de CORS (cross origin), si on ouvre les devtools, onglet Réseau, en inspectant la requête, vous aurez les indices. La requête est faite à http://localhost:3001/api alors que notre serveur possède une adresse IP (voir image)
En effet en phase de développement on a http://localhost:3001/api (voir le fichier src/services/api.js) , si la variable d’environnement REACT_APP_API_URL est settée, elle surchargera localhost.
const baseUrl = process.env.REACT_APP_API_URL || "http://localhost:3001/api";
A la racine du projet, il y a un fichier docker-compose-prod.yml. Dans le Dockerfile du front il vous faudra remplacer dans le fichier Dockerfile après COPY
#Dockerfile ... COPY . . ENV REACT_APP_API_URL=http://adresse-ip-du-droplet:3001/api ...
Problème de droits de fichier
Vérifiez aussi que dans le dossier backend, les fichiers docker-entrypoint.sh et wait-for soient exécutables en faisant la commande chmod +x <fichier>.
Une fois que la commande docker-compose est faite, vous avez la main dans le shell, Inspectez les containers
docker ps //Voir les logs d'un container docker logs <id-container> //Par exemple si le container du backend ne fonctionne pas correctement, lisez les logs. //Pour arrêter docker-compose down //Pour relancer avec un build d'images docker-compose -f docker-compose-prod.yml up -d --build