De Docker Noob a Pro

Hola Fronters, aquí Gabriel!! En esta serie de artículos «Docker para inexpertos (como yo!)» vamos a explicar a dar nuestros primeros pasos en Docker e iniciarnos en el mundo DevOps. Estos artículos serán más cortos y precisos y los dividiremos en capítulos para que sea más fácil comprender lo que aquí aprenderemos.

Qué es Docker

En muchos lados vamos a encontrar lo que es la containerización, Docker y sus bondades o ventajas con respecto a la virtualización, entre muchos otros tópicos. No obstante, sin ánimos de traer todo el contexto histórico de cómo nace, quien lo hizo, etc; se puede decir que Docker nace como una respuesta natural en un mundo siempre cambiante y evolutivo, como es el mundo de IT, en el cual buscamos siempre optimizar tiempos de respuesta en los servicios y desarrollos y sus respectivos cambios de etapa inicial a producción, y luego los continuos soportes, pero no todo se trata de tiempos de respuestas, sino de calidad de servicio, uptime, etc.

Pero… ¿Qué es DevOps?

DevOps es un concepto relativamente nuevo, el cual busca involucrar cerrar una brecha del pasado entre dos áreas que son (o parecen) antagónicas entre sí: por un lado los Desarrolladores (En inglés: Developers o abreviado: Dev) y por otro lado, los Administradores de sistemas (sysAdmins), también llamado Operaciones (en inglés: Operations o abreviado: Ops).

Hacer que estas dos áreas converjan y que su flujo de trabajo (workflow) sea sostenido y consecuente de forma más natural y sinérgica en pro de un producto final y / o servicio de calidad superior, es una necesidad real de muchas organizaciones y empresas, entonces aun pese a los contratiempos que puedan existir – y que nunca dejarán de existir – dentro de todo desarrollo e implementación, todo siempre debe apuntar a cerrar filas y resolver. Pues todo se trata de esto último: solucionar problemas.

Pero, ¿en qué nos cambia DevOps? Pues es simple: al involucrar tanto a desarrolladores como a operaciones, de algún modo es necesario, aunque no imperativo, que el equipo de Desarrollo maneje o tenga conocimiento de Operaciones y que el equipo de Operaciones conozca y pueda implementar soluciones basadas en código. A este cambio de paradigma se le llama Cultura DevOps.

Para qué sirve Docker

Docker sirve para muchas cosas y obviamente, las ventajas de utilizarlo son visibles apenas al recién utilizarlas, pero para mí las cuatro mayores utilidades y ventajas son:

  • Correr varios sistemas, con requerimientos específicos de software, todo sin necesidad de crear muchas máquinas virtuales, etc. Pues la containerización, y en especial Docker nos permite ahorrarnos capas de virtualización y crear nuestros contenedores con nuestras aplicaciones, las cuales corren aisladas e independientes, una de la otra… Por ejemplo: poder tener diferentes versiones de un determinado motor de base de datos o inclusive un lenguaje de programación como PHP, sin tener que hacer modificaciones tediosas para hacer que ambas funcionen. Eso es maravilloso!!!
  • Crear imágenes de nuestras implementaciones y poder compartirlas de un Docker Container Engine a otro, tan solo con pocos comandos o inclusive construirlas con un simple archivo / fichero llamado Dockerfile, del cual hablaremos en próximas entregas.
  • Al no tener que crear todo un ecosistema operativo completo con un kernel independiente, un sistema operativo independiente y otro montón de aplicativos innecesarios, ahorramos espacio en nuestros dispositivos y tiempo de implementación y respuesta de nuestra aplicación o servicio.
  • Así como podemos crear un contenedor con nuestra app, también podemos hacer despliegues (en inglés: «deployments») de infraestructuras íntegras en tiempo récord con unos archivos / ficheros *.yaml (cuyo acrónimo significa «yet another markup language«), y que en ellos definiremos toda nuestra infraestructura y su funcionamiento. De ahí el principio de Infraestructura como Código.

Para qué NO sirve Docker

Como todo puede ser funcional o no para determinadas tareas, Docker puede no servirte para aquellas aplicaciones que no sean nativas de Linux, y por ende, no comparten un kernel Linux, es decir: un sabor de BSD o incluso un Windows.

Si bien, existe Docker Container Engine para Mac OS y Windows, estos no son soportados nativamente en dichas plataformas, sino que más bien hacen uso de máquinas virtuales para poder correr contenedores, no siendo este el caso de Linux, cuya integración y soporte si es nativo.

Instalación de Docker

Bien, pasados ya todo estos puntos, pasaremos a instalar Docker en nuestro servidor:

En Debian (10 / 11) y Ubuntu (18.04 / 20.04):

Desinstalaremos todas las versiones previas en caso de tenerlas instaladas previamente de los repositorios de Debian:

sudo apt-get remove docker docker-engine docker.io containerd runc

Ahora instalaremos todas las dependencias básicas:sudo

sudo apt-get update && sudo apt-get upgrade -y

sudo apt-get install ca-certificates curl gnupg lsb-release sudo

NOTA: sólo instalaremos sudo en el caso de Debian, si tienes Ubuntu no es necesario.

Y luego instalaremos la llave pública oficial de los repositorios de Docker:

Caso 1: Para Ubuntu:

 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Agregamos el repositorio:

sudo echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Caso 2: Para Debian:

 curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Agregamos el repositorio:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Instalando dependencias y repositorio de Docker
Imagen 1: Instalando dependencias básicas y repositorios de Docker

Y luego instalamos los paquetes necesarios:

sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io
Instalando Docker en nuestro servidor
Imagen 2: Instalando Docker en nuestro servidor

Una vez instalado, agregaremos al usuario que destinemos para administrar Docker sin necesidad de ser root, en donde $USER es el :

sudo usermod -aG docker $USER

Para que tome los cambios en el grupo Docker, de forma inmediata:

newgrp docker

Verificamos los grupos del usuario:

groups
Agregando usuario al grupo de Docker
Imagen 3: Agregando nuestro usuario al grupo de Docker

Ahora, ejecutamos:

docker version
Obteniendo la versión de Docker instalada en el servidor
Imagen 4: Ejecutando Docker version

Y ahora haremos nuestro primer «Hello World»:

docker run hello-world
Ejecutando Hello World desde Docker
Imagen 5: Ejecutando nuestro primer ‘Hello World’ desde Docker

Excelente!!!! Ya tenemos nuestro primer contenedor en Docker y todo indica que lo hemos hecho muy bien!!!

Recomendaciones

Si estás familiarizado con la interfaz de línea de comandos (CLI), te darás cuenta de que hay algunos comandos que tienen funcionalidades parecidas. La recomendación siempre será que te empieces a trabajar la administración de Linux con la terminal para que puedas tener una mejor comprensión del flujo de trabajo habitual de Docker y muchas otras herramientas.

En el próximo capítulo conoceremos algunos de estos comandos para poder interactuar con Docker y sacarle el mayor provecho a nuestra herramienta.

Está de más decirles que si tienen dudas, preguntas o sugerencias, pueden dejarlas en los comentarios y así aprendemos todos y hacemos de IT Frontech una bonita comunidad en la que todos nos ayudamos y crecemos.

Hasta luego Fronters!!!

Referencias

Documentación oficial de Docker