container Archives - Arkhotech

¿Máquina Virtual o Docker?

[:es]

Introducción

Ha transcurrido ya un buen tiempo, desde que empezamos a experimentar el desarrollo con Docker en nuestros proyectos, ya sea como plataforma de desarrollo o en la automatización de procesos.  Poco a poco, hemos ido comprendiendo la diferencia entre virtualización y “contenerización”, un ejemplo claro que aplica, es cuando intentamos levantar un ambiente de desarrollo con múltiples dependencias en un nuestras estaciones de trabajo, mientras que la virtualización conlleva a crear múltiples instancias (de acuerdo a necesidades), éstas generalmente exigen una cantidad importante de recursos que se traducen finalmente en un detrimento considerable en la experiencia del usuario y el desempeño de la máquina. Por su parte, la “contenerización” (docker) busca optimizar bastante bien los recursos limitados de nuestras máquinas, permitiendo que virtualmente se transformen en pequeños data center (guardando las proporciones) y se compartan recursos comunes entre servicios independientes (contenedores).

Pero ¿qué es Docker y en qué se diferencia de la virtualización?

Existen diferencias importantes: Una máquina virtual hace uso de un hypervisor para acceder al hardware físico del huésped, con el objeto de ejecutarse como si fuese una máquina física independiente; los recursos utilizados están previamente definidos en su configuración y son utilizados en su totalidad durante su ejecución, es decir, si se configuro la máquina con 4GB de RAM, ésta reservará la totalidad de memoria de la máquina huésped para su ejecución. Como consecuencia de ello, y una vea esté definida la configuración de la máquina virtual, solo queda administrar de buena manera las aplicaciones que se ejecutan dentro de ellas, y que éstas saquen el mejor provecho de los recursos asignados; si una aplicación toma menos recursos, éstos estarán disponibles en la máquina virtual pero no para la máquina huésped.

Hasta este punto, podemos deducir que las máquinas virtuales están mas orientadas a plataforma que hacia aplicación en si.

Docker por su parte, usa una forma muy diferente de interactuar con la maquina huésped.  Al igual que el software de virtualización posee una especie de hypervisor, que sirve de interfaz con el hardware subyacente, pero trabaja de forma muy distinta; lo que hace Docker es generar un wrapper, sobre el cual se ejecuta un único proceso, de ahí viene el nombre de contenedor, ya que éste “contiene” un micro ambiente de ejecución para una aplicación. Éste ambiente de ejecución, provee acceso a librerías de Sistema Operativo, a filesystem, a archivos de configuración y variables de ambiente. Cada contenedor se ejecuta sobre alguna distribución de SO Linux o Windows (ahora último), esta distribución es llamada imagen, y contiene toda la configuración necesaria para que una aplicación se ejecute tal como si la aplicación estuviera corriendo sobre una maquina virtual.

Contenedor

Un contenedor es una especie de wrapper que aísla el proceso a ejecutar de la máquina huésped. Este contenedor, encapsula una imagen de sistema operativo, posee acceso a filesystem y a recursos de hardware de la máquina huésped como si se tratara de un recurso independiente, pero que en ningún caso tiene acceso o conocimiento directo sobre el huésped.

La ventaja del contenedor es que éste solo ocupa los recursos que necesita la aplicación para ejecutarse, y a pesar de estar corriendo sobre una imagen del Sistema Operativo, no inicia otros procesos ajenos a la aplicación.

Docker provee acceso a la aplicación en ejecución, a las liberarías que éste pudiera necesitar, a montar ciertos volúmenes para realizar actividades de lectura y escritura (R/W) e incluso montar volúmenes desde el huésped para persistencia de datos.  En pocas palabras, Docker provee un ambiente de sistema operativo de solo lectura, para ejecutar un solo proceso que sin cargar nada mas que lo necesario, utiliza los recursos de Hardware que necesita dicho proceso.

¿No queda clara la diferencia?

Bueno, hasta acá probablemente sea un poco confuso, pero planteémonos el siguiente caso: Existe un programa que su ejecución toma hipotéticamente el 10% de CPU y 250M de Memoria. Por un lado, tenemos una máquina virtual con Linux Ubuntu con 4GB de Memoria y le dimos el 50% de nuestra CPU para su ejecución.  Si ejecutamos este programa sobre esta máquina virtual el proceso tomará el 10% de la CPU y 250MB de la memoria asignada para esta, pero para la maquina huésped no habrá ninguna diferencia por que ya hay 4GB y el 50% de la CPU reservado para esta maquina virtual.

Ahora bien, si ejecutamos a través de Docker, este proceso tomará 250MB del total de la memoria de la maquina huésped (quizá un poco mas por alguna que otra librería que necesite cargar para su ejecución) y el 10% de la memoria del huésped (también un poco más sumando la memoria que necesita Docker para correr).

Otras Diferencias

Como lema, Docker propone “Build, Ship and Run”, Construir, exportar ejecutar. Esto es sin duda, una de las ventajas mas considerables, ya que la habilidad de desarrollar una aplicación que se pueda exportar con todo su ambiente configurado e independiente, ahorra un montón de dolores de cabeza, sobre todo en ambientes donde conviven muchas aplicaciones, y cada una de ellas no debe afectar a las demás.

El lector seguramente podría pensar… Pero esto también se puede hacer con una maquina virtual!. Si, efectivamente se puede hacer, pero acá llegamos a otra ventaja importante, ya que el transporte de una máquina virtual es más complicado debido a su gran tamaño; Se necesita bastante tiempo y espacio para copiar una máquina en otro ambiente.  Docker, simplifica esto a nivel de archivo, es decir a partir de un archivo la máquina se construye bajando las imágenes de Sistema Operativo desde repositorios (Docker HUB) en Internet, por lo que solo basta este archivo plano para generar todo el ambiente.

Conclusión

Podemos concluir que la diferencia entre la tecnología de contenedores y la de virtualización es que la primera esta orientada a aplicación, mientras la segunda hacia la plataforma y por tanto, se puede ejecutar Docker container dentro de una maquina virtual perfectamente.

Docker provee un wrapper para hacer creer a la aplicación está sobre un ambiente específico, donde provee sistema operativo, recursos de Hardware y acceso a librerías. En cambio, la virtualización provee una ambiente completo, no solo de aplicación, sino también de los servicios que el sistema operativo tiene montados como entidades independientes.

Al momento de elegir, es importante considerar que ambas tecnologías tienen enfoques distintos, pero que también pueden ser complementarias, y que muchas veces las combinación de las dos es adecuada para los escenarios complejos a los que nos enfrentamos día a día.[:]

Monitorear contenedores con Portainer

[:es]Portainer es una aplicación web open source, que permite gestionar de forma muy fácil sus contenedores Docker.
Básicamente, permite hacer todo lo que permite el cliente docker, pero en una interfaz web bonita e intuitiva.

Instalar Portainer

docker pull portainer/portainer

Existe también una versión para Windows host (portainer/portainer:windows)

Levantar Portainer

docker run --name portainer -d \
    -p 9000:9000 \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data \
    portainer/portainer

El mapeo de puerto sirve para que sea accesible la interfaz web en el puerto 9000.
El primer mapeo de volúmen sirve para que Portainer tenga acceso al socket del Docker engine (ese mapeo no funcionará con Windows).
El segundo mapeo de volúmen sirve para guardar los datos internos de portainer.

Entrar a Portainer

Ir a http://localhost:9000 en su navegador preferido.

Al principio, Portainer le va pedir que entre una nueva contraseña:

Después le pedirá que inicie una sesión con la contraseña recién creada:

Al seguir le mostrara esta pantalla:

Seleccione “Manage the Docker instance where Portainer is running”:

Esto significa que Portainer va monitorear los contenedores que están en la misma máquina donde esta corriendo.
La otra opción permite conectarse a un Docker host distante.
Ojo: Eso no funciona si el host corre sobre Windows, en Windows el Docker engine ocupa un “named pipe” en lugar de un unix socket para exponer su API Rest y Portainer no lo esta soportando todavía.

Haga click en “Connect” y aparece el “Dashboard” de Portainer:

Vamos revisar las imágenes primero, haga click en “Images“:

Eso corresponde a lo que se puede obtener en un terminal escribiendo:

docker image ls

o

docker images

Sin embargo, tiene algunas ventajas:
– Se pueden clasificar las imágenes por tamaño o por tag, cuando en la consola siempre aparecen clasificadas por fecha.
– Una imagen con dos tags aparecerá en dos líneas en la consola, y en Portainer dos tags en una sola línea.
– Esa pantalla facilita mucho la supresión de imágenes, mediante los checkboxes y el botón “Remove”.
– La posibilidad de filtrar las imágenes por alguna parte de su tag es muy conveniente si se tienen muchas.

Haciendo click en el ID de una imagen se puede obtener más detalle:

En esta pantalla se pueden ver informaciones útiles como los puertos y los volúmenes que expone esa imagen.
También se pueden agregar y borrar los tags de la imagen.

Ahora vamos a revisar los contenedores, haciendo click en “Containers” en el menú lateral:

Aquí se pueden parar, borrar, reiniciar, pausar, matar los contenedores y levantar nuevos.
Como en la lista de imágenes, esa lista con posibilidad de filtrar y clasificar es muy conveniente.
También se puede ver el detalle de un contenedor haciendo click en su nombre:

Esa pantalla permite:
– Ver informaciones del contenedor (docker inspect)
– Guardar el contenedor en una imagen nueva (docker commit)
– Ver los logs del contenedor (docker logs)
– Ver las estadísticas del contenedor (docker stats)
– Logearse en el contenedor (docker exec)
– Desconectar el contenedor de una red (docker network disconnect)
– Y todas las operaciones común y corrientes como parar, pausar, matar o borrar el contenedor

Las pantallas “Volumes” y “Networks” permiten de la misma forma de visualizar, suprimir o agregar volúmenes y redes:

La pantalla “App Templates” facilita la creación de contenedores, propone varios modelos para configurar rápidamente Redis, MongoDB, Postgres, Nginx, ElasticSearch, entre otros.


Como ejemplo, vamos hacer click en el logo “WordPress”, ya, se muestra un pequeño formulario, pero ese formulario tiene un campo “MySql Database host” que pide seleccionar un contenedor, y no lo tengo, entonces vamos primero armar un MySql haciendo click en el logo “MySql”, acá solo me pide un nombre y la contraseña root, y eso lo puedo manejar:


Haga click en “Create” para finalizar, Portainer me redirige en la lista de contenedores y acá está mi contenedor MySql !
Puedo volver en el template WordPress y indicarle el “MySql Database host”:


Le indico también la contraseña que establecí para el MySql y hago click en “Create” para finalizar, lo que me redirige en la lista de contenedores:

Ya tengo mi WordPress corriendo, puedo acceder haciendo click en el número de puerto que está en la columna “Published Ports” donde dice 32769:80 en mi captura:

Así de fácil! 🙂

Conclusión

Portainer es una herramienta que permite manejar contenedores Docker con mucha facilidad, incluso en Windows y en máquinas distantes.
Es ideal para los que no son cómodos con la consola y permite hacer casi todo lo que se puede hacer con el docker-cli.
Les recomiendo probarlo.

Mas información en http://portainer.io/overview.html
[:en]Portainer is an open-source web application, which allows to handle easily your Docker containers.
In a nutshell, it let you do all the same than the Docker client, but with a nice and intuitive web interface.

Install Portainer

docker pull portainer/portainer

There is a Windows version too (portainer/portainer:windows)

Run Portainer

docker run --name portainer -d \
    -p 9000:9000 \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data \
    portainer/portainer

The port mapping is used to make the web interface accesible at port 9000.
The first volume mapping is used to give access Portainer on the socket for the docker engine (this won’t work on Windows).
The second volume mapping is used to keep Portainer internal data.

Access Portainer

Go to http://localhost:9000 in your favorite browser.

At start, Portainer will ask you for the admin password:

Then it will ask you this password to init the session:

Afterwards comes this screen:

Select “Manage the Docker instance where Portainer is running”:

This means that Portainer will monitor the containers of the host machine where he is running.
The other option allows connect on a remote Docker host.
Warning: This will not work on Windows host, because Windows use named pipe instead of unix socket to expose its Rest API and Portainer does not support it right now.

Click on “Connect” and the Dashboard of Portainer shows up:

We will check the images first: click on Images:

That´s what we could see in a terminal with the command:

docker image ls

or

docker images

But there are some advantages:
– You can sort images by size or tag, when in the terminal they always display sorted by date.
– An image with two tags would display two lines in the terminal, here two tags show up in the same line.
– This screen make it easy to delete images, using those checkboxes and the “Remove” button.
– Be able to filter images by part of their tag is really useful when you have a bunch.

Clicking on the ID of an image gives more details on it:

Here you can see useful data like ports and volumes that the image exposes.
You can add and delete tags for the image too.

Now we will see the containers, clicking on Containers of the lateral menu:

Here you can stop, remove, restart, pause kill container and run new ones.
As with images, this list view with filter and sort abilities is very convenient.
Y like for images you can see the details of a container clicking on its name:

On this screen you can:
– See informations of the container (docker inspect)
– Save the container into a new image (docker commit)
– See the logs of the container (docker logs)
– See the statistics of the contenedor (docker stats)
– Log in the contenedor (docker exec), but with bash or sh only.
– Disconnect the container out of a network (docker network disconnect)
– Y all commons operations like stop, pause, unpause, kill, remove the container

The screens “Volumes” and “Networks” allow to list, delete or add volumes and networks:

The “App Templates” screen make it easy to create containers, it purposes some templates to quickly config Redis, MongoDB, Postgres, Nginx, ElasticSearch, among others.


As an example, we will click on the “WordPress” logo, yeah, a little form shows up, but that form has a “MySql Database host” field asking to select a container, and I don’t have one, so we will first setup a MySql clicking on the “MySql” logo, here it justs asks for a name and the root password, that, I can handle:


Click on “Create” to finalize, Portainer redirects to the containers list and here is MySql !
Now I can go back to the WordPress template and give it the “MySql Database host” and the MySql password:


Click on “Create” to finalize, and you’ll be redirected to the containers list:

I got my WordPress running, and I can access it clicking on the port number which is in the “Published Ports” column where it says 32769:80 in my screenshot:

That was so easy ! 🙂

Conclusion

Portainer is a nice tool that allows to handle Docker containers really intuitively, on Windows included and on remote servers.
It is ideal for those who are not comfortable with the terminal command line and it allows to do almost all the things you do with the docker-cli.
I recommend you try it

More information on http://portainer.io/overview.html
[:]