Desplegando una aplicaci贸n Node.js en un Droplet de DigitalOcean con Docker

     

    Introducci贸n

    JavaScript ha recorrido un largo camino a lo largo de los a帽os, y ahora estamos en un punto en el que puede escribir e implementar una aplicaci贸n web con mucha facilidad. Los marcos como Express , Sails y Meteor solo lo han hecho m谩s f谩cil.

    Seguir la mayor铆a de los tutoriales en Internet significa que estar谩 trabajando en su m谩quina local con un proyecto local. Pero, 驴y si quisi茅ramos compartir el proyecto con el mundo o con nuestros amigos? Hoy veremos c贸mo implementar una aplicaci贸n Node.js en un Droplet de DigitalOcean , para que cualquier persona en Internet pueda interactuar con ella.

    Prerrequisitos

    Estibador

    Usaremos Docker para contener nuestra aplicaci贸n en una unidad peque帽a y f谩cilmente implementable. Esta unidad se puede implementar en cualquier lugar donde est茅 instalado Docker.

    Cree una cuenta con Docker Hub y descargue la edici贸n community / desktop. 隆Usaremos esta cuenta m谩s tarde!

    DigitalOcean

    DigitalOcean es un servicio de alojamiento de pago: usaremos su servicio de $ 5 al mes y podemos desactivarlo tan pronto como terminemos para minimizar los costos, pero necesitar谩 un m茅todo de pago para d谩rselo a DigitalOcean antes de usarlo. .

    Aplicaci贸n de node

    Para esto, vamos a crear una aplicaci贸n Express simple que sirva como punto final de estado para que podamos acceder y averiguar si nuestra aplicaci贸n se est谩 ejecutando. En la l铆nea de comando, creemos un directorio:

    $ mkdir digital-ocean
    

    Y luego mu茅vase al directorio e inicialice nuestra aplicaci贸n:

    $ cd digital-ocean
    $ npm init
    

    Si茅ntase libre de presionar ENTERpara omitir / establecer las respuestas predeterminadas para todas las siguientes preguntas, o agregar nombres / descripciones de paquetes si lo desea.

    Para los prop贸sitos de este tutorial, asumiremos que el “punto de entrada” se deja como index.js. Deber铆as terminar con algo parecido a esto:

    package name: (digital-ocean)
    version: (1.0.0)
    description:
    entry point: (index.js)
    test command:
    git repository:
    keywords:
    author:
    license: (ISC)
    
    {
      "name": "digital-ocean",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo "Error: no test specified" && exit 1"
      },
      "author": "",
      "license": "ISC"
    }
    
    
    Is this OK? (yes)
    

    Si busca en el directorio ahora ( lsen la l铆nea de comando), ver谩 un package.jsonarchivo solitario . Contiene la configuraci贸n de nuestra aplicaci贸n. Saltemos all铆 y agreguemos una l铆nea al bloque “scripts”:

    {
      "name": "digital-ocean",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "start": "node index.js",
        "test": "echo "Error: no test specified" && exit 1"
      },
      "author": "",
      "license": "ISC"
    }
    

    Esto nos permite iniciar nuestra aplicaci贸n ejecutando npm start. Los scripts son muy 煤tiles para configurar tareas que realizar谩 con frecuencia con una aplicaci贸n, como pruebas o varios procesos de compilaci贸n.

    A continuaci贸n, queremos instalar Express:

    $ npm install express
    

    Y finalmente, escribamos el c贸digo que servir谩 a nuestro /statuspunto final. En el mismo directorio que nuestro package.jsonarchivo, cree un archivo llamado index.js:

    const express = require('express')
    const app = express()
    const port = 3000
    
    app.get('/status', (req, res) => res.send({status: "I'm alive!"}))
    
    app.listen(port, () => console.log(`Example app listening on port ${port}!`))
    

    Finalmente, probemos nuestra aplicaci贸n ejecutando:

    $ npm start
    

    Al abrir un navegador web y navegar a http://localhost:3000/status, deber铆a ser recibido con algo como esto:

    {"status":"I'm alive!"}
    

    Ahora tenemos una aplicaci贸n Express en funcionamiento, que ahora podemos empaquetar e implementar usando Docker y un servidor Droplet.

    Dockerizar una aplicaci贸n Node.js

    Ahora tenemos una aplicaci贸n que funciona, pero queremos poder implementarla. Podr铆amos crear un servidor y luego configurarlo para que tenga exactamente la misma configuraci贸n que nuestra m谩quina actual, pero eso puede ser complicado. En su lugar, empaquet茅moslo usando Docker.

    C贸mo funciona Docker

    Docker nos permite definir un conjunto de instrucciones que crean lo que se llaman capas . Si quieres imaginar c贸mo se ve una capa, imagina tu sistema de archivos congelado en un momento en el tiempo. Cada nueva capa es una modificaci贸n o adici贸n a ese sistema de archivos, que luego se congela nuevamente.

    Estas composiciones de capas una encima de la otra forman lo que se conoce como una imagen , que es esencialmente un sistema de archivos en una caja, listo para funcionar.

    Esta imagen se puede utilizar para crear contenedores , que son versiones vivas de ese sistema de archivos, listas para ejecutar una tarea que definamos para 茅l.

    Otro aspecto 煤til de esto es que podemos usar im谩genes prefabricadas como la primera capa en nuestras propias im谩genes, lo que nos da un impulso al evitar configuraciones est谩ndar.

    Crear una imagen de Docker

    Lo primero que queremos hacer es crear un Dockerfile. Este archivo es un conjunto de instrucciones que Docker debe interpretar para comprender exactamente c贸mo empaquetar su aplicaci贸n como una imagen.

    En la carpeta de su proyecto, cree un archivo llamado Dockerfiley luego ingrese estos comandos:

    FROM node:13-alpine
    
    WORKDIR /usr/src/app
    
    COPY package*.json ./
    
    RUN npm install
    
    COPY . .
    
    EXPOSE 3000
    CMD [ "npm", "start" ]
    

    Hay algunos componentes aqu铆, veamos esta l铆nea por l铆nea:

    • FROM node:10: Le dice a Docker que use otra imagen como capa base en nuestro Dockerfile; en este caso, obtenemos una imagen con Node.js instalado, versi贸n 10.
    • WORKDIR /usr/src/app: Le dice a Docker la carpeta en la que debe realizar los siguientes comandos.
    • COPY package*.json ./: Le dice a Docker que copie solo package.jsony package-lock.jsonen la imagen de Docker. Hacemos esto porque Docker puede almacenar en cach茅 composiciones de capas, lo que significa que si nada cambia en nuestro package.json, podemos simplemente extraer una composici贸n de capas que ya hemos construido antes.
    • RUN npm install: Hace lo que dice en la lata y ejecuta el npm installcomando para crear una nueva capa de la imagen con todos nuestros m贸dulos instalados. Nuevamente, si nada ha cambiado en nuestro package.json, esto sacar谩 una versi贸n predise帽ada.
    • COPY . .: Copia el resto de la aplicaci贸n en el sistema de archivos. Como es probable que la aplicaci贸n cambie con m谩s frecuencia (es decir, cada vez que realice un cambio de c贸digo), tiene sentido hacer de esta una de las 煤ltimas capas para fines de almacenamiento en cach茅.
    • EXPOSE 3000: Le dice a Docker que abra el puerto 3000 en el contenedor cuando se est谩 ejecutando.
    • CMD [ "npm", "start" ]: Se ejecuta npm starten la instanciaci贸n del contenedor y ejecuta nuestra aplicaci贸n dentro de 茅l.

    Ejecutando nuestra compilaci贸n de Docker

    Ahora que tenemos nuestras instrucciones escritas, 隆construyamos nuestra imagen! En el mismo directorio que su Dockerfile, ejecute:

    $ docker build . -t digital-ocean-app
    

    Esto crea una imagen y luego le da un nombre o ‘etiqueta’ espec铆fico; en este caso, es digital-ocean-app. Para probar que nuestra aplicaci贸n funciona, ejecut茅mosla localmente con:

    $ docker run -p 3000:3000 digital-ocean-app
    

    Esto ejecutar谩 nuestra imagen de Docker como un contenedor y ejecutar谩 la CMDparte de nuestro Dockerfile.

    La -p 3000:3000secci贸n hace lo que se conoce como mapeo de puertos. El n煤mero antes de los dos puntos es el puerto en nuestra m谩quina local que queremos mapear, y el n煤mero despu茅s es el puerto dentro del contenedor al que queremos que se dirija.

    Esto significa que el puerto 3000de nuestra m谩quina ahora se conectar谩 al puerto 3000del contenedor Docker en el que se ejecuta nuestra aplicaci贸n.

    Para probar esto, abra su navegador y navegue de regreso http://localhost:3000/statusy deber铆a ver su punto final de estado.

    Publicar la imagen en Docker Hub

    Ahora que tenemos nuestra imagen de Docker empaquetada, necesitamos almacenarla en alg煤n lugar desde donde podamos extraerla. Deber谩 volver a iniciar sesi贸n en Docker Hub y luego hacer clic en ‘Crear repositorio’. Al igual que los repositorios de Git nos permiten almacenar nuestros proyectos de Git controlados por versiones, los repositorios de Docker nos permiten almacenar nuestras im谩genes de Docker.

    Deber谩 completar el nombre del repositorio, as铆 como una descripci贸n opcional y si es o no un repositorio p煤blico o privado (si necesita o no iniciar sesi贸n como usuario autorizado de Docker, b谩sicamente).

    Por ahora, d茅jelo en p煤blico, ya que nos facilitar谩 la vida cuando intentemos implementar en DigitalOcean. Finalmente, despl谩cese hasta la parte inferior y presione ‘Crear’.

    De vuelta en la l铆nea de comando, necesitamos etiquetar nuestra imagen antes de presionarla:

    $ docker tag digital-ocean-app <USER_NAME>/digital-ocean-app
    

    Necesitaremos reemplazar la <USER_NAME>secci贸n con nuestro nombre de usuario de Docker Hub. Opcionalmente, si queremos especificar que estamos impulsando una versi贸n espec铆fica de nuestra imagen, podemos hacer:

    $ docker tag digital-ocean-app <USER_NAME>/digital-ocean-app:<VERSION>
    

    El <VERSION>se llama el ‘c贸digo de imagen’ – podr铆amos poner un n煤mero all铆 ( 1.0, 1.1, etc.) para representar los comunicados, o incluso describir un entorno ( dev, staging, prod). Tiendo a usar el hash de confirmaci贸n de Git para saber exactamente qu茅 estoy ejecutando y puedo compararlo con mi historial de confirmaci贸n.

    De forma predeterminada, cada vez que empuja, su repositorio crear谩 autom谩ticamente una imagen con la etiqueta :latest, por lo que siempre sabemos cu谩l es la etiqueta de la imagen empujada m谩s recientemente.

    Para poder enviar a nuestro repositorio, necesitaremos iniciar sesi贸n:

    $ docker login
    

    Ingrese sus credenciales de Docker Hub.

    Una vez que haya iniciado sesi贸n correctamente, podr谩 enviar su imagen con:

    $ docker push <USER_NAME>/digital-ocean-app:<OPTIONAL_VERSION>
    

    DigitalOcean

    Finalmente, podemos implementar nuestra aplicaci贸n acoplada en DigitalOcean. Primero, vamos a crear una cuenta:

    Tendr谩 que proporcionar algunos datos personales, incluidos los detalles de pago, as铆 como configurar un proyecto inicial. Si茅ntase libre de simplemente darle un nombre, pero si planea hacer algo extenso, seleccione algunas de las opciones para optimizar su configuraci贸n.

    Una vez que haya terminado, ser谩 redirigido a la p谩gina ra铆z de su proyecto. En el lado izquierdo hay una barra de herramientas con varias opciones. Si茅ntase libre de explorar: DigitalOcean es bueno para informarle si algo que est谩 a punto de hacer le costar谩.

    Crear una clave SSH

    Antes de hacer algo, necesitaremos crear una clave SSH y cargar la parte p煤blica en DigitalOcean. Las claves SSH vienen en dos partes, una clave p煤blica y una clave privada.

    Se utiliza una clave privada para autenticar a un usuario en un sistema. El sistema hace esto realizando una funci贸n usando la clave p煤blica para verificar que la clave privada es la que se usa para generar la clave p煤blica. Si es as铆, ambos proceden del mismo lugar, por lo que se puede confiar en el usuario.

    DigitalOcean querr谩 una clave p煤blica que pueda colocar en cualquier Droplets que iniciemos, para que podamos acceder a ellos con una clave que sabemos que solo nosotros tenemos.

    Creemos un par de claves SSH ahora:

    $ ssh-keygen -t rsa -b 4096
    

    Este comando deber铆a funcionar en Windows, Linux y MacOS.

    Esto le pedir谩 un archivo donde desea guardar la clave que puede llamar algo como – digital-ocean-key.

    Tambi茅n le pedir谩 una frase de contrase帽a; no dude en establecer una si lo desea o puede dejarla vac铆a. Si lo cre贸 en la misma carpeta en la que hemos estado trabajando, ver谩 dos archivos, uno llamado digital-ocean-keyy otro llamado digital-ocean-key.pub, que son respectivamente sus claves p煤blica y privada.

    Agregar la clave SSH a su cuenta de DigitalOcean

    En su cuenta de DigitalOcean, en la parte inferior izquierda, hay un enlace para ‘Seguridad’. Siga este enlace y la p谩gina siguiente tendr谩 una opci贸n para agregar una clave SSH:

    Haga clic en ‘Agregar una clave SSH’ y se le presentar谩 un cuadro de di谩logo para ingresar su clave. Simplemente copie el contenido de su digital-ocean-key.puben el cuadro de texto grande (puede imprimir el contenido en el terminal con cat digital-ocean-key.pub).

    En el cuadro m谩s peque帽o que se encuentra debajo, asigne un nombre a esa clave.

    Configuraci贸n de una gota de DigitalOcean

    Una vez que haya agregado su clave SSH. haga clic en el enlace ‘Droplets’ a la izquierda, y luego en la p谩gina siguiente haga clic en ‘Crear Droplet’.

    En DigitalOcean, un Droplet es un servidor virtual privado que se puede configurar y usar f谩cilmente para ejecutar sus aplicaciones.

    En esta p谩gina, se le presentar谩n varias opciones para configurar su DigitalOcean Droplet, incluida la distribuci贸n, el plan, el tama帽o / costo por mes, la regi贸n y la autenticaci贸n.

    En lugar de seleccionar una distribuci贸n y configurarla nosotros mismos, vamos a conseguir que DigitalOcean cree un Droplet que ya tiene Docker ejecut谩ndose por nosotros.

    Haga clic en ‘Marketplace’ encima de las diversas distribuciones de Linux; aqu铆 es donde puede encontrar varias configuraciones existentes; estos son Droplets que, cuando se inician, comenzar谩n con el software descrito ya instalado.

    Esto es un ahorro de tiempo real y significa que podemos iniciar varias instancias con la misma configuraci贸n exacta si quisi茅ramos, en lugar de tener que configurarlas todas individualmente.

    Deber铆a haber una opci贸n para un Docker Droplet. De lo contrario, haga clic en ‘Ver todas las aplicaciones de Marketplace’ y podr谩 encontrar una configuraci贸n de Docker adecuada all铆:

    En “Plan”, queremos seleccionar “Est谩ndar”. Seleccionemos la opci贸n de $ 5 al mes, con fines de demostraci贸n.

    Si茅ntase libre de elegir la regi贸n que sea adecuada para usted; generalmente, ser谩 m谩s f谩cil acceder a la m谩s cercana, pero no deber铆a tener un impacto masivo.

    En Autenticaci贸n, seleccione ‘Clave SSH’ y seleccione las claves que le gustar铆a usar (como la que cre贸 en el 煤ltimo paso). Tambi茅n puede nombrar su Droplet si lo desea. Cuando haya terminado, haga clic en ‘Crear gota’ en la parte inferior.

    Espere un minuto a que se inicie Droplet. Aparecer谩 debajo del panel ‘Gotitas’ con un punto verde al lado cuando est茅 listo. En este punto, estamos listos para conectarnos.

    Ejecuci贸n de im谩genes de Docker en gotitas de OD

    Haga clic en el Droplet iniciado y ver谩 los detalles al respecto. Por el momento, estamos interesados 鈥嬧媏n la direcci贸n IP: esta es la direcci贸n en la que se encuentra el Droplet en Internet.

    Para acceder a 茅l, necesitaremos conectarnos a 茅l usando nuestra clave privada creada previamente. Desde la misma carpeta que esa clave privada, ejecute:

    $ ssh -i digital-ocean-key [email聽protected]<IP_ADDRESS>
    

    Las -i digital-ocean-keyespecifica que est谩 utilizando una clave SSH, y donde se encuentra dicha clave. Los [email聽protected]<IP_ADDRESS>Especifica el usuario y la direcci贸n que est谩 intentando conectarse a – en este caso, el usuario que estamos tratando de conectar con es root, y la direcci贸n IP ser铆an la direcci贸n de la digitalocean droplet.

    Una vez que est茅 conectado a la instancia, es solo cuesti贸n de ejecutar su imagen de Docker. Si lo dej贸 en un repositorio p煤blico, puede ejecutarlo f谩cilmente con el mismo nombre que utiliz贸 para enviarlo:

    $ docker run -p 3000:3000 <DOCKER_USER_NAME>/digital-ocean-app:<OPTIONAL_TAG>
    

    Si lo coloca en un repositorio privado, deber谩 iniciar sesi贸n docker loginnuevamente antes de ejecutar su docker runcomando.

    Una vez que su contenedor Docker se est茅 ejecutando, abra una pesta帽a en su navegador y navegue hasta <IP_ADDRESS>:3000/statusd贸nde <IP_ADDRESS>est谩 la direcci贸n IP del DigitalOcean Droplet en el que est谩 ejecutando el contenedor.

    Se le debe presentar su punto final de estado creado anteriormente: 隆felicitaciones! 隆Ahora tiene una aplicaci贸n Node.js ejecut谩ndose en DigitalOcean!

    Conclusi贸n

    Hay algunas direcciones a las que puede ir desde aqu铆. Primero, probablemente querr谩 construir su aplicaci贸n para que haga cosas m谩s 煤tiles.

    Es posible que desee considerar comprar un dominio para alojar su aplicaci贸n y apuntarlo a su DigitalOcean Droplet para que sea m谩s f谩cil de acceder.

    Tambi茅n recomendar铆a explorar algunas de las dem谩s capacidades de DigitalOcean: podr铆a usar algunas de sus herramientas de red para proteger su Droplet restringiendo el acceso al puerto SSH (22), explorar algunas de las otras im谩genes que tiene Docker o 隆incluso mire la creaci贸n de bases de datos para su aplicaci贸n!

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *