¿Qué es Docker?
Docker es un proyecto de código libre que proporciona ventajas de despliegue a desarrolladores. Gracias a él podemos encapsular todo el entorno de trabajo y migrarlo a otros sitios, teniendo tal confianza como si trabajara desde local. De esta manera el local, el ambiente de pruebas y producción mantienen las mismas configuraciones.
Diferencias con máquinas virtuales
- Recursos: Los controladores de docker comparten los recursos de memoría y procesamiento en la máquina que se ejecutan. Las máquinas virtuales (VM) aislan estos recursos.
- Portabilidad: Los problemas causados se dismuyen considerablemente
Personalmente yo veo mejor la diferencia como si las imágenes y contenedores en Docker fueran VM “orientado a objetos” donde las imágenes vendrían siendo las clases y los contenedores instancias de dichas clases. Entre estas imágenes se pueden heredar entre otras imágenes, adquiriendo sus configuraciones y aplicaciones instaladas. También se pueden instanciar cuantos contenedores querramos de una imagen.
Instalación
Lo primero es instalar Docker en nuestra máquina. Para cada sistema operativo es distinto los invito a revisar en la página oficial de cómo se instala: https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
Yo estoy usando Linux Mint 18. La última versión no se encuentra instalada así que toca usar otro procedimiento:
sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable" sudo apt-get update sudo apt-get install docker-ce
Podemos comprobar que Docker está instalado si pasamos el comando info para ver la información de la aplicación Docker
docker info
Aparecera una respuesta con la información:
Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 1 Server Version: 17.03.2-ce Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 52 Dirperm1 Supported: true Logging Driver: json-file
Si es la primera vez que se instalan, los contenedores deben ser 0.
Ahora como ya explicamos docker necesita unas imágenes del sistema operativo. Bajamos una que nos ayude a montar NodeJS:
docker pull node:10
Podemos ver que tenemos la imagen pasando el comando
docker images
La consola nos mostrará:

Imagen 1. Imágenes de Docker instaladas
Ahora procedemos a crear nuestro contenedor, corremos el comando:
docker run -it node:10 /bin/sh
Dentro podremos entrar a una máquina. Comprobaremos que efecitvamente tiene node instalado y listo para usar.

Iimagen 2. Correr un contenedor de Node
En la Imagen 2 se corre un contenedor con la imagen node:10. Dentro del contenedor comprobamos que la versión instalada de Node es 10.9.0 y la del Sistema Operativo es solo Linux 4.4.0.
Para ver los contenedores hacemos con el comando
docker ps -a
Nos mostrará la lista de contenedores instalados:

Imagen 3. Lista de contenedores
En la Imagen 3 vemos la lista de contenedores. Solo tenemos una. Nos dice de que imagen procede. Para borrarla basta con pasar el comando rm y el ID del contenedor.
docker rm 80f3283e853f
Crear Imagen para un microservicio
Bueno, podemos decir que ya tenemos un microservicio, en la entrada Microservicio en PHP y NodeJS tenemos un ejemplo. Ahora nos ubicamos en la carpeta y creamos un archivo con nombre Dockerfile con lo siguiente:
FROM node:10 WORKDIR /app COPY package.json /app COPY package-lock.json /app RUN npm install COPY . /app CMD DEBUG=microservice:* npm start EXPOSE 3000
Este archivo nos ayudará a construir nuestra propia imagen con un microservicio.
- Primero le pedimos que herede las configuraciones de otra imagen. En este caso de node:10. Con esto ya tenemos todo el sistema operativo configurado y las instalaciones necesarias.
- Creamos una carpeta /app
- Copiamos los archivos package.json para instalar los módulos pertenientes a nuestro proyecto, como Mocha.
- Corremos la instalación con npm (que ya esta instalado porque heredamos de una imagen con estos módulos)
- Copianos nuestros archivos del proyecto dentro de la carpeta /app
- Corremos el Node y exponemos el puerto del contenedor 3000.
Con estos pasos tenemos una imagen con un sistema operativo linux, con npm y node instalado globalmente. Con la copia de un proyecto node y los comandos para correr el proyecto. Es decir. ¡Está todo lo que necesita nuestro microservicio!
Ahora solo falta construir la imagen:
docker build -t arturoverbel/servicenode .
En mi caso el nombre es arturoverbel/servicenode.

Imagen 4. COnstruyendo una imagen
En la imagen 4 vemos todos los pasos que le indicamos en el archivo Dockerfile. Si nosotros vemos nuestras imágenes instaladas aparecerá la que creamos:
Comprobamos nuestra imagen instanciando un contenedor:
docker run --rm -p 3000:3000 arturoverbel/servicenode
En este comando esta vez pasamos el parámetro –rm para borrarlo una vez finalice. El puerto -p nos dice que para el puerto del contenedor 3000 muestrelo en nuestra máquina en el puerto 3000 (puedo usar otro cualquiera que esté disponible) y por último el nombre de la imagen. En la consola nos mostrará algo como:

Imagen 5. Contenedor de Node corriendo
En la imagen 5 nos muestra la salida del servidor de node. Si nosotros lo vemos en postman por POST vemos nuestra respuesta:

Imagen 6. Respuuesta de nuestro microservicio Node corriendo desde un contenedor
Docker Hub
Es un repositorio de imágenes, tan como GitHub para códigos. Nuestra imagen ahora podemos subirla a un repositorio de imágenes. Primero debemos loguearnos en Docker Hub con el comando
docker login
Nos pedirá nuestro nombre de usuario y contraseña. luego subimos nuestra imagen con
docker push arturoverbel/servicenode
De esta manera cualquier usuario podrá bajarla. En mi caso pueden verla en la dirección https://hub.docker.com/r/arturoverbel/servicenode/.
Comentarios