Acerca de esta aplicación de nodo
Esta aplicación contiene un paquete.json, server.js y un archivo .gitignore, que son lo suficientemente simples como para hacerse fácilmente.
.gitignore
node_modules/*
paquete.json
{"Nombre": "Docker-Dev", "Versión": "0.1.0", "Descripción": "Docker Dev", "Dependencias": {"Connect-Redis": "~ 1.4.5", "Express": "~ 3.3.3", "contratado": "~ 0.1.15", "Redis": "~ 0.8.4" "servidor.js
var express = request ('express'), app = express (), redis = require ('redis'), redisStore = require ('conectar-redis') (express), servidor = require ('http'). createServer (app); app.configure (function () {app.use (express.cookieParser ('keyboard-cat')); app.use (expresion.session ({{{{{{{{story {{{{{{{{{usse. RedisStore ({host: process.env.redis_host || 'localhost', puerto: process.env.redis_port || 6379, db: process.env.redis_db || 0}), cookie: {expires: false, maxage: 30 * 24 * 60 * 1000}); res.json ({status: "ok"});}); var port = process.env.http_port || 3000; server.listen (puerto); console.log ('escuchar en el puerto' + puerto);Server.js extrae todas las dependencias y inicia una aplicación específica. Esta aplicación específica está configurada para almacenar información de sesión en Redis y expone un punto final de solicitud que responderá a un mensaje de estado JSON. Todo esto es algo muy estándar.
Una cosa a tener en cuenta es que la información de conexión para Redis se puede reescribir utilizando variables de entorno: esto desempeñará un papel en la migración posterior desde el entorno de desarrollo desarrollado al entorno de producción.
Archivo de docker
Para las necesidades de desarrollo, tendremos una ejecución de redis y nodo en el mismo contenedor. Para hacer esto, utilizaremos un DockerFile para configurar este contenedor.
Dockfile
Desde Dockerfile / UbuntuMaineiner Abhinav Ajgaonkar <[email protected]># instalar redisrun / apt -get -y -qq install python redis -server# install noderun / cd / opt && / wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz &&/tar -xzf node-v0.10.28-linux-x64.tar.gz &&/mv node-v0.10.28-linux-x64 node &&/cd/usr/eNoL -s/opt/nodo/bin/*. && /rm -f /opt/node-v0.10.28-linux-x64.tar.gz# Establezca el directorio de trabajo deDir /srccmd [" /bin /bash"]
Entendamos uno por uno,
De Dockerfile/Ubuntu
Esta vez, se le dice a Docker que use la imagen DockerFile/Ubuntu proporcionada por Docker Inc. como la imagen de referencia para construir.
CORRER /
apt -get -y -qq install python redis -server
La imagen de referencia no contiene nada en absoluto, por lo que necesitamos usar apt -get para obtener todo lo que la aplicación necesita ejecutar. Esta oración instalará Python y Redis-Server. El servidor Redis es necesario porque almacenaremos la información de la sesión en él, y la necesidad de Python es que puede integrarse en la extensión C requerida por el módulo Redis Node a través de NPM.
Ejecutar /cd /opt && /wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz && /tar -xzf node-v0.10.28-linux-x64.tar.gz && /mv node-v0.10.28-linux-x64.tar.gz MV nodo-v0.10.28-linux-x64 nodo &&/cd/usr/local/bin &&/ln -s/opt/node/bin/*. && /rm -f /opt/node-v0.10.28-linux-x64.tar.gz
Esto descarga y extrae el binario NodeJS de 64 bits.
Workdir /SRC
Esta oración le dirá a Docker que una vez que se haya iniciado el contenedor, debe hacer CD /SRC una vez antes de ejecutar las cosas especificadas por la propiedad CMT.
CMD ["/bin/bash"]
Como paso final, ejecutar /bin /bash.
Controladores de construcción y ejecución
Ahora que el archivo Docker está escrito, creemos una imagen de Docker.
Docker Build -T SqlDump/Docker -Dev: 0.1.
Una vez que se construye la imagen, podemos ejecutar un contenedor utilizando la siguiente declaración:
Docker Run -i -t - -RM / -P 3000: 3000 / -V `pwd`: / src / sqldump / docker -dev: 0.1
Echemos un vistazo a lo que está sucediendo en el comando Docker Run.
-Los iniciaré el contenedor en modo interactivo (en comparación con -d está en modo separado). Esto significa que una vez que termine la sesión interactiva, el contenedor saldrá.
-t asignará un pseudo-tty.
--RM eliminará el contenedor y su sistema de archivos al salir.
-P 3000: 3000 reenviará el puerto 3000 en el host al puerto 3000 en el contenedor.
-v `pwd`:/src
Esta oración montará el directorio de trabajo actual a /src en el contenedor host (por ejemplo, nuestro archivo de proyecto). Colgamos el directorio actual como un volumen en lugar de usar el comando Agregar en DockerFile, de modo que cualquier modificación que realicemos en el editor de texto se pueda ver inmediatamente en el contenedor.
SQLDUMP/DOCKER-DEV: 0.1 es el nombre y la versión de la imagen Docker que se ejecutará. Esto es lo mismo que el nombre y la versión que usamos para construir la imagen Docker.
Dado que DockerFile especifica CMD ["/bin/bash"], tan pronto como se inicie el contenedor, iniciaremos sesión en un entorno de shell bash. Si el comando Docker Run se ejecuta correctamente, se verá como lo siguiente:
Iniciar desarrollo
Ahora el contenedor se está ejecutando, antes de comenzar a escribir código, tendremos que resolver algunas cosas estándar no relacionadas con el desastre. Primero, necesitamos usar la siguiente declaración para iniciar el servidor Redis en el contenedor:
Servicio Redis-server Start
Luego, instale las dependencias del proyecto y Nodemon. Nodemon observa cambios en el archivo del proyecto y reinicia el servidor a tiempo.
NPM installnpm install -g nodemon
Finalmente, inicie el servidor con el siguiente comando:
Nodemon Server.js
Ahora, si navega a http: // localhost: 3000 en su navegador, debería ver algo como esto:
Agregamos otro punto final como server.js para simular el proceso de desarrollo:
app.get ('/hello/: name', function (req, res) {res.json ({hello: req.params.name});});Verá que Nodemon ha detectado los cambios que realizó y reinició el servidor:
Y ahora, si navega por su navegador a http: // localhost: 3000/hola/mundo, verá la siguiente respuesta:
Entorno de producción
Los contenedores en el estado actual están lejos de ser liberados como productos. Los datos en Redis ya no serán persistentes al reiniciar en los contenedores. Por ejemplo, si reinicia el contenedor, todos los datos de la sesión serán eliminados. Lo mismo sucederá cuando destruyas el contenedor y abres un nuevo contenedor, que obviamente no es lo que quieres. Hablaré sobre este problema en el contenido producido de la segunda parte.