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
- 2. Entorno
- 3. Que es Docker??
- 4. Docker vs Máquinas Virtuales
- 5. Imágenes y Contenedores
- 6. Instalación
- 7. Primeros pasos
- 8. Dockerfile
- 9. Conclusiones
- 10. Referencias
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.
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.
Groso! Está todo muy bien explicado desde lo más basico. Muchas Gracias Jorge y un saludo amigo… Bye!
muchas gracias, muy buen tutorial! quizá las imágenes son pelín pequeñas pero me ha ayudado mucho
Muchas gracias, excelente tutorial!!
Muchas gracias, todo claro y transparente
Muy bueno! gracias!
Muy buen post, explicado a detalle pero en forma simple. Gracias!
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,
Buenisimo! Me sirvio de mucho para un get Starter!
Mil gracias por tomarte el tiempo para explicar, me has aclarado varias cosas. Sigue así.
Grandioso el tutorial!!!. Gracias por hacerlo fácil.
Eres un maestro!!!
Excelente tutorial, lo aplicaré en mi equipo de desarrolladores.
Bendiciones y un saludo.
El mejor tutorial de docker que he encontrado en internet muchisimas gracias
[…] Esto nos bajará la imagen sonatype/nexus:oss y nos levantará nuestro Nexus en el puerto 8081. Si accedes a la siguiente url deberías ver lo que aparece en la siguiente imagen: Si no estás muy familiarizado con Docker, te recomiendo que le eches un vistazo al tutorial de Jorge Pacheco. […]
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.
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..
Excelente recurso en la web.
Muchas gracias por tu aportación, fué de gran utilidad
Muchas gracias. Clarísimo ejemplo.
[…] recomiendo que empecéis con tutoriales sencillos como el de Jorge Pacheco […]
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).
Excelente me gustaría ver un tutorial de un proyecto java ee en un contenedor!!
Espectacular, me ha servidor para dar el paso adelante con docker.
Un cordial saludo y gracias por compartir.
Muy buena explicación, excelente