Docker
Ejecutando la aplicación Node.js simple
Buscar..
Ejecutar una aplicación Node.js básica dentro de un contenedor
El ejemplo que voy a discutir asume que tienes una instalación de Docker que funciona en tu sistema y una comprensión básica de cómo trabajar con Node.js. Si sabe cómo debe trabajar con Docker, debería ser evidente que el marco Node.js no necesita estar instalado en su sistema, sino que estaríamos usando la latest
versión de la imagen de node
disponible en Docker. Por lo tanto, si es necesario, puede descargar la imagen de antemano con el comando docker pull node
. (El comando pulls
automáticamente la última versión de la imagen del node
desde la ventana acoplable).
Proceda a hacer un directorio donde residan todos sus archivos de aplicación de trabajo. Cree un archivo
package.json
en este directorio que describa su aplicación, así como las dependencias. El archivopackage.json
debería tener este aspecto:{ "name": "docker_web_app", "version": "1.0.0", "description": "Node.js on Docker", "author": "First Last <[email protected]>", "main": "server.js", "scripts": { "start": "node server.js" }, "dependencies": { "express": "^4.13.3" } }
Si necesitamos trabajar con Node.js, generalmente creamos un archivo de
server
que define una aplicación web. En este caso, utilizamos el frameworkExpress.js
(versión4.13.3
adelante). Un archivoserver.js
básico se vería así:var express = require('express'); var PORT = 8080; var app = express(); app.get('/', function (req, res) { res.send('Hello world\n'); }); app.listen(PORT); console.log('Running on http://localhost:' + PORT);
Para aquellos familiarizados con Docker,
Dockerfile
encontrado unDockerfile
. UnDockerfile
es un archivo de texto que contiene todos los comandos necesarios para crear una imagen personalizada que se adapte a su aplicación.
Cree un archivo de texto vacío llamado Dockerfile
en el directorio actual. El método para crear uno es sencillo en Windows. En Linux, es posible que desee ejecutar touch Dockerfile
en el directorio que contiene todos los archivos necesarios para su aplicación. Abra el Dockerfile con cualquier editor de texto y agregue las siguientes líneas:
FROM node:latest
RUN mkdir -p /usr/src/my_first_app
WORKDIR /usr/src/my_first_app
COPY package.json /usr/src/my_first_app/
RUN npm install
COPY . /usr/src/my_first_app
EXPOSE 8080
FROM node:latest
instruye al demonio Docker desde qué imagen queremos construir. En este caso, utilizamos lalatest
versión delnode
imagen oficial de Docker disponible en Docker Hub .Dentro de esta imagen, procedemos a crear un directorio de trabajo que contiene todos los archivos necesarios y le indicamos al demonio que establezca este directorio como el directorio de trabajo deseado para nuestra aplicación. Para esto sumamos
RUN mkdir -p /usr/src/my_first_app WORKDIR /usr/src/my_first_app
Luego procedemos a instalar las dependencias de la aplicación moviendo primero el archivo
package.json
(que especifica la información de la aplicación, incluidas las dependencias) al directorio de trabajo/usr/src/my_first_app
en la imagen. Hacemos esto porCOPY package.json /usr/src/my_first_app/ RUN npm install
Luego
COPY . /usr/src/my_first_app
para agregar todos los archivos de la aplicación y el código fuente al directorio de trabajo en la imagen.Luego, usamos la directiva
EXPOSE
para indicar al demonio que haga visible el puerto8080
del contenedor resultante (a través de una asignación de contenedor a host), ya que la aplicación se enlaza con el puerto8080
.En el último paso, le indicamos al demonio que ejecute el comando
node server.js
dentro de la imagen ejecutando el comando denpm start
básico. Usamos la directivaCMD
para esto, que toma los comandos como argumentos.CMD [ "npm", "start" ]
Luego, creamos un archivo
.dockerignore
en el mismo directorio queDockerfile
para evitar que nuestra copia denode_modules
y registros utilizados por nuestra instalación del sistema Node.js se copie en la imagen de Docker. El archivo.dockerignore
debe tener el siguiente contenido:node_modules npm-debug.log
Construye tu imagen
Navegue hasta el directorio que contiene el Dockerfile
y ejecute el siguiente comando para crear la imagen de Docker. La marca -t
te permite etiquetar tu imagen para que sea más fácil encontrarla más tarde con el comando de imágenes acoplables:
$ docker build -t <your username>/node-web-app .
Su imagen ahora será listada por Docker. Ver imágenes usando el siguiente comando:
$ docker images
REPOSITORY TAG ID CREATED
node latest 539c0211cd76 10 minutes ago
<your username>/node-web-app latest d64d3505b0d2 1 minute ago
Corriendo la imagen
Ahora podemos ejecutar la imagen que acabamos de crear utilizando el contenido de la aplicación, la imagen base del node
y el Dockerfile
. Ahora procedemos a ejecutar nuestra imagen recién creada <your username>/node-web-app
. Al proporcionar el interruptor -d
al comando de docker run
la docker run
ejecuta el contenedor en modo separado, de modo que el contenedor se ejecuta en segundo plano. La bandera -p
redirige un puerto público a un puerto privado dentro del contenedor. Ejecuta la imagen que creaste previamente usando este comando:
$ docker run -p 49160:8080 -d <your username>/node-web-app
Imprima la salida de su aplicación ejecutando
docker ps
en su terminal. La salida debe verse algo como esto.CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b701693b294 <your username>/node-web-app "npm start" 20 minutes ago Up 48 seconds 0.0.0.0:49160->8080/tcp loving_goldstine
Obtenga la salida de la aplicación ingresando los docker logs <CONTAINER ID>
En este caso se trata de docker logs 7b701693b294
.
Salida: Running on http://localhost:8080
- Desde la salida de la
0.0.0.0:49160->8080/tcp
docker ps
, la asignación de puertos obtenida es0.0.0.0:49160->8080/tcp
. Por lo tanto, Docker asignó el puerto8080
dentro del contenedor al puerto 49160 en la máquina host. En el navegador ahora podemos ingresarlocalhost:49160
.
También podemos llamar a nuestra aplicación usando curl
:
$ curl -i localhost:49160
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
Date: Sun, 08 Jan 2017 14:00:12 GMT
Connection: keep-alive
Hello world