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.
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.
- Imagen para PHP Developers: https://hub.docker.com/r/stenote/docker-lemp/
- Imagen para NODE: https://hub.docker.com/r/bitnami/node/
- Imagen para WordPress Developers: https://github.com/tutumcloud/wordpress
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.
Un comentario en “Sacando partido a Docker”