¿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/.