El objeto de este primer capítulo del tutorial de 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.
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
Una vez realizado esto, tienes dos opciones, o bien sales y vuelves a entrar en la sesión, o bien, ejecutas estas instrucciones,
MIGRUPO=$(id -gn)
newgrp docker
newgrp $MIGRUPO
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.
- El cliente de docker conecta con el demonio que está corriendo en segundo plano.
- El demonio, descarga la imagen
hello-world
deDocker Hub
. - 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.
- 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