Sacando partido a Docker

Estoy cansado de instalar dependencias, que si npm, ruby, php56, php7,… y lo peor cuando cambio de ordenador y no tengo nada instalado y otra vez volver a instalar npm, ruby, php56, php7,… pero esto se acabó o al menos voy a intentar aliviar mi dolor sacándole más partido a Docker. Hace tiempo ya hablamos de Docker y empezamos con Docker tratando el vocabulario básico y poco después vimos como instalar Docker en Mac. Hoy vamos a montar nuestro propio container con las dependencias que necesitamos para un pequeño proyecto.

bpcnlo

 

El proyecto

Hace bastante que tengo ganas de probar angular y hacer algo pequeñito y por casualidad me encontré con este proyecto para tener un CV bonito así que me pensé que actualizar mi CV era una buena manera de probar Angular, utilizar bootstrap y gulp. Pero cuando me puse manos a la obra npm me dio pereza instalar node, npm,… en el Mac así que ¿por qué no crear un container con todo lo necesario?

Empezando

De momento Docker todavía no es nativo en Mac (hay una beta privada) pero todavía no hay nada funcionando al 100% así que lo mejor es seguir las instrucciones https://docs.docker.com/mac/ e instalarse docker-machine. docker-machine es una maquina virtual que hará que podamos instalar docker en Mac (es necesario tener Virtualbox instalado) por lo demás es totalmente transparente al desarrollador. Docker-machine nos proporciona una maquina virtual de Linux donde está montado y funcionando Docker, así que solo tenemos que arrancar la maquina virtual y estaremos listos para usar docker:

    $ docker-machine start

Si la maquina virtual no está creada, podemos crearla nosotros mismo con

    $ docker-machine create --driver=virtualbox default

Esta máquina tiene una IP, para que podamos utilizarla tranquilamente, lo mejor es poner la configuración en nuestro .bashrc o similar, para ello (eval $(docker-machine env)):

JesusLC :: ~ » docker-machine env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/JesusLC/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval $(docker-machine env)

Como acordarse de una ip es un rollo, en el fichero /etc/hosts añadimos la linea 192.168.99.100 docker.dev Lo mejor llegados aquí es comprobar que todo está OK lanzando el container de hello-world:

JesusLC :: ~ » docker run hello-world

Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/userguide/

Si nos aparece este mensaje es que está todo perfecto para empezar.

Buscando imágenes de Docker

Lo primero antes de empezar a buscar o fabricar imágenes de Docker es ver que dependencias necesitamos instalar. En el Readme del proyecto vemos que necesitamos tener instalado al menos node, npm, bower y sass, así que manos a la obra.

La idea que tenemos es “fabricar” un container (es la caja donde se ejecuta toda nuestra aplicación) de Docker con todo lo necesario para desarrollar nuestro proyecto, así que lo mejor es buscar en https://hub.docker.com/ alguna imagen (especie de maquina virtual) en la que basarnos. Lo normal es que encontremos imágenes de Docker bastante completas y no necesitemos añadirles nada.

En nuestro caso vamos a partir de una Imagen con Node instalado (https://hub.docker.com/_/node/) y vamos a instalar todo lo necesario para hacer funcionar el proyecto.

Creando nuestro Dockerfile

La manera de indicarle a Docker que es lo que queremos instalar es crear un Dockerfile en dicho archivo indicamos desde que imagen partimos y qué vamos a intalar:

FROM node:latest
MAINTAINER JesusLC <jeslopcru@gmail.com>

RUN \
  apt-get update && \
  apt-get install -y ruby

RUN gem install sass 

RUN npm install -g bower http-server gulp node-sass
 
RUN mkdir /app
WORKDIR /app
ADD . /app


RUN npm install 
RUN bower install --config.interactive=false --allow-root

EXPOSE 8080:8080

Como vemos partimos (FROM) de la imagen de node, instalamos Ruby, la gema de sass, instalamos los paquetes de npm bower, http-server, gulp, node-sass después creamos una carpeta app que será el directorio donde desplegaremos nuestro proyecto y lo que hacemos con el comando ADD es copiar todo el repositorio del proyecto dentro de la carpeta app del container. Por último, instalamos las dependencias propias del proyecto con npm install y con bower install

Es necesario tener en cuenta que cuando instalamos dependencias en el container, debemos hacerlo de manera automática, por lo que los comandos deberán llevar el check para que no sean interactivos.

Explicando los comandos de build images

  • FROM Imagen desde donde partimos
  • MAINTAINERS Nombre y email de la persona que mantiene la imagen
  • ADD src dest Añade a la imagen archivos o directorios
  • COPY src dest Copia a la imagen archivos o directorios
  • RUN cmd Ejecuta un comando
  • EXPOSE port Expone un puerto
  • ENTRYPOINT [“exec”, “param”] Punto de entrada del container, se ejecuta siempre
  • CMD [“exec”, “param”] Ejecución por defecto del container
  • CMD [“param”] Parámetros por defecto, se usa en combinación con ENTRYPOINT

Construyedo la imagen

A partir del Dockerfile lo que hacemos es construir la imagen, para ello en el directorio donde tenemos el Dockerfile ejecutamos:

    $ docker build --rm -t "jeslopcru/docker-angular-cv" .

Cuando termine de ejecutarse (tarda un poco porque tiene que descargarse e instalar todo) podemos chequear que esté todo correcto haciendo

JesusLC :: ~ » docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
jeslopcru/docker-angular-cv    latest              ba536a979ede        1 days ago         773.1 MB

Ejecutando la imagen

Bueno pues ya estamos listos para empezar, solo nos queda ejecutar la imagen que hemos creado y listo:

    $ docker run -d -p 8080:8080 -it  -v /Users/JesusLC/Documents/Desarrollo/cv/jeslopcru.github.io:/app --name cv-github  jeslopcru/docker-angular-cv

Con este comando le estamos dicicendo que ejecute la imagen jeslopcru/docker-angular-cv en segundo plano (-d) con el puerto -p 8080:8080 y con un directorio compartido (**Volumen* en la jerga de Docker) entre el directorio de mi Mac (/Users/JesusLC/Documents/Desarrollo/cv/jeslopcru.github.io) y el directorio del container app (el que le hemos indicado en el Dockerfile que será el WORKDIR).

Ahora solo nos queda indicarle al container que lance un servidor web $ docker exec cv-github http-server y listo, ya tenemos todo funcionando en http://docker.dev:8080/

Algunos comando útiles

  • docker start / docker stop Arancar / Parar un container
  • docker exec containerid command docker exec cv-github http-server Ejecuta un comando en el container
  • docker ps -a Ver todos los containers
  • docker cp : docker cp hola.txt 38a0c40a313e:/app copiar un fichero a un container
  • Limpiando Docker (http://magmax.org/blog/limpiando-dockers-antiguos/)
  • docker rm $(docker ps -a | awk ‘{print $1}’) Borrar todos los container parados
  • **docker rmi $(docker images | awk ‘{print $1″:”$2}’) Borrar imágenes

Conclusiones Aunque todavía no es nativo en Mac utilizar docker es muy sencillo con docker-machine. Es cierto que al principio la jerga de container, imagen, build, volumen puede ser complicada pero en cuanto tenemos los conceptos claros es muy fácil. Del mismo modo hay un montón de imágenes ya montadas, listas para utilizar y disfrutar. Ahora ya no hay excusas para probar Docker.

Ahora solo nos queda empezar a desarrollar. Si queréis ver como quedó todo el proyecto podéis verlo en https://github.com/jeslopcru/jeslopcru.github.io y para verlo funcionando http://cv.jesuslc.com/.Gracias a javisr que colgó su proyecto pdf-web-curriculum en Github.

Anuncios

Un comentario en “Sacando partido a Docker

Comenta la entrada

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s