Probando Docker en fedora

En mi anterior post (hace más de un año) les mostré como usar contenedores en Fedora usando LXC (pronunciado lex-cee). Hoy, usaremos otra herramienta, que ah tenido gran acogida por muchos usuarios en los últimos años, Docker.

Docker también nos permite utilizar contenedores, y está muy relacionado con LXC; pero, a cambio del uso que le dimos a LXC para crear contenedores que puedan reemplazar nuestras máquinas virtuales, Docker lo usaremos para crear contenedores que “empaqueten” nuestras aplicaciones.

Es un alcance más reducido, pero por ser más atómico, puede ser usado de muchas maneras bastante útiles, en diversos tipos de ambientes y sistemas operativos. De la mano de todo esto, Docker viene acompañado de una gran comunidad de usuarios que continúa creciendo cada día y que colaboran entre sí para que esta herramienta se convierta en una de las más usadas en el mundo de los contenedores.

Comenzaré instalando Docker, paso a paso, lo cuál es muy sencillo ya que la documentación oficial detalla todo el proceso. Luego demostraré como correr un contenedor en Docker, y algunos detalles que hay que tener en cuenta. Después levantaré múltiples contenedores para demostrar un poco de lo que nos ofrece esta herramienta. Y finalizaré con algunas conclusiones.

Se asume

Antes de comenzar este ejemplo debo declarar lo que asumo sobre el ambiente de trabajo:

-Instalación nueva de Fedora 25.
-Un usuario que pueda usar sudo para ejecutar comandos como root.
-C
onexión a Internet.
-A la instalación nueva de Fedora 25, le hemos dado el siguiente comando, para tener todo actualizado:

sudo dnf update -y && sudo dnf upgrade -y

Instalación

La documentación oficial de Docker para Fedora 25 (https://docs.docker.com/engine/installation/linux/fedora/) hace un muy buen trabajo al momento de detallar los pasos de instalación. Como en este ejemplo estaremos usando una instalación nueva de Fedora 25, nos saltearemos algunos pasos.

Obtener el repositorio

El primer paso es obtener la referencia al repositorio oficial de Docker para poder realizar la instalación. Para esto necesitamos instalar los plugins de dnf:

sudo dnf -y install dnf-plugins-core

Luego referenciaremos el repositorio de Docker:

sudo dnf config-manager \
--add-repo \
https://docs.docker.com/engine/installation/linux/repo_files/fedora/docker.repo

Instalar Docker

Para poder utilizar el nuevo repositorio agregado, debemos actualizar el cache de dnf:

sudo dnf makecache fast

Y por fin podemos instalar Docker:

sudo dnf -y install docker-engine

Iniciar Docker

Docker se instala como un servicio, y tiene que ser iniciado antes de poder ser utilizado, usemos este comando:

sudo systemctl start docker

Con esto ya tenemos listo nuestro servicio de Docker para ser usado, lo probaremos creando y ejecutando el contenedor hello-world que nos proporciona Docker mismo. Este comando descarga una “imagen” del contenedor hello-world y luego crea un contenedor usándola, después ejecuta dicho contenedor y nos da un output.

sudo docker run hello-world

fedock.png

Correr un contenedor

Ahora que ya tenemos Docker instalado y funcionando, vamos a crear un contenedor que nos demuestre cómo Docker puede empaquetar aplicaciones enteras y ejecutarlas de manera sencilla, sin necesidad de instalar ninguna dependencia adicional.

Para esta demostración, utilizaremos la imagen de nginx y la correremos de manera local. Usaremos el siguiente comando:

sudo docker run –name nginx1 -d -p 80:80 nginx

Este comando hace varias cosas:

  • sudo docker run, le indica al servicio de Docker que debe ejecutar un contenedor
  • –name nginx1, indica que el nombre de nuestro contenedor será nginx1. No es necesario ponerle nombre a los contenedores pero nos ayuda a mantener el orden.
  • -d, indica a Docker que el contenedor debe ejecutarse en background, es decir, sin apoderarse de la terminal que estamos usando actualmente.
  • -p 80:80, indica a Docker que vamos a relacionar el puerto 80 de nuestra máquina(el primer de 80:80) con el puerto 80 del contenedor que va a correr nginx (el segundo de 80:80). Al hacer esto, si nos conectamos al puerto 80 de nuestra máquina, esto nos redirigirá automáticamente al puerto 80 del contenedor. Este concepto de exponer y relacionar puertos es muy importante para el uso de los contenedores y de Docker en general.
  • nginx, indica a Docker que usaremos la imagen de nginx.

Veremos el siguiente output.

fedock2.png

Y si vamos al navegador y entramos a localhost veremos que efectivamente, tenemos corriendo nginx en nuestra máquina sin necesidad de haberlo instalado.

screenshot-from-2017-02-14-23-56-24

Múltiples contenedores

Ahora que ya tenemos corriendo nuestro primer contenedor con nginx en nuestra máquina, probaremos levantar otras aplicaciones bastante conocidas usando Docker. Comenzaremos con Jenkins.

sudo docker run –name jenk1 -d -p 8080:8080 -p 50000:50000 jenkins

Este comando es muy similar al anterior que usamos para correr nginx, pero a diferencia del otro, este no tiene solo un par de puertos relacionados, sino dos (8080:80808 y 50000:50000).fedock3.png

Ahora podemos nuevamente abrir en nuestro navegador la dirección localhost:8080 y nos mostrará la página de inicio de Jenkins.Screenshot from 2017-02-15 20-49-35.png

Levantaremos 2 procesos más:

Tomcat:

sudo docker run –name tomc1 -d -p 8081:8080 tomcat

WordPress:

sudo docker run –name wp1 -d -p 81:80 wordpress

En este caso asociamos el puerto 8081 de nuestra máquina al puerto 8080 del contenedor, no podemos volver a usar el puerto 8080 de nuestra máquina local por que este puerto ya está siendo usado por nuestro contenedor de Jenkins. No se puede repetir los puertos que asociamos en más de un contenedor. De la misma manera usamos el puerto 81 para el contenedor de wordpress.

fedock4.pngScreenshot from 2017-02-15 20-52-22.pngscreenshot-from-2017-02-15-20-52-33

Ahora levantaremos Odoo, aplicación que necesita un contenedor de postgresql (se pueden usar otros DBMS también) para poder funcionar, por lo que necesitaremos 2 contenedores en total, y también necesitamos asociar estos contenedores entre sí.

sudo docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo –name db postgres

Este comando levanta un contenedor de postgres, el nuevo parámetro “-e” se usa para establecer variables de entorno, esto hará que el usuario de postgres por defecto se llame odoo, con contraseña odoo, para que pueda conectarse sin más configuraciones. El contenedor se llama db.

Ahora levantamos odoo:

sudo docker run -d -p 8069:8069 –name odoo –link db:db -t odoo

El nuevo parámetro en este comando es “–link db:db”. Esto referencia a nuestro contenedor llamado db (db:db) y lo asocia como la base de datos de este contenedor. La configuración para esto se puede observar desde el código fuente de la imagen de odoo que estamos usando automáticamente con docker run (https://hub.docker.com/_/odoo/).

Y listo, ya tenemos odoo funcionando.

fedock5.png

Screenshot from 2017-02-15 21-04-11.png

Como ven, en los procesos de Docker, tengo 6 contenedores corriendo a la vez, y, aunque están en relativo reposo c/u, el uso de recursos por ahora no es mayor al que se tendría si se levantara cada una de estas aplicaciones en una máquina virtual. Y, por otro lado, no es mucho mayor al de sí instaláramos todas estas aplicaciones de forma nativa.

Conclusiones

En este pequeño ejemplo hemos visto como instalar y desplegar contenedores usando Docker, desde un simple hello-world, hasta levantar un Odoo 10(ex OpenERP) con postgresql incluido en pocos simples pasos. Esta es solo la punta del iceberg de Docker, y queda mucho más por hacer, por lo que los invito a investigar sobre como modificar estas imágenes, o inclusive, como crear las suyas desde cero.

Debo agradecer a la comunidad de Docker Perú, de la cuál formo parte, ya que me ayudó a comprender bastantes conceptos sobre Docker que se me hicieron complicados al principio. También agradecer a Fedora, y destacar que la nueva versión, Fedora 25, es un muy buen upgrade.

Advertisements
Probando Docker en fedora

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s