Docker. Introducción y primeros pasos

El objeto de este primer capítulo del tutorial sobre Docker, es por un lado explicarte que son los contenedores. Y por otro lado, y creo que mas importante, porque necesitas conocer, usar y sacar provecho a la tecnología de contenedores. Sin embargo, es necesario unas primeras pinceladas sobre los contenedores Linux antes de que yo sea capaz de explicarte porque esa tecnología es imprescindible para ti, y que tarde o temprano te cambiará la forma en la que te relacionas con las aplicaciones.

En alguna ocasión he escrito algún artículo que toca de forma tangencial los contenedores, por ejemplo, en el tutorial de scripts en Bash. En el primer capítulo del tutorial, te indico una solución para comenzar a crear tus primeros scripts, sin miedo a romper el sistema.

Igualmente, en el episodio 37 del podcast, también te comenté como podías empezar a relacionarte con el terminal sin miedos utilizando precisamente la tecnología de contenedores, en particular Docker.

Sin embargo, hasta el momento, no le había dedicado ni el tiempo ni la atención que esta tecnología se merece. Pero, con este tutorial, estoy dispuesto a cambiarlo de forma radical, y poner Docker en el lugar que se merece dentro de atareao.es.

Es evidente, que esta tecnología es fundamental para administradores de sistemas y desarrolladores. Pero, si no perteneces a estos grupos, incluso si utilizas Linux por afición, realmente merece la pena que aprendas esta tecnología. Solo tienes que ver la cantidad de contenedores disponibles para utilizar en la Raspberry, y sobre todo lo que facilita instalar aplicaciones para sacar provecho a este pequeño dispositivo.

Contenedores y Docker

Docker

Como te he comentado en la introducción, antes de comentarte las ventajas de trabajar con contenedores, y porque esta es una solución que debes implantar en tu día a día, es mejor que te explique que es esto de los contenedores.

Conceptos básicos

Imágenes

Una imagen es un paquete, en el que se encuentra una aplicación o servicio y todo lo necesario (código, ejecutables, librerías, configuración, etc) para que esta aplicación pueda funcionar.

Pero, ¿porque te hablo de imágenes si hasta el momento solo te ha hablado de contenedores?¿que tiene que ver las imágenes con los contenedores?. Un contenedor no es mas que una imagen en funcionamiento.

Es el mismo concepto de un ejecutable. La imagen es el ejecutable, y el contenedor es cada una de las instancias o procesos que hay en funcionamiento. Si has lanzado el ejecutable tres veces, por ejemplo, tendrás tres instancias del ejecutable. Lo mismo, para contenedores, puedes tener tres contenedores corriendo de la misma imagen.

Contenedores

Como te explicaba en el punto anterior, el contenedor no es mas que una instancia de esa imagen que tiene todo lo necesario para nuestra aplicación. Pero, el contenedor tiene una característica realmente interesante. El contenedor utiliza y comparte el sistema operativo de la máquina en la que se está ejecutando, con otras aplicaciones y por supuesto, con otros contenedores.

Esto es precisamente lo que lo diferencia de una máquina virtual. Las máquinas virtuales levantan un sistema operativo completo, mientras que los contenedores tienen lo mínimo imprescindible para el funcionamiento de la aplicación o servicio.

Imágenes y contenedores

Por intentar aclarar mas la diferencia entre imagen y contenedor, quiero ponerte un paralelismo. El archivo ejecutable de una aplicación cualquiera que tengas instalada en tu equipo se corresponde con la imagen, como te he comentado anteriormente. Por otro lado, hay aplicaciones que permiten tener en funcionamiento varias instancias. Cada una de estas instancias se corresponde con un contenedor.

La diferencia, en este paralelismo, radica en que mientras que cuando terminas la ejecución de una instancia de la aplicación esta desaparece, al detener un contenedor este queda en tu equipo ¿porque? La razón para que el contenedor quede en tu equipo, es porque, por un lado puedes iniciar el contenedor de nuevo, y en segundo lugar, porque es posible que en el interior de ese contenedor tengas archivos que te sean de utilidad. Si al terminar la ejecución del contenedor, se borrara de forma automática, seguro que en mas de una ocasión, te llevarías un disgusto.

Docker

En esto de los contenedores, además de Docker, tienes otras alternativas como LXC (LinuX Containers), de la cual deriva Docker o LXD, por ejemplo. ¿Porque Docker? Docker es mas como un gestor de paquetes tipo Snap, Flatpack o AppImage, mientras que LXC es mas como una máquina virtual mas ligera, en el sentido de que comparte el sistema operativo con la máquina en la que corre. Esto es a grandes rasgos.

La razón de este tutorial sobre Docker, es precisamente la facilidad que te aporta esta tecnología para poner en funcionamiento una aplicación en una máquina, asegurándote de que va a funcionar. Y va a funcionar porque todas las dependencias que necesita esa aplicación van incluidas en el contenedor. Esto te permite llevar una aplicación de una máquina a otra con garantías.

Algunas de las razones para adoptar Docker son las siguientes,

  • Flexible, cualquier aplicación hasta las mas complejas se pueden poner en contenedores.
  • Ligero. Los contenedores Docker frente a otras soluciones son ligeros, en tanto en cuanto, comparte el núcleo de la máquina en la que están funcionando.
  • Intercambiable. Es posible desplegar actualizaciones al vuelo.
  • Portable. Puedes construir una imagen localmente y ejecutarla en cualquier lugar.
  • Escalable. Es posible poner en funcionamiento tantas réplicas como necesites.

Instalando

Existen dos versiones de Docker. En particular me centraré en la versión Community, Dentro de esta versión puedes encontrar tres canales de actualización, como en casi cualquier aplicación que se precie,

  • Stable. Proporciona las últimas versiones.
  • Test. Versiones listas para probar.
  • Nightly. En este canal encontrarás las actualizaciones correspondientes a la siguiente versión.

Salvo casos excepcionales, lo lógico es que utilices el canal Stable.

Respecto a las plataformas soportadas. Para servidor, lo puedes encontrar en Ubuntu en cualquier arquitectura x86_64 (or amd64), armhf, arm64, s390x (IBM Z), y ppc64le. En el momento de escribir este primer capítulo del tutorial estaba disponible para las versiones siguientes,

  • Disco 19.04
  • Cosmic 18.10
  • Bionic 18.04 (LTS)
  • Xenial 16.04 (LTS)

Aunque Docker está disponible en los repositorios de Ubuntu, lo mas recomendable es que te instales el repositorio de Docker, de forma que siempre tendrás la última versión estable actualizada. Pero, lo mejor es que no te tienes que preocupar de nada, porque los chicos de Docker, ya se han preocupado de hacer un script que te lo pone muy fácil. Simplemente ejecuta las siguientes líneas en un terminal

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

Post instalación

Permisos

Una vez ya tienes instalado docker conviene realizar algunos pasos adicionales para tu propia comodidad. Lo primero es que para evitar tener que ejecutar docker con derechos de administrador, tienes que añadir a tu usuario al grupo docker. Para ello, simplemente ejecuta la siguiente instrucción,

sudo usermod -aG docker $USER

Si no tienes muy claro esto de los grupos, te recomiendo el artículo sobre gestión de usuarios y grupos en Linux y el artículo sobre propietarios y permisos del tutorial sobre el terminal.

Una vez realizado esto, es necesario que salgas y entres en la sesión.

Comprobaciones

Ahora, ya estás en disposición de ver la versión de docker que has instalado. Para ello, ejecuta la siguiente instrucción,

$ docker -v
Docker version 18.09.5, build e8ff056

Lanzando tu primer contenedor

Ahora es necesario, iniciar tu primer contenedor y ver que todo funciona de manera correcta. No te preocupes ahora mismo por las instrucciones. Simplemente quieres saber si Docker está instalado correctamente. Ya verás con detalle las instrucciones y el funcionamiento de Docker. Para comprobar que todo funciona correctamente, vas a arrancar tu primer contenedor. Tan solo tienes que ejecutar la siguiente instrucción,

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:451ce787d12369c5df2a32c85e5a03d52cbcef6eb3586dd03075f3034f10adcd
Status: Downloaded newer image for hello-world:latest

Hello from Docker!

En pocas palabras, lo que hace esta instrucción es ejecutar un contenedor que te va a mostrar Hello from Docker. Lo primero que hace es comprobar si tienes la imagen hello-world localmente en tu equipo. Una vez comprobada que no la tienes, la descargará del repositorio de imágenes, y la ejecutará.

Lanzando un contenedor en detalle

¿Que es lo que sucede cuando ejecutas docker run hello-world?. En el apartado anterior te he resumido la operación en cuatro palabras. Sin embargo, tal y como te describe el inicio de hello-world, por detrás, se hacen algunas cosas mas.

  1. El cliente de docker conecta con el demonio que está corriendo en segundo plano.
  2. El demonio, descarga la imagen hello-world de Docker Hub.
  3. De nuevo, el demonio entra en acción y crea un nuevo contenedor de esa imagen recién descargada, y se se ejecuta el proceso, lo que genera la salida que has visto anteriormente.
  4. Por último, el demonio redirige la salida al cliente de Docker que la envía al terminal.

En el interior de un contenedor

Si quieres, todavía puedes dar un paso mas. Puedes puedes meterte en el interior de un contenedor, y echar un vistazo. De esta manera puedes saber como es un contenedor por dentro. Verás que no hay nada extraño, que todo es mas o menos igual.

Para meterte en el interior de un contenedor ejecuta la siguiente instrucción,

docker run -it ubuntu bash

No te preocupes, que en los siguientes capítulos del tutorial ya verás que es todo esto.

Ya me contarás lo que encuentras dentro de ese contenedor…


Más información


Imagen de Pexels en Pixabay

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *