Integración con Docker

Definición de la imagen de Docker

Para crear una imagen de Docker, lo primero que tenemos que hacer es crear un archivo Dockerfile en nuestro proyecto, preferentemente en el directorio raíz de éste (aunque siempre puede estar en algún subdirectorio).

El Dockerfile de este proyecto puede consultarse aquí, pero en esta página de documentación vamos a ir comentando lo que hace este archivo.

FROM node:lts-alpine3.10

Indica la imagen base de la que vamos a partir. En este caso, es una imagen de Node. La versión está indicada en la primera parte de la etiqueta lts-alpine3.10. En este caso, es la versión LTS y, actualmente, ésta es la versión 12. La segunda parte de la etiqueta indica el sistema operativo base. Se ha escogido Alpine en su versión 3.10, ya que con Alpine se pueden crear imágenes muy ligeras, muchísimo más que si se usase por ejemplo Ubuntu o Debian.

WORKDIR /app

Establece que el directorio de trabajo va a ser /app. Se ha decidido hacer esto porque es una práctica habitual tener un directorio para nuestra aplicación, en vez de tener todos los archivos en el directorio raíz.

COPY src ./src

Copia el directorio src del proyecto y todo su contenido en el en el directorio ./src de la imagen, creando dicho directorio en el proceso. Esto nos evita tener que realizar antes la creación del directorio.

COPY package.json .

Copia el archivo package.json del proyecto en el directorio de trabajo de la imagen con el mismo nombre que el archivo original. Es necesario copiarlo ya que todas las dependencias del proyecto están especificadas en él, y se tienen que instalar utilizando este archivo.

COPY gulpfile.js .

Copia el archivo utilizado por la herramienta de construcción gulpfile.js dentro de la imagen con el mismo nombre que el archivo original. Este archivo contiene las tareas que puede realizar la herramienta, y se utilizará más adelante.

RUN npm install

Instala las dependencias del proyecto, las cuáles se encuentran en el package.json anteriormente copiado.

RUN npm install -g gulp

Instala la herramienta de construcción de forma global. Es necesario hacerlo de esta forma porque, a pesar de que el package.json contiene módulos de gulp que deben ser instalados, da problemas si no se instala de forma global.

CMD ["gulp", "start-node"]

Ejecuta el comando gulp start-node. Se usa CMD porque este será el comando principal que se ejecute cuando la imagen de Docker se ejecute sin pasarle ningún parámetro. Se encarga de iniciar la aplicación utilizando node por debajo, sin ningún gestor de procesos como podría ser PM2.

Creación y ejecución de la imagen

Una vez creado el Dockerfile, para crear la imagen, hace falta ejecutar la siguiente orden:

docker build -t vocabulary .

La orden docker build construye la imagen. Adicionalemnte, le podemos especificar el tag que va a tener con la opción -t nombre_tag. El argumento . indica que se va a buscar el Dockerfile en el directorio actual.

Para ejecutar la imagen, simplemente basta con ejecutar la siguiente orden:

docker run -p 8080:8080 vocabulary

De esta manera, ejecutamos la imagen que hemos creado con el tag vocabulary, y mapeamos el puerto 8080 de la aplicación al 8080 real.