Más sobre contenedores (Parte 1)

  • Enviado por: administrador

Más sobre contenedores

Bien amigos, en las anteriores entregas hemos hablado acerca de contenedores y qué son, además de haberles mostrado algunas opciones interesantes para probar la plataforma sin necesidad de instalar software localmente.

Pues bien, en esta primera parte quiero adentrarme más en la plataforma para ver qué cosas se pueden hacer y ver un poco más cuál es la utilidad que le puedo sacar a esta tecnología.

En principio, estaré trabajando con contenedores sobre plataforma Linux y sin modo gráfico, de manera que todo lo que se hará acá será por línea de comandos, pero eso no es ningún inconveniente puesto que son comandos sencillos y que se pueden copiar/pegar en su ambiente.

Ya hicimos un “Hola Mundo” y trajimos una imagen de Ubuntu, pero me gustaría ver un poco más qué significan esas operaciones.

Recuerden que a través de un navegador pueden ir a https://labs.play-with-docker.com/ para hacer estos ejercicios…

Bueno, como ya lo hemos dicho, un contenedor contiene todo lo necesario para ejecutar mi aplicación y es más liviano que en el modelo tradicional, en donde se tiene una máquina física o virtual con un sistema operativo completo con la aplicación. De nuevo, quiero hacer énfasis en que no se trata de decir cuál modelo es mejor, sólo que se sepa que existe esta opción y que cada vez toma más fuerza.

Ya corrimos el “Hola Mundo” pero si lo hacemos de nuevo, me gusta mucho la explicación que se da acerca de qué es lo que pasa por debajo:

docker container run hello-world

Acá hay una explicación gráfica de lo que pasa en realidad (Imagen tomada de https://training.play-with-docker.com/ops-s1-hello/ )

No hay que tener la imagen localmente (¡hello-world también es un contenedor!), la primera vez que se solicita se descarga localmente, y recuerden que para que ello suceda es necesario haber iniciado sesión en el Docker store (O Docker hub como se conocía anteriormente).

Así a primera vista puede pensarse que se parece mucho a la situación en la que se ejecutan máquinas virtuales, pero vamos a ir viendo que hay diferencias importantes con las máquinas virtuales.

La diferencia más importante es que en las máquinas virtuales se hace una abstracción del hardware y en los contenedores se hace abstracción de la aplicación, y como ya se ha dicho ambos ambientes pueden convivir -y de hecho-, es posible correr contenedores en máquinas virtuales.

Uno puede “halar” o traer una imagen ya predefinida del Docker store, lo que se conoce en inglés como hacer un “pull”, y de igual modo puede publicar su propia imagen en un espacio del Docker store (que antes se denominaba Docker hub), este proceso de publicación es conocido como “push”.

Vamos a traer (pull) una imagen de una distribución de Linux denominada Alpine, que no tengo en mi máquina local, pero se encuentra en el Docker store.

El comando es el siguiente:

docker image pull alpine

Observen que en este caso se descargó la última imagen de Alpine.

Ahora podemos verificar con el siguiente comando qué imágenes tenemos en este momento:

docker image ls

Observen que es una imagen reciente, creada hace 2 semanas.

Ahora bien, vamos a ejecutar un comando en esa imagen, que es el comando ls -l que en Linux indica listar un directorio con detalles (Más o menos es como un DIR en Windows)

docker container run alpine ls -l

Observen los resultados:

Se le ordenó a Docker que ejecutara el comando ls -l (listar los directorios) dentro del contenedor denominado alpine, que ya tenemos en nuestra máquina local, recuerden que hicimos previamente un pull (lo jalamos).

¿Qué pasó tras bambalinas? (Imagen tomada de https://training.play-with-docker.com/ops-s1-hello/ )

Bueno, ya que sabemos que le podemos “dar órdenes” o comandos que se ejecuten a nuestro contenedor alpine, podemos hacer algo como lo siguiente:

docker container run alpine echo «¡Saludos desde alpine!»

En este caso, el cliente de Docker ejecutó el comando echo dentro de nuestro contenedor alpine y luego se dejó de ejecutar el contenedor. Todo eso sucedió bastante rápido y nuestro contenedor dejó de ejecutarse. El comando echo se ejecutó en una instancia de contenedor separada.

Para hacer un paralelo con un ambiente de máquinas virtuales habría que arrancar una máquina virtual (VM), ejecutar un comando y luego detener todo el ambiente; ello podría tomar varios minutos solo para arrancar la máquina virtual antes de ejecutar el comando.

Los contenedores Docker funcionan en la capa de aplicaciones, por lo que omiten la mayoría de los pasos que requieren las VM y simplemente ejecutan lo que se requiere para la aplicación. ¡Por eso es que los contenedores son muy rápidos!

Intentemos otro comando: (Dicho comando ejecuta lo que se denomina en Linux un shell)

docker container run alpine /bin/sh

Los resultados son los siguientes:

¿Qué pasó? ¿No pasó nada

Pues en efecto el comando sí se ejecutó, pero recuerden que fue adentro del contenedor, pero no hay salida hacia nuestra consola.

Si queremos tener una terminal interactiva de nuestro Linux alpine ejecutamos el siguiente comando:

docker container run -it alpine /bin/sh

Y ahora sí podemos ver en efecto una consola de Linux con privilegios de usuario (Este usuario se denomina root y el signo de # indica que somos todopoderosos en la máquina)

Noten que ejecuté el mismo comando ls -l estando dentro del contenedor:

Nos podemos salir del contenedor con exit.

Ahora veamos qué instancias de contenedores tenemos en ejecución en nuestro ambiente, para ello podemos usar:

docker container ls

No hay nada en ejecución en este momento, sin embargo, podemos usar el mismo comando con -a al final para ver más información:

docker container ls -a

Aquí se ven todos los contenedores que hemos ejecutado hasta el momento. Observen que el estado de todos es Exited (0) que indica que ya no están en ejecución.

¿Qué pasa cuándo ejecutamos el comando docker container ls -a? (Imagen extraída de https://training.play-with-docker.com/ops-s1-hello/ )

Ya poco a poco vamos viendo cómo funcionan por dentro los contenedores de Docker.

En nuestra próxima entrega veremos cómo se aíslan los contenedores entre sí y cuáles son las ventajas de este aislamiento, además veremos qué pasa cuando se ejecuta un contenedor.

Autor: administrador