En el mundo del desarrollo de software moderno, la eficiencia y la consistencia son clave. Los desarrolladores y los equipos de operaciones necesitan soluciones que les ayuden a gestionar, implementar y ejecutar aplicaciones de manera fluida en diferentes entornos.

Los contenedores y Docker son tecnologías que han revolucionado la forma en que se construye, prueba e implementa el software.

Ya sea que seas nuevo en el mundo de la tecnología o simplemente estés buscando entender los conceptos básicos de Docker, este artículo te guiará a través de los fundamentos.

Tabla de contenido

¿Qué Son los Contenedores?

Antes de sumergirnos en Docker, primero entendamos los contenedores. Imagina que estás trabajando en un proyecto, y tu aplicación funciona perfectamente en tu laptop. Pero cuando intentas ejecutar la misma aplicación en otra máquina, falla. Esto se debe a menudo a las diferencias en los entornos: diferentes sistemas operativos, versiones de software instaladas o configuraciones.

Los contenedores resuelven este problema empaquetando una aplicación y todas sus dependencias como bibliotecas, marcos y archivos de configuración en una sola unidad estandarizada. Esto asegura que la aplicación se ejecute igual sin importar dónde se despliegue, ya sea en tu laptop, un servidor o en la nube.

Características clave de los contenedores:

  • Livianos: Los contenedores comparten el núcleo del sistema anfitrión, a diferencia de las máquinas virtuales (VM) que requieren instancias de SO separadas, lo que los hace más rápidos y eficientes.

  • Portátil: Una vez construido, un contenedor puede ejecutarse de manera consistente en diversos entornos.

  • Aislado: Los contenedores se ejecutan en procesos aislados, lo que significa que no interfieren con otras aplicaciones en el mismo sistema.

¿Qué es Docker?

Ahora que entendemos los contenedores, hablemos de Docker, la plataforma que ha popularizado los contenedores.

Docker es una herramienta de código abierto diseñada para simplificar el proceso de creación, gestión e implementación de contenedores. Lanzado en 2013, Docker se ha convertido rápidamente en la solución preferida para la contenerización debido a su facilidad de uso, soporte de la comunidad y potente ecosistema de herramientas.

Conceptos Clave en Docker

  1. Imágenes de Docker: Piensa en una imagen de Docker como un plano para tu contenedor. Contiene todo lo necesario para ejecutar la aplicación, incluido el código, las bibliotecas y las dependencias del sistema. Las imágenes se crean a partir de un conjunto de instrucciones escritas en un Dockerfile.

  2. Contenedores Docker: Un contenedor es una instancia en ejecución de una imagen Docker. Cuando creas y pones en marcha un contenedor, Docker lanza la imagen en un entorno aislado donde puede ejecutarse tu aplicación.

  3. Dockerfile: Este es un archivo de texto que contiene los pasos necesarios para crear una imagen Docker. Aquí es donde defines cómo se verá tu contenedor, incluyendo la imagen base, el código de la aplicación y cualquier dependencia adicional.

  4. Docker Hub: Docker Hub es un registro público donde los desarrolladores pueden compartir y acceder a imágenes preconstruidas. Si estás trabajando en una aplicación común o pila tecnológica, es probable que ya haya una imagen disponible en Docker Hub, lo que te ahorrará tiempo.

  5. Docker Compose: Para aplicaciones que requieren múltiples contenedores (por ejemplo, un servidor web y una base de datos), Docker Compose te permite definir y gestionar entornos de varios contenedores utilizando un simple archivo YAML.

¿Por qué Docker?

La popularidad de Docker se debe a su capacidad para resolver una variedad de desafíos a los que se enfrentan los desarrolladores hoy en día:

  • Consistencia en los Entornos: Los desarrolladores pueden “construir una vez, ejecutar en cualquier lugar”, asegurando que la misma aplicación funcione de la misma manera en diferentes entornos, desde el desarrollo local hasta la producción.

  • Velocidad: Los contenedores de Docker son rápidos para iniciar y detener, lo que los hace ideales para pruebas y despliegues.

  • Uso Eficiente de Recursos: Dado que los contenedores comparten los recursos del sistema anfitrión de manera más efectiva que las máquinas virtuales, reducen los costos generales y permiten una mayor densidad en los despliegues.

  • Control de versiones para sus aplicaciones: Docker le permite controlar versiones no solo de su código, sino también del entorno en el que se ejecuta su código. Esto es particularmente útil para retroceder a versiones anteriores o depurar problemas en producción.

Arquitectura de Docker

Al principio, al usar Docker, es posible que lo trate como una caja que “simplemente funciona”. Si bien esto es útil para comenzar, comprender mejor la arquitectura de Docker lo ayudará a solucionar problemas, optimizar el rendimiento y tomar decisiones informadas sobre su estrategia de contenerización.

La arquitectura de Docker está diseñada para garantizar eficiencia, flexibilidad y escalabilidad. Está compuesta por varios componentes que trabajan juntos para crear, gestionar y ejecutar contenedores. Veamos más de cerca cada uno de estos componentes.

Arquitectura de Docker: Componentes clave

La arquitectura de Docker se basa en un modelo cliente-servidor que incluye los siguientes componentes

  • Cliente de Docker

  • Demonio de Docker (dockerd)

  • Motor de Docker

  • Imágenes de Docker

  • Contenedores de Docker

  • Registros de Docker

1. Cliente de Docker

El Cliente de Docker es la forma principal en la que los usuarios interactúan con Docker. Es una herramienta de línea de comandos que envía instrucciones al Demonio de Docker (que veremos a continuación) utilizando APIs REST. Comandos como docker build, docker pull y docker run se ejecutan desde el Cliente de Docker.

Cuando escribes un comando como docker run nginx, el Cliente de Docker traduce eso en una solicitud que el Demonio de Docker puede entender y actuar. Básicamente, el Cliente de Docker actúa como una interfaz para interactuar con los componentes más complejos en el backend de Docker.

2. Demonio de Docker (dockerd)

El Demonio de Docker, también conocido como dockerd, es el cerebro de toda la operación de Docker. Es un proceso en segundo plano que escucha las solicitudes del Cliente de Docker y gestiona los objetos de Docker como contenedores, imágenes, redes y volúmenes.

Esto es por lo que el Demonio de Docker es responsable

  • Construir y ejecutar contenedores: Cuando el cliente envía un comando para ejecutar un contenedor, el demonio descarga la imagen, crea el contenedor y lo inicia.

  • Gestión de recursos de Docker: El daemon maneja tareas como configuraciones de red y gestión de volúmenes.

  • El Daemon de Docker se ejecuta en la máquina anfitriona y se comunica con el Cliente de Docker utilizando una API REST, sockets Unix o una interfaz de red. También es responsable de interactuar con los runtimes de contenedores, que manejan la ejecución real de los contenedores.

3. Motor de Docker

El Motor de Docker es la parte central de Docker. Es lo que hace que toda la plataforma funcione, combinando el cliente, el daemon y el runtime de contenedores. El Motor de Docker puede ejecutarse en varios sistemas operativos, incluidos Linux, Windows y macOS.

Existen dos versiones del Motor de Docker

  • Docker CE (Community Edition): Esta es la versión gratuita y de código abierto de Docker que se utiliza ampliamente para proyectos personales y de menor escala.

  • Docker EE (Enterprise Edition): La versión de pago a nivel empresarial de Docker viene con características adicionales como seguridad mejorada, soporte y certificación.

El Motor de Docker simplifica las complejidades de la orquestación de contenedores al integrar los diversos componentes necesarios para construir, ejecutar y gestionar contenedores.

4. Imágenes de Docker

Una Imagen de Docker es una plantilla de solo lectura que contiene todo lo que necesita tu aplicación para ejecutarse: código, bibliotecas, dependencias y configuraciones. Las imágenes son los bloques de construcción de los contenedores. Cuando ejecutas un contenedor, básicamente estás creando una capa escribible sobre una imagen de Docker.

Las Imágenes de Docker suelen crearse a partir de Dockerfiles, que son archivos de texto que contienen instrucciones sobre cómo construir la imagen. Por ejemplo, un Dockerfile básico podría comenzar con una imagen base como nginx o ubuntu e incluir comandos para copiar archivos, instalar dependencias o establecer variables de entorno.

Aquí tienes un ejemplo sencillo de un Dockerfile

dockerfileCopy codeFROM nginx:latest
COPY ./html /usr/share/nginx/html
EXPOSE 80

En este ejemplo, estamos utilizando la imagen oficial de Nginx como base y copiando nuestros archivos HTML locales en el directorio web del contenedor.

Una vez que se construye la imagen, se puede almacenar en un Registro de Docker y compartir con otros.

5. Contenedores de Docker

Un Contenedor de Docker es una instancia en ejecución de una Imagen de Docker. Es ligero y está aislado de otros contenedores, pero comparte el núcleo del sistema operativo anfitrión. Cada contenedor tiene su propio sistema de archivos, asignación de memoria, CPU y configuraciones de red, lo que lo hace portátil y reproducible.

Los contenedores pueden ser creados, iniciados, detenidos y destruidos, e incluso pueden ser persistidos entre reinicios. Debido a que los contenedores se basan en imágenes, garantizan que las aplicaciones se comporten de la misma manera sin importar dónde se ejecuten.

Algunas características clave de los contenedores de Docker:

  • Aislamiento: Los contenedores están aislados entre sí y del host, pero aún comparten el mismo núcleo del sistema operativo.

  • Portabilidad: Los contenedores pueden ejecutarse en cualquier lugar, ya sea en tu máquina local, en una máquina virtual o en un proveedor de nube.

6. Registros de Docker

Un Registro de Docker es un lugar centralizado donde se almacenan y distribuyen las Imágenes de Docker. El registro más popular es Docker Hub, que alberga millones de imágenes disponibles públicamente. Las organizaciones también pueden configurar registros privados para almacenar y distribuir sus propias imágenes de manera segura.

Los Registros de Docker ofrecen varias características clave:

  • Versionado de Imágenes: Las imágenes están versionadas utilizando etiquetas, lo que facilita la gestión de diferentes versiones de una aplicación.

  • Control de Acceso: Los registros pueden ser públicos o privados, con control de acceso basado en roles para gestionar quién puede extraer o enviar imágenes.

  • Distribución: Las imágenes pueden extraerse de un registro y desplegarse en cualquier lugar, facilitando compartir y reutilizar aplicaciones contenerizadas.

Contenedor de Docker: containerd

Un desarrollo reciente importante en la arquitectura de Docker es el uso de containerd. Docker solía tener su propio tiempo de ejecución de contenedores, pero ahora utiliza containerd, un tiempo de ejecución de contenedores que sigue estándares de la industria y también es utilizado por otras plataformas como Kubernetes.

  1. containerd es responsable de

    • Iniciar y detener contenedores

    • Administrar almacenamiento y redes para contenedores

    • Extraer imágenes de contenedores de registros

Al separar el tiempo de ejecución del contenedor de la funcionalidad de nivel superior de Docker, Docker se ha vuelto más modular, permitiendo que otras herramientas utilicen containerd mientras Docker se enfoca en las características orientadas al usuario.

Cómo Crear un Contenedor Simple Usando Docker

Descargar la Imagen de Linux

Comience por descargar la imagen alpine de Docker Hub. La imagen alpine es una distribución de Linux minimalista, diseñada para ser ligera y rápida.

Ejecute el siguiente comando:

docker pull alpine

Esto descargará la imagen alpine en su sistema local.

Ejecutar el Contenedor

Cree y inicie un contenedor utilizando la imagen alpine. También lanzaremos una sesión de terminal dentro del contenedor.

docker run -it alpine /bin/sh

Esto es lo que significa cada opción:

  • docker run: Crea e inicia un nuevo contenedor.

  • -it: Permite interactuar con el contenedor (modo interactivo + terminal).

  • alpine: Especifica la imagen a utilizar.

  • /bin/sh: Especifica el comando a ejecutar dentro del contenedor (una sesión de shell en este caso).

Explora el contenedor

Una vez que el contenedor está en ejecución, verás un indicador de shell que se ve algo así

/ #

Esto indica que estás dentro del contenedor de Alpine Linux. Ahora puedes ejecutar comandos de Linux. Por ejemplo:

Verifica el directorio actual:

pwd

Lista los archivos en el directorio:

ls

Salida: Una estructura de directorio mínima, ya que Alpine es una imagen ligera.

También puedes instalar un paquete (Alpine utiliza apk como su gestor de paquetes):

apk add curl

Salir del contenedor

Cuando hayas terminado de explorar, escribe exit para cerrar la sesión y detener el contenedor

bashCopy codeexit

Acceder al contenedor después de detenerlo

Si deseas acceder al contenedor nuevamente después de detenerlo, puedes usar este comando para listar todos los contenedores (incluidos los detenidos):

docker ps -a

Verás una lista de contenedores con sus IDs y estados, luego puedes iniciar el contenedor detenido:

docker start <container-id>

Puedes adjuntarte a la shell del contenedor usando este comando:

docker exec -it <container-id> /bin/sh

Si ya no necesitas el contenedor, puedes eliminarlo

  1. Detener el contenedor (si aún está en ejecución):

     docker stop <id-del-contenedor>
    
  2. Eliminar el contenedor:

     docker rm <identificador-del-contenedor>
    

Resumen de Comandos Clave de Docker

Comando Descripción
docker pull alpine Descarga la imagen de Alpine Linux.
docker run -it alpine /bin/sh Crea y arranca un contenedor interactivo.
docker ps -a Lista todos los contenedores (en ejecución y detenidos).
docker start <identificador-del-contenedor> Inicia un contenedor detenido.
docker exec -it <identificador-del-contenedor> Se conecta a un contenedor en ejecución.
docker stop <identificador-del-contenedor> Detiene un contenedor en ejecución.
docker rm <identificador-del-contenedor> Elimina un contenedor detenido.

Conclusión

Ahora que tienes una comprensión básica, es hora de poner en práctica tus conocimientos. Comienza a experimentar con Docker, construye tu primer contenedor y explora su vasto ecosistema.

Pronto verás por qué Docker se ha convertido en un pilar del DevOps moderno y la ingeniería de software.

Puedes seguirme en