Comment déployer une application Node.js sur Amazon Web Services à l'aide de Docker

Plug: Publié à l'origine dans le magazine Zeolearn.
Pour découvrir de nombreux autres contenus utiles, tels que cet article, visitez le blog Zeolearn. Le blog contient des articles axés sur le développement Web / logiciel: AngularJS, ReactJS, NodeJS, Django et Data Science (y compris l’apprentissage automatique, la science des données, Python et l’apprentissage en profondeur).

Table des matières

1. Introduction
2. Prérequis
3. Une introduction rapide sur Docker et AWS
4. Ce que nous allons déployer
5. Créer un fichier Docker
6. Construire une image de docker
7. Exécuter un conteneur de docker
8. Création du registre (ECR) et téléchargement de l'image de l'application sur celui-ci
9. Créer une nouvelle définition de tâche
10. Créer un cluster
11. Créer un service pour l'exécuter
12. Conclusion

1. Introduction

Écrire du code qui fait des choses est quelque chose que la plupart des développeurs connaissent bien. Parfois, nous devons assumer la responsabilité d'un ingénieur SysAdmin ou DevOps et déployer notre base de code en production afin d'aider une entreprise à résoudre les problèmes de ses clients.

Dans ce tutoriel, je vais vous montrer comment amarrer une application Node.js et la déployer sur Amazon Web Service (AWS) à l'aide d'Amazon ECR (Elastic Container Registry) et ECS (Elastic Container Service).

2. Prérequis

Pour suivre ce didacticiel, vous aurez besoin des éléments suivants:

  1. Node and Npm: suivez ce lien pour installer les dernières versions.
  2. Connaissance de base de Node.js.
  3. Docker: L'installation fournit Docker Engine, le client CLI Docker et d'autres éléments intéressants. Suivez les instructions pour votre système d'exploitation. Pour vérifier si l'installation a fonctionné, lancez ceci sur le terminal:
docker --version

La commande ci-dessus devrait afficher le numéro de version. Si ce n’est pas le cas, l’installation ne s’est pas terminée correctement.

4. Compte AWS: inscrivez-vous pour un niveau gratuit. Il y a une période d'attente pour vérifier votre numéro de téléphone et votre carte bancaire. Après cela, vous aurez accès à la console.

5. AWS CLI: suivez les instructions pour votre système d'exploitation. Vous devez installer Python.

3. Une introduction rapide sur Docker et AWS

Docker est un logiciel open source qui vous permet de regrouper une application avec les dépendances et l’environnement requis dans un ‘conteneur’ que vous pouvez expédier et exécuter n’importe où. Elle est indépendante des plates-formes ou du matériel, et l’application conteneurisée peut donc s’exécuter de manière isolée dans n’importe quel environnement.

Les conteneurs Docker résolvent de nombreux problèmes, par exemple lorsqu'une application fonctionne sur l'ordinateur d'un collègue mais ne s'exécute pas sur le vôtre, ou qu'elle fonctionne dans l'environnement de développement local mais ne fonctionne pas lorsque vous la déployez sur un serveur.

Amazon Web Services (AWS) offre aux entreprises un service de cloud computing fiable, évolutif et peu coûteux. Comme je l'ai mentionné précédemment, ce tutoriel portera sur l'utilisation des services ECR et ECS.

4. Ce que nous allons déployer

Construisons rapidement un exemple d’application que nous utiliserons aux fins de ce didacticiel. Ce sera très simple application Node.js.

Entrez les informations suivantes dans votre terminal:

// crée un nouveau répertoire
mkdir sample-nodejs-app
// changer de nouveau répertoire
cd sample-nodejs-app
// Initialise npm
npm init -y
// installe express
npm install express
// crée un fichier server.js
touchez server.js

Ouvrez server.js et collez le code ci-dessous dans celui-ci:

// server.js
const express = require ('express')
const app = express ()
app.get ('/', (req, res) => {
    res.send ('Bonjour tout le monde depuis une application Node.js!')
})
app.listen (3000, () => {
    console.log ('Le serveur est actif sur 3000')
})

Démarrer l'application avec:

noeud serveur.js

Accédez-y sur http: // localhost: 3000. Vous devriez obtenir Hello World depuis une application Node.js! affiché dans votre navigateur. Le code complet est disponible sur GitHub.

Passons maintenant à la production de notre très importante application.

5. Créer un fichier Docker

Nous allons commencer à docker l’application en créant un fichier unique appelé fichier Docker dans la base du répertoire de notre projet.

Le Dockerfile est le modèle à partir duquel nos images sont construites. Et ensuite, les images se transforment en conteneurs dans lesquels nous exécutons nos applications.

Chaque fichier Dockerfile commence par une image de base. Il existe deux façons de créer votre fichier Docker:

  1. Utilisez une image de base du système d'exploitation (par exemple, le système d'exploitation Ubuntu, Debian, CentOS, etc.) et installez-y un environnement d'application tel que Node.js OU
  2. Utilisez une image de base prête pour l'environnement pour obtenir une image de système d'exploitation avec un environnement d'application déjà installé.

Nous allons procéder à la deuxième approche. Nous pouvons utiliser l'image officielle Node.js hébergée sur Dockerhub, qui repose sur Alpine Linux.

Écrivez ceci dans le fichier de docker:

DE noeud: 8-alpine
RUN mkdir -p / usr / src / app
WORKDIR / usr / src / app
COPIE . .
RUN npm installer
EXPOSER 3000
CMD ["noeud", "serveur.js"]

Parcourons ligne par ligne pour voir ce qui se passe ici et pourquoi.

DE noeud: 8-alpine

Ici, nous construisons notre image Docker en utilisant l’image officielle Node.js de Dockerhub (un référentiel pour les images de base).

  • Démarrez notre fichier Docker avec une instruction FROM. C'est ici que vous spécifiez votre image de base.
  • L'instruction RUN nous permettra d'exécuter une commande pour tout ce que vous voulez faire. Nous avons créé un sous-répertoire / usr / src / app qui contiendra notre code d'application dans l'image du menu fixe.
  • L'instruction WORKDIR établit le sous-répertoire que nous avons créé en tant que répertoire de travail pour toutes les instructions RUN, CMD, ENTRYPOINT, COPY et ADD qui le suivent dans le fichier Docker. / usr / src / app est notre répertoire de travail.
  • COPY nous permet de copier des fichiers d'une source vers une destination. Nous avons copié le contenu du code de notre application de noeud (server.js et package.json) de notre répertoire actuel vers le répertoire de travail de notre image de menu fixe.
  • L'instruction EXPOSE informe Docker que le conteneur écoute sur les ports réseau spécifiés au moment de l'exécution. Nous avons spécifié le port 3000.
  • Enfin, l’instruction CMD spécifie la commande permettant de démarrer notre application. Cela indique à Docker comment exécuter votre application. Nous utilisons ici le noeud server.js, qui est généralement le mode d’exécution des fichiers dans Node.js.

Avec ce fichier terminé, nous sommes maintenant prêts à créer une nouvelle image Docker.

6. Construire une image de docker

Assurez-vous que Docker est opérationnel. Maintenant que nous avons défini notre fichier Docker, construisons l’image avec un titre en utilisant -t:

docker construire -t exemple-nodejs-app.

Cela produira des hachages et des chaînes alphanumériques qui identifient les conteneurs et les images en indiquant «Construit avec succès» sur la dernière ligne:

Envoi du contexte de construction au démon Docker 1.966MB
Étape 1/7: nœud FROM: 6-alpine
 ---> 998971a692ca
Étape 2/7: Lancez mkdir -p / usr / src / app
 ---> Utiliser le cache
 ---> f1aa1c112188
Étape 3/7: WORKDIR / usr / src / app
 ---> Utiliser le cache
 ---> b4421b83357b
Étape 4/7: COPIER. .
 ---> 836112e1d526
Étape 5 sur 7: RUN npm install
 ---> en cours d'exécution dans 1c6b36b5381c
npm WARN sample-nodejs-app@1.0.0 No description
npm WARN sample-nodejs-app@1.0.0 Pas de champ de référentiel.
Retrait du conteneur intermédiaire 1c6b36b5381c
 ---> 93999e6c807f
Étape 6/7: EXPOSE 3000
 ---> en cours d'exécution dans 7419020927f1
Retrait du conteneur intermédiaire 7419020927f1
 ---> ed4ac8a31f83
Étape 7/7: CMD ["noeud", "serveur.js"]
 ---> en cours d'exécution dans c77d34f4c873
Retrait du conteneur intermédiaire c77d34f4c873
 ---> eaf97859f909
Eaf97859f909 construit avec succès
// n'attendez pas les mêmes valeurs de votre terminal.

7. Exécution d’un conteneur Docker

Nous avons construit l’image de menu fixe. Pour voir les images créées précédemment, exécutez:

images de docker

Vous devriez voir l'image que nous venons de créer comme la plus récente en fonction du temps:

Copier l'image Id. Pour exécuter le conteneur, nous écrivons sur le terminal:

docker run -p 80: 3000 {image-id}
// remplis avec ton image-id

Par défaut, les conteneurs Docker peuvent établir des connexions avec le monde extérieur, mais ce dernier ne peut pas se connecter aux conteneurs. -p publie tous les ports exposés sur les interfaces hôtes. Ici, nous publions l'application sur le port 80: 3000. Comme nous exécutons Docker localement, accédez à http: // localhost pour afficher.

À tout moment, vous pouvez vérifier les conteneurs Docker en cours d'exécution en tapant:

conteneur docker ls

Enfin, vous pouvez empêcher le conteneur de s'exécuter en:

docker stop {image-id}

Laissez le démon Docker en cours d'exécution.

8. Créer un registre (ECR) et télécharger l'image de l'application sur celui-ci

ECR (Amazon Elastic Container Registry) est un registre de conteneurs Docker entièrement géré qui permet aux développeurs de stocker, gérer et déployer facilement les images de conteneurs Docker. Amazon ECR est intégré à Amazon Elastic Container Service (ECS), ce qui simplifie le flux de travail de votre développement à la production.

Le mot clé «Élastique» signifie que vous pouvez adapter la capacité ou la réduire à votre guise.

Pas:

  1. Accédez à la console AWS et connectez-vous.
  2. Sélectionnez le service de conteneur EC2 et commencez.

3. La première page d'exécution s'affiche, faites défiler l'écran vers le bas et cliquez sur Annuler> entrez dans le tableau de bord ECS.

4. Pour vous assurer que votre CLI peut se connecter avec votre compte AWS, exécutez sur le terminal:

aws configurer

Si votre AWS CLI était correctement installée, aws configure vous demandera les informations suivantes:

$ aws configure
AWS Access Key ID [None]: clé d'accès
Clé d'accès secrète AWS [Aucune]: clé secrète
Nom de région par défaut [Aucun]: us-west-2
Format de sortie par défaut [Aucun]:

Obtenez les informations d'identification de sécurité de votre compte AWS sous votre nom d'utilisateur> Clés d'accès. Exécutez à nouveau aws configure et remplissez correctement.

4. Créez un nouveau référentiel et entrez un nom (de préférence avec le même nom de conteneur que dans votre environnement de développement local pour des raisons de cohérence).

Par exemple, utilisez sample-nodejs-app.

Suivez les 5 instructions de la console AWS pour la construction, le balisage et le transfert des images Docker:

Remarque: Les arguments suivants sont les miens et différeront des vôtres. Il vous suffit donc de suivre les étapes décrites sur votre console.

  1. Récupérez la commande de connexion Docker que vous pouvez utiliser pour authentifier votre client Docker auprès de votre registre:
    Remarque: Si vous recevez une erreur «Options inconnues: - no-include-email», installez la dernière version de l'AWS CLI. En savoir plus ici.
aws ecr get-login --no-include-email --region us-east-2

2. Exécutez la commande de connexion de docker qui a été renvoyée à l'étape précédente (il suffit de copier et coller). Remarque: Si vous utilisez Windows PowerShell, exécutez la commande suivante:

Invoke-Expression -Command (aws ecr get-login --no-include-email --region us-east-2)

Il devrait produire: Login Succeeded.

3. Générez votre image Docker à l'aide de la commande suivante. Pour plus d'informations sur la création d'un fichier Docker à partir de rien, voir les instructions ici. Vous pouvez ignorer cette étape car notre image est déjà construite:

docker construire -t exemple-nodejs-app.

4. Une fois la construction terminée, associez un tag à votre image avec un mot clé (le plus récent, par exemple) afin de pouvoir transférer l'image dans ce référentiel:

étiquette docker sample-nodejs-app: 559908478199.dkr.ecr.us-east-2.amazonaws.com/sample-nodejs-app:latest la plus récente

5. Exécutez la commande suivante pour envoyer cette image dans le référentiel AWS que vous venez de créer:

docker push 559908478199.dkr.ecr.us-east-2.amazonaws.com/sample-nodejs-app:latest

9. Créer une nouvelle définition de tâche

Les tâches fonctionnent comme la commande d'exécution de menu fixe de la CLI de Docker, mais pour plusieurs conteneurs. Ils définissent:

  • Images de conteneur (à utiliser)
  • Volumes (le cas échéant)
  • Variables d'environnement réseaux
  • Cartographie du port

Dans Définitions de tâches du tableau de bord ECS, cliquez sur le bouton Créer une nouvelle définition de tâches (ECS):

Définissez un nom de tâche et utilisez les étapes suivantes:

  • Ajouter un conteneur: sample-nodejs-app (celui que nous avons poussé).
  • Image: l'URL de votre conteneur. Le mien est 559908478199.dkr.ecr.us-east-2.amazonaws.com/sample-nodejs-app
  • Limite souple: 512
  • Mappez 80 (hôte) sur 3000 (conteneur) pour sample-nodejs-app
  • Variables Env:

NODE_ENV: production

10. Créer un cluster

Un cluster est l'emplacement où les conteneurs AWS sont exécutés. Ils utilisent des configurations similaires aux instances EC2. Définir ce qui suit:

  • Nom du cluster: demo-nodejs-app-cluster
  • Type d'instance EC2: t2.micro

(Remarque: vous sélectionnez les instances en fonction de la taille de votre application. Nous avons sélectionné ici la plus petite. Votre sélection affecte le montant des factures qui vous seront facturées à la fin du mois. Pour plus d’informations, visitez le site.). Merci Nicholas Kolatsis pour avoir signalé que la sélection précédente de m4.large était chère pour ce tutoriel.

  • Nombre d'instances: 1
  • Stockage EBS: 22
  • Paire de clés: aucune
  • VPC: Nouveau

Une fois le processus terminé, vous pouvez choisir de cliquer sur «Afficher le cluster».

11. Créer un service pour l'exécuter

Allez dans Définition de tâche> cliquez sur demo-nodejs-app> cliquez sur la dernière révision.

Dans la définition de tâche, cliquez sur le menu déroulant des actions et sélectionnez Créer un service.

Utilisez le suivant:

  • Type de lancement: EC2
  • Nom du service: demo-nodejs-app-service
  • Nombre de tâches: 1

Ignorez les options et cliquez sur Créer un service et sur Afficher le service.

Vous verrez son statut en attente. Donnez-lui un peu de temps et cela indiquera RUNNING.

Accédez au cluster (via un lien du service que nous venons de créer)> Instances EC2> Cliquez sur l'instance de conteneur pour afficher le DNS public.

Visitez le DNS public pour voir notre application! Le mien est ec2–18–219–113–111.us-east-2.compute.amazonaws.com

12. Conclusion.

Félicitations pour avoir terminé ce post! Prenez le code pour la partie Docker à partir de Github.

N'hésitez pas à me soutenir (devapparel.co) et à bien paraître. Aussi, commentez ou partagez ce post. Merci d'avoir lu!

Plug: Encore une fois, pour plus de contenu de qualité comme celui-ci, visitez le blog de Zeolearn.