Docker es una software open-source que lo que permite asilar o enpaquetar aplicaciones y sistemas en contenedores, similar como lo hace la virtualizacion pero de manera mas eficiente y liviana.
Instalar las dependencias
Ya sea que estes comenzando o estes trabajando con un proyecto, la confuguracion de las dependencias sera crucial al momento dev desplegar la aplicacion.Si vas a crear un nuevo proyecto prueba el comando
npm init
Te pedira informacion relacionada con la aplicacion, como el nombre, la version, el tipo de licencia entre otras cosas. Ahora solo debes especificarle los paquetes que necesita. En este caso, se necesita a express solo para este proyecto.
npm install --save express //version completa o npm i -s express //version reducida
O en el caso de trabajar con previamente creado, y contenga un archivo package.json en este caso solo con el packete de express similar a este.
package.json{ "name": "bytefate_app_node", "version": "1.0.0", "description": "Node.js Bytefate App on Docker", "author": "name", "main": "server.js", "scripts": { "start": "node server.js" }, "dependencies": { "express": "^4.17.1" } }
Crear el servicio web, en mi caso se vera algo asi.
Si hay algunas retricciones por parte del firewall, con este comando habilitara la operacion del puerto donde estara corriendo la aplicacion.app.js'use strict'; const express = require('express'); // Constants const PORT = 8080; // App const app = express(); app.get('/', (req, res) => { res.send('Welcome to Byte Fate'); }); app.listen(PORT, HOST); console.log(`Running on http://localhost:${PORT}`);
sudo ufw allow 8080
Dockerfile
Ahora a lo que vinimos Dockerfile es un archivo que se le va a indicar en secuencia, al contenedor el comportamiento una vez se ejecute. Lo primero es escoger la imagen, hay distintas distribuciones dependiendo del tamaño de las imagenes, en este ejemplo se utilizara la mas ligera con la version 14 que hasta el momento es la version recomendada
Lo siguiente es prepara la ruta para guardar los archivos dee la aplicacion y en lo posible limitar los permisos asignados al contenedor como buena practicaFROM node:14-alpine
Luego se asigna el espacio de trabajo.RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
Copia el archivo en el directorio que se le asigno en el comando anteriorWORKDIR /home/node/app
Se asegura que los archivos de la aplicacion este con el usuario nodeCOPY package*.json ./
Descarga las dependencias de la aplicacionUSER node
Copia los archivos y le asigna como propietario el usuario nodeRUN npm install
Espone con el puerto asignado el contenedorCOPY --chown=node:node . .
Inicia la aplicacion, con los parametros que se le han pasado.EXPOSE 8080
El archivo queda algo asi.CMD [ "node", "app.js" ]
Nota: En dockerfile si tienes varios cmd solo el ultimo se ejecutara. Cuando se trabaja con git, es conveniente que los anexes tambien a este archivo, el .git y gitignore. .dockerignoreDockerfileFROM node:10-alpine RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app COPY package*.json ./ USER node RUN npm install COPY --chown=node:node . . EXPOSE 8080 CMD [ "node", "app.js" ]
.dockerignorenode_modules .dockerignore Dockerfile
Ahora a crear la imagen, con el siguiente comando.
La -t es para colocarle un tag, que la usaremos para reconocer las imagenes personalizadas y es usual que primero se coloque el nombre de usuaro de dockerhub, seguido del tag de la aplicacion(username/tag). Y el punto (.) es para ejecutarlo en el contexto actual. Para listar las imagenes que tenemos usa el comando.docker build -t username/bytefate_app_node .
Estando todo listo, es hora de ejecutar la imagen con el siguiente comandodocker images
lo que hace el --name es darle un nombre al contenedor que esta corriendo, -p para redirigir el trafico a otro puerto de ser necesario y -d es para correr en segundo plano.Para verificarlo es facil, con el siguiente comando podras ver todos los contenedores que estan corriendo.docker run --name bytefate_app_node -p 80:8080 -d username/bytefate_app_node
docker ps
Bueno eso es todo por el momento, espero que les haya sido de utilidad y nos veremos pronto.