Docker for dummies

23
85087

Vamos a comenzar una serie de tutoriales dedicados a una de las tecnologías que más se han puesto de moda en el último año : ‘Docker’.

0. Índice de contenidos

1. Introducción

Vamos a comenzar una serie de tutoriales dedicados a una de las tecnologías que más se han puesto de moda en el último año : ‘Docker’.

En este primero de la serie, vamos a describir que es Docker, su instalación, primeros pasos, y en tutoriales sucesivos describiremos una serie de casos de uso en los que docker nos ha facilitado la vida.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: MacBook Pro 15' (2.3 GHz Intel Core i7, 16GB DDR3 SDRAM)
  • Sistema Operativo: Mac OS X Mavericks 10.9.5.
  • Software: Docker 1.7

3. Que es Docker??

Docker es una herramienta open-source que nos permite realizar una ‘virtualización ligera’, con la que poder empaquetar entornos y aplicaciones que posteriormente podremos desplegar en cualquier sistema que disponga de esta tecnología.

Para ello Docker extiende LXC (LinuX Containers), que es un sistema de virtualización que permite crear múltiples sistemas totalmente aislados entre sí, sobre la misma máquina o sistema anfitrión.

4. Docker vs Máquinas Virtuales

La gran diferencia es que una máquina virtual necesita contener todo el sistema operativo mientras que un contenedor Docker aprovecha el sistema operativo sobre el cual se ejecuta, comparte el kernel del sistema operativo anfitrión e incluso parte de sus bibliotecas.

En la siguiente imagen podemos ver esta diferencia entre el enfoque de las máquinas virtuales y el utilizado por Docker:

Diagram source: Docker Inc.

Respecto al almacenamiento en disco, una máquina virtual puede ocupar varios gigas ya que tiene que contener el sistema operativo completo, sin embargo los contenedores Docker sólo contienen aquello que las diferencia del sistema operativo en las que se ejecutan, por ejemplo un Ubuntu con Apache ocuparía unos 180 Mb.

Desde el punto de vista del consumo de procesador y de memoria RAM, los contenedores Docker hacen un uso mucho más eficiente del sistema anfitrión, pues comparten con él, el núcleo del sistema operativo y parte de sus bibliotecas, con lo que únicamente usarán la memoria y la capacidad de cómputo que estrictamente necesiten.

Otras ventajas destacables del uso de Docker serían:

  • Las instancias se arrancan en pocos segundos.
  • Es fácil de automatizar e implantar en entornos de integración continua.
  • Existen multitud de imágenes que pueden descargarse y modificarse libremente.

Como inconvenientes podemos destacar:

  • Sólo puede usarse de forma nativa en entornos Unix aunque se puede virtualizar gracias a boot2docker tanto en OSX como en Windows.
  • Las imágenes sólo pueden estar basadas en versiones de Linux modernas (kernel 3.8 mínimo).
  • Como es relativamente nuevo, puede haber errores de código entre versiones.

5. Imágenes y Contenedores

Los términos que hay que manejar con Docker son principalmente 2, las imágenes y contenedores.

Las imágenes en Docker se podrían ver como un componente estático, pues no son más que un sistema operativo base, con un conjunto de aplicaciones empaquetadas, mientras que un contenedor es la instanciación o ejecución de una imagen, pudiendo ejecutar varios contenedores a partir de una misma imagen.

Haciendo una analogía con la POO una imagen es una clase y un contenedor es la instanciación de una clase, es decir un objeto.

6. Instalación

El motor de Docker utiliza las características específicas del kernel de Linux, asi que, si no disponemos de alguna distribución de Linux, tendremos que utilizar Boot2docker que es una mini-máquina-virtual de Linux para poder utilizar esta tecnología en Mac o Windows.

Como prerrequisito a la instalación de Boo2Docker necesitaremos tener instalado VirtualBox, una vez resolvamos este aspecto, nos descargamos boot2docker desde su web

Nos descargamos el archivo Boot2Docker-1.7.1.pkg y lo ejecutamos

Pulsamos 'Continuar'

Pulsamos 'Instalar'

Una vez finalizada la instalación ejecutamos por consola:

boot2docker init

Este comando nos creará la máquina virtual boot2docker que nos permitirá usar Docker desde Mac, posteriormente la arrancamos:

boot2docker start

Deberemos exportar las variables de entorno que nos indican para poder usar docker, este paso lo deberemos realizar cada vez que arranquemos boot2docker, para evitarlo podemos añadir esta variables de entorno a nuestro .profile

Para verificar que docker se ha instalado correctamente ejecutamos desde la terminal:

docker version

7. Primeros pasos

Una vez tengamos instalado correctamente docker vamos a empezar a trastear con él, para ello vamos a Docker Hub, que es un repositorio de imágenes pre-configuradas listas para usar (en otras palabras un github de imágenes).

Docker Hub dispone de las imágenes oficiales de postgresql, redis, mysql, ubuntu, rabbitmq, sonarqube, mongodb … además de una multitud de imágenes que los usuarios van creando y subiendo al repositorio.

En este ejemplo vamos a usar la imagen oficial de sonarqube , para crear un contenedor con Sonar instalado

En el repositorio de sonarqube encontraremos información relativa a la imagen y de cómo se usa, más o menos lo que vamos a describir a continuación.

El primer paso sería descargarnos la imagen

docker pull sonarqube

Podemos listar las imágenes que tenemos en nuestro equipo

docker images

Una vez tenemos la imagen, ya estamos en disposición de instanciar un contenedor a partir de ella.

docker run -d --name sonarqube -p 9000:9000 sonarqube

Este comando lo que realiza es levantar un contenedor con los siguientes parámetros:

  • -d : Levanta el contenedor en segundo plano
  • –name : Nombre asociado al contenedor
  • -p: Mapeamos el puerto 9000 de nuestro equipo con el 9000 del contenedor

Podemos comprobar los contenedores que están levantados

docker ps

Para acceder al sonar instalado en el contenedor nos bastaría con abrir un al navegador con la URL http:/localhost:9000, pero al usar un Mac (o Windows) y necesitar de un software intermedio, boot2docker, necesitaremos conocer la ip de la máquina virtual que crea boot2docker

boot2docker ip

Ahora ya podemos acceder a nuestro Sonar

Fácil no ?? Y si necesitamos tener otro Sonar ?? Pues nada, instanciamos de nuevo la imagen para crear otro contenedor

docker run -d --name sonarqube2 -p 7000:9000 sonarqube

Sólo necesitamos cambiar el nombre y el mapeo de puertos, volvemos a comprobar los contenedores activos … y ahí tenemos nuestros dos contenedores

Podemos acceder al nuevo sonar

Podemos parar un contenedor:

docker stop sonarqube

Vemos como sólo quedaría activo sonarqube2, podemos listar los contenedores independientemente de su estado con:

docker ps -a

Para borrar un contenedor deberíamos ejecutar el siguiente comando

docker rm sonarqube	

Hay que tener en cuenta que al borrar un contenedor perderíamos los cambios que hubiésemos realizado en él.
Una de las opciones que tendríamos si queremos que los cambios que realicemos al contenedor sean permanentes, sería la de generar una imagen a partir del contenedor, para ello haríamos lo siguiente:

docker commit -m "<comentario>" -a "<autor>" <id_contenedor> <nombre_imagen>:<etiqueta_imagen>

Con este comando lo que conseguimos es generar una imagen jpacheco/sonar construida a partir del contenedor sonarqube2, si volvemos a listar las imágenes:

8. Dockerfile

En este último apartado vamos a ver como crear una nueva imagen a través de un fichero llamado Dockerfile.

Un fichero Dockerfile es simplemente un fichero de texto que nos permite definir las instrucciones a seguir por Docker para construir una imagen, en otras palabras es como una receta para crear nuestras imágenes, que servirán de forma posterior para correr nuestros contenedores.

En este ejemplo vamos a crear una imagen con un SO Ubuntu y le vamos a instalar el servidor web Apache, para ello contamos con un Dockerfile:

FROM ubuntu
MAINTAINER Jorge Pacheco
ENV http_proxy http://user:pass@proxy/
ENV https_proxy http://user:pass@proxy/
RUN apt-get update
RUN apt-get install apache2 -y
RUN echo "<h1>Apache with Docker</h1>" > /var/www/html/index.html
EXPOSE 80
ENTRYPOINT apache2ctl -D FOREGROUND	

Vamos a describir los comandos del Dockerfile:

FROM : Indica la imagen que tomamos como base, en este caso la imagen oficial de ubuntu

MAINTAINER: Especifica el autor de la imagen.

ENV: Definimos una variables de entorno en la imagen base.

  • http_proxy http://user:pass@proxy/ — Definimos la variable http_proxy
  • https_proxy http://user:pass@proxy/ — Definimos la variable https_proxy

RUN: Ejecuta una sentencia sobre la imagen base

  • apt-get update : actualiza los repositorios de ubuntu
  • apt-get install apache2 -y : Instala el apache
  • echo «<h1>Apache with Docker</h1>» > /var/www/html/index.html : crea un fichero index.html

EXPOSE: Exponemos el puerto 80 del contenedor para que pueda ser mapeado por la máquina anfitrión.

ENTRYPOINT: Indicamos que se ejecute apache2ctl -D FOREGROUND cada vez que arranquemos el contenedor.

Una vez tengamos definido el fichero Dockerfile, vamos a construir la imagen:

docker build -t jpacheco/apache . 

Le estamos indicando a docker que construya una imagen con el nombre jpacheco/apache a partir del DockerFile que se encuentra en la misma ruta donde ejecutamos el comando

Listamos las imágenes disponibles:

Ya estamos en disposición de arrancar un contenedor a partir de la imagen que hemos creado:

docker run --name apache1 -d -p 90:80 jpacheco/apache

Arrancamos un contenedor, que llamaremos apache1, mapeando el puerto 80 del contenedor con el 90 de nuestra máquina, a partir de la imagen jpacheco/apache. Para comprobar que todo ha ido bien abrimos un navegador con la url http://192.168.59.103:90/

9. Conclusiones

Apenas hemos visto la potencia que nos brinda Docker, en posteriores tutoriales iremos viendo casos de uso y adentrándonos en la multitud de posibilidades que nos ofrece: simulación de entornos productivos, desarrollo de microservicios, empaquetamiento de infraestructuras, etc..

Aviso: Crea adicción y acabaremos intentando 'dockerizar' todo … 😉

Un saludo.

10. Referencias

23 COMENTARIOS

  1. Muy, muy buen tutorial. Me ha servido de mucho como introducción a Docker, el cual, antes de ponerse «hands on», cuesta un poco hacerse una idea de que es lo que hace realmente.

  2. Señor Jorge Pacheco Mengual

    Muchas gracias por su buena explicación, hasta ahora he hecho cosas con docker, pero se me escapaban algunos conceptos mu básicos de docker que no entendía y no sabía exactamente lo que hacía, pero tal como lo ha explicado usted queda totalmente claro de forma clara y sencilla, justo lo que me faltaba por entender de docker, con esto me he enamorado de docker, muy útil, creo que tenderé a utilizarlo desde luego…

    Saludos,

  3. Señor Pacheco!!!! que bueno leerte ya que ninguno de los dos sigue en el proyecto en el que nos conocimos!!! MINHAP .

    Estaba buscando documentación de Docker y me encuentro con tu manual que además está muy currado y fácil de seguir!!!

    Te mando un abrazo desde mi nuevo cliente Huawei.

  4. GUUAAA que buen tutorial,

    me quede con ganas de mas, por ejemplo como subir o colcoar ficheros al apache, o tener un ftp, o un acceso para colcoar ficheros al servidor apache de la maquina virtual, y cosas asi… pero en general eesta muy bueno,, quede con ganas de mas..

  5. Una maravilla de tutorial. Ojalá toda la gente técnica fuese capaz de comunicarse con la misma claridad como lo hacéis desde adictosaltrabajo. Antes de éste había visto muchos tutoriales en inglés donde se dan por sabidas muchas cosas o sencillamente no se explican (probablemente porque ni su autor las entiende).

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad