09-04-2017

¿Qué es docker?

Docker es un software que permite automatizar el despliegue de aplicaciones utilizando contenedores.

Los contenedores hacen uso de la virtualización a nivel de sistema operativo, con lo cual son mucho más ligeros y rápidos que las máquinas virtuales.

¿Para qué lo puedo necesitar?

En el día a día, una de las cosas para las que Docker me resulta más útil sin duda es para desplegar las bases de datos en desarrollo.

Sobre todo cuando trabajas con múltiples bases de datos, estar instalandos los distintos tipos: oracle, postgres, mysql, etcétera. No resulta del todo sencillo, y con docker se convierte en una tarea trivial.

También podemos utilizarlo para emparejar el entorno de desarrollo y producción (mantener mismas versiones y así asegurarnos de que no hay incompatibilidades).

¿Y no me sirve Vagrant?

Por supuesto. Docker no es más que otra solución. Mucha gente ha trabajado hasta ahora utilizando Vagrant para automatizar el despliegue de sus máquinas virtuales, y creo que la mejor forma de comprender las diferencias entre una máquina virtual y un contenedor, es con la siguiente imagen:

Eliminando las capas de hypervisor y de sistema operativo invitado, nos ahorramos muchísimos recursos y ganamos en velocidad. (¿Quién no ha tenido que esperar tras un vagrant up?)

¿Cómo lo utilizo?

Obviamente, el primer paso es instalarlo. Como curiosidad, solo hay una versión de Windows que soporta docker de forma nativa, pero se puede utilizar igualmente mediante una máquina virtual.

Tras instalar Docker, vamos a buscar imágenes de docker en Docker Hub.

Por ejemplo, yo ahora mismo necesito una base de datos de postgres. Así que me utilizaré esta imagen, que es oficial: https://hub.docker.com/_/postgres/

Realmente, podría automatizar todo el proceso de despliegue y docker podría buscar por mí en el hub y bajarme la imagen con el comando que pone en la guía, pero creo que es mejor hacerlo a mano para esta entrada.

En mi caso voy a utilizar la versión 9.5 de docker por temas de compatibilidad con la versión de pgAdminIII que utilizo. Recomiendo encarecidamente utilizar la 9.6 para no tener que estar esperando por las actualizaciones.

Bajamos la carpeta con el dockerfile, nos movemos a la ruta correspondiente, y ejecutamos docker build -t "postgres:9.5" .

El flag -t no es más que un tag.

adrianabreu@adrianabreu-CX61-2PC:~/docker-images/postgres/9.5$ docker build -t "postgres:9.5" .
Sending build context to Docker daemon 19.97 kB
[...]
Step 23/23 : CMD postgres
 ---> Running in 635831399de8
 ---> e8635acd406b
Removing intermediate container 635831399de8
Successfully built e8635acd406b

Ahora, podemos ver que se ha añadido la imagen correspondiente con: docker images.

adrianabreu@adrianabreu-CX61-2PC:~/docker-images/postgres/9.5$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
postgres            9.5                 e8635acd406b        About a minute ago   265 MB
debian              jessie              8cedef9d7368        2 weeks ago          123 MB
hello-world         latest              48b5124b2768        2 months ago         1.84 kB

Vale, lancemos una nueva instancia de postgres:

docker run --name prueba-postgres -e POSTGRES_PASSWORD=prueba -P -d postgres:9.5

Nota: El flag -P es MUY importante, es el que se encarga de publicar el puerto del contenedor al sistema operativo.

Comprobemos que ha arrancado:

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
111090b29e46        postgres:9.5        "docker-entrypoint..."   13 seconds ago      Up 11 seconds       0.0.0.0:32770->5432/tcp   prueba-postgres

Como vemos, nuestro docker está escuchando en el puerto 32770. Hagamos a hacer la prueba de fuego:

¡Perfecto! Espero que esto os anime a usar docker y ganéis la flexibilidad que necesitáis.