Docker: introducción a los contenedores
Introducción a Docker: qué son los contenedores, cómo empaquetan una aplicación con sus dependencias y por qué aíslan mejor que una máquina virtual.

Introducción a Docker
La inclusión en contenedores es un enfoque de desarrollo de software en el que una aplicación o un servicio, sus dependencias y su configuración (extraídos como archivos de manifiesto de implementación) se empaquetan como una imagen de contenedor. La aplicación en contenedor se puede probar como una unidad e implementarse como una instancia de imagen de contenedor en el sistema operativo host (SO). Al igual que los contenedores de envío permiten transportar mercancías por barco, tren o camión independientemente de la carga dentro, los contenedores de software actúan como una unidad estándar de implementación de software que puede contener diferentes código y dependencias. El software en contenedores de esta manera permite a los desarrolladores y profesionales de TI implementarlos en entornos con poca o ninguna modificación. Los contenedores también aíslan las aplicaciones entre sí en un sistema operativo compartido. Las aplicaciones en contenedores se ejecutan sobre un host de contenedor que, a su vez, se ejecuta en el sistema operativo (Linux o Windows). Por lo tanto, los contenedores tienen una superficie significativamente menor que las imágenes de máquina virtual (VM). Cada contenedor puede ejecutar una aplicación web completa o un servicio, como se muestra en la figura 2-1. En este ejemplo, el host de Docker es un host de contenedor y App1, App2, Svc 1 y Svc 2 son aplicaciones o servicios contenedorizados.
Motivación
Los contenedores de carga transformaron completamente la industria del transporte marítimo y permitieron la experiencia comercial global de hoy. Del mismo modo, los contenedores de software simplifican el desarrollo y la implementación de aplicaciones, lo que ayuda a habilitar la arquitectura de software nativa de la nube que impulsa la tecnología moderna en la que todos confiamos. Aunque puede obtener beneficios de la contenedorización de sus aplicaciones después del hecho, obtiene el mayor valor cuando adopta un enfoque de contenedor primero.
Fundamentos
Arquitectura de docker
Docker usa una arquitectura cliente-servidor. El cliente de Docker habla con el Daemon de Docker que hace el trabajo de crear, correr y distribuir los contenedores. Tanto el cliente como el Daemon pueden ejecutarse en el mismo Sistema, o puede conectar un cliente remoto a un daemon de docker.
El cliente de Docker es la principal interfaz de usuario para docker, acepta los comandos del usuario y se comunica con el daemon de docker.
Imágenes de Docker
Las imágenes de Docker son plantillas de solo lectura, es decir, una imagen puede contener el Sistema operativo de CentOS o Ubuntu con apache instalados, pero esto solo nos permitirá crear los contenedores basados en esta configuración. SI hacemos cambios en el contenedor ya lanzado, al detenerlo esto no se verá reflejado en la imagen. Mas adelante entenderemos esta parte.
Registros de Docker
Los registros de Docker guardan las imágenes, estos son repos públicos o privados donde podemos subir o descargar imágenes. El registro público lo provee el Hub de Docker que sirve una colección de imágenes para nuestro uso. Los registros de dockers básicamente son el componente de Distribución de Docker.
Contenedores de Docker
El contenedor de docker aloja todo lo necesario para ejecutar una aplicación. Cada contenedor es creado de una imagen de docker. Cada contenedor es una plataforma aislada.
Guía de Instalación de Docker
Instalación en Linux
Ubuntu/Debian
- Actualizar el sistema
sudo apt update
sudo apt upgrade -y- Instalar dependencias necesarias
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y- Agregar la clave GPG oficial de Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg- Agregar el repositorio de Docker
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- Instalar Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y- Verificar la instalación
sudo docker --version
sudo docker run hello-world- Agregar usuario al grupo docker (opcional)
sudo usermod -aG docker $USER
newgrp dockerCentOS/RHEL/Fedora
- Actualizar el sistema
sudo yum update -y- Instalar dependencias
sudo yum install -y yum-utils- Agregar el repositorio de Docker
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo- Instalar Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io -y- Iniciar y habilitar Docker
sudo systemctl start docker
sudo systemctl enable docker- Verificar la instalación
sudo docker --version
sudo docker run hello-worldInstalación en Windows
Para Windows, es suficiente con instalar Docker Desktop, que incluye todas las herramientas necesarias:
- Descargar Docker Desktop desde: https://www.docker.com/products/docker-desktop
- Ejecutar el instalador descargado
- Seguir las instrucciones del asistente de instalación
- Reiniciar el sistema si es necesario
- Abrir Docker Desktop y esperar a que inicie
- Verificar la instalación abriendo PowerShell o CMD:
docker --version
docker run hello-worldRequisitos:
- Windows 10/11 Pro, Enterprise o Education (64-bit)
- WSL 2 habilitado
- Virtualización habilitada en BIOS
Primeros Pasos con Docker
En Capítulos anteriores vimos lo que es Docker y como instalarlo en Linux CentOS y Ubuntu. Pero antes de entrar de lleno con Docker, recuerdan que les hablaba de Docker registries, quiero hablarles brevemente de Docker Hub.
Docker Hub es un servicio de registro basado en la nube para crear y entregar contenedores de servicio o aplicaciones. Provee un recurso centralizado para el descubrimiento de contenedores, distribución, control de cambios, colaboración de equipos y automatización de flujos de trabajo. Veanlo como como un Github de contenedores.
Características de Docker Hub
- Repositorios de Imágenes: Encuentra, administra, sube y descarga imágenes de la comunidad y oficiales
- Imágenes automáticas: Crea nuevas imágenes cuando haces un cambio en la Fuente de Github o BitBucket
- Webhooks: creaciones automáticas de imágenes al hacer un push exitoso a un repositorio
- Integración con GitHub y BitBucket
Docker Hub le provee a usted y su organización un lugar donde alojar y entregar las imágenes.
Se puede configurar los repositorios de Docker Hub de dos maneras:
- Repositorios, que nos permiten subir y actualizar las imágenes cuando deseemos desde el docker daemon
- Imágenes automáticas que nos permiten configurar una cuenta de Github o BitBucket que desencadenan la reconstrucción de una imágen cuando se realizar algún cambio en el repositorio
Se pueden crean repositorios públicos que pueden ser accedidos por otros usuarios de HUB, o se pueden crear repositorios privados con accesos limitados.
Pueden crear su cuenta en https://hub.docker.com, luego veremos como podemos aprovechar todo esto.
El daemon de Docker hace uso de Hub para obtener y subir sus imágenes. Ya que tenemos una base, vamos a jugar un poco con Docker.
Busquemos una imagen base de CentOS
$ docker search centosVamos a descargar la imagen official base de centos. Asi que nos fijamos en NAME y lo pasamos al docker pull
$ docker pull docker.io/centosOtra forma que podemos usar para buscar una imagen es mediante el Hub.
Si hacemos la búsqueda de centos tendremos algo así.
Aquí tenemos el comando y los tags para obtener una version específica. Si ven tenemos como comando docker pull centos, y si deseamos por ejemplo descargar la version 7 de centos o la última version, los comandos se verían así:
$ docker pull centos:centos7
$ docker pull centos:latestYa descargada la imagen, confimamos que este ahí con:
$ docker imagesdocker.io/centos latest ce20c473cd8a 2 weeks ago 172.3 MB
Ya vemos que tenemos la imagen ahí. Ahora como podemos interactuar con esa imagen o lanzar un contenedor con esa imagen? A eso vamos, pero antes recuerden esto: cuando lanzamos un contenedor, y hacemos cualquier tarea esto no se ve reflejado al momento de lanzar otro contenedor con la misma imagen.
Lanzar un contenedor
Vamos a lanzar un contenedor basado en esa imagen e interactuar con la linea de comandos de ese contenedor:
$ docker run -i -t docker.io/centos:latest /bin/bash-i: Interactivo-t: tty
[root@71c6ab01cd3e /]#
Aquí ya estamos interactuando con el contenedor, esa numeración que ven luego de root es el ID del contenedor, podemos actualizar el Sistema, instalar paquetes, etc. Este contenedor tambien cuenta con una IP con la que podemos interactuar con el contenedor.
Ver contenedores corriendo
Veamos los contenedores que tenemos corriendo. Abran otra terminal en el server:
$ docker psAquí tenemos el ID de contenedor, la imagen que usamos para lanzarlo, el comando que corrimos y al final el Nombre. Con este nombre que docker le asignó aleatoreamente podemos interactuar con el contenedor. Este Nombre por igual lo podemos asignar nosotros.
Detener un contenedor
Si queremos detener el contenedor:
$ docker stop reverent_bardeen(que es el nombre asignado por docker)
Si corremos docker ps, veremos que ya no hay nada. Lo Bueno del caso es que ese contenedor permanece ahi, con los cambios que nosostros le realizamos.
$ docker ps -aReiniciar un contenedor
Podemos reiniciar nuevamente ese contenedor y conectarnos a el:
$ docker start reverent_bardeen
$ docker attach reverent_bardeenAquí estamos nuevamente conectado con nuestro contenedor.
Autores

GIIA