top of page

Entendiendo Docker: El poder de los contenedores vs. las máquinas virtuales

El desarrollo y la implementación de software han evolucionado rápidamente durante la última década. Uno de los cambios más significativos ha sido el auge de la tecnología de contenedores, con Docker a la cabeza. Los contenedores han transformado la forma en que los desarrolladores crean, distribuyen y ejecutan aplicaciones, ofreciendo una alternativa ligera a las máquinas virtuales (VM) tradicionales. Esta publicación explora qué es Docker, por qué se usan ampliamente los contenedores, los compara con las VM y explica cómo crear e implementar imágenes de Docker mediante pipelines de CI/CD en un clúster de Kubernetes.



Vista a la altura de los ojos de una pantalla de computadora que muestra el diagrama de la arquitectura del contenedor Docker


¿Qué es Docker y por qué son populares los contenedores?

Docker es una plataforma de código abierto que automatiza la implementación de aplicaciones dentro de contenedores ligeros y portátiles. Un contenedor Docker empaqueta una aplicación y todas sus dependencias, bibliotecas y archivos de configuración en una sola unidad que puede ejecutarse de forma consistente en diferentes entornos informáticos.


¿Por qué se utilizan ampliamente los contenedores?


  • Portabilidad: los contenedores funcionan de la misma manera en cualquier sistema con Docker instalado, ya sea la computadora portátil de un desarrollador, un servidor de pruebas o un entorno de nube.

  • Eficiencia: Los contenedores comparten el kernel del sistema operativo host, lo que los hace mucho más livianos y rápidos de iniciar que las máquinas virtuales.

  • Coherencia: los desarrolladores pueden estar seguros de que la aplicación se comporta de la misma manera en el desarrollo, las pruebas y la producción.

  • Aislamiento: los contenedores aíslan las aplicaciones entre sí, evitando conflictos entre dependencias.

  • Escalabilidad: los contenedores se pueden replicar y orquestar fácilmente, lo que los hace ideales para microservicios y aplicaciones nativas de la nube.


Estos beneficios han convertido a los contenedores Docker en una herramienta estándar para el desarrollo y la implementación de software moderno.


Comparación de contenedores Docker y máquinas virtuales

Tanto los contenedores Docker como las máquinas virtuales proporcionan entornos aislados para ejecutar aplicaciones, pero lo hacen de maneras fundamentalmente diferentes.

Aspecto

Contenedores Docker

Máquinas virtuales

Arquitectura

Compartir el kernel del sistema operativo host, ejecutar espacios de usuario aislados

Ejecute el sistema operativo invitado completo en hardware virtualizado

Tamaño

Ligero, normalmente megabytes

Más grandes, a menudo de varios gigabytes

Tiempo de inicio

Segundos o menos

Minutos

Uso de recursos

Bajo, comparte recursos del sistema operativo

Alto, requiere recursos del sistema operativo dedicados

Nivel de aislamiento

Aislamiento a nivel de proceso

Aislamiento más fuerte con sistema operativo independiente

Portabilidad

Altamente portable entre sistemas con Docker

Portátil pero requiere hipervisor compatible

Casos de uso

Microservicios, implementación rápida, pipelines de CI/CD

Ejecución de múltiples tipos de sistemas operativos y aplicaciones heredadas


Ventajas de los contenedores Docker sobre las máquinas virtuales


  • Inicio y apagado más rápidos: los contenedores se inician casi instantáneamente.

  • Menor consumo de recursos: los contenedores utilizan menos CPU, memoria y almacenamiento.

  • Gestión más sencilla: es más fácil crear, enviar y actualizar aplicaciones.

  • Mejor para microservicios: los contenedores se adaptan bien a servicios pequeños y modulares.


Desventajas de los contenedores Docker


  • Aislamiento más débil: los contenedores comparten el kernel del sistema operativo host, lo que puede representar riesgos de seguridad.

  • Compatibilidad limitada con sistemas operativos: los contenedores generalmente ejecutan contenedores Linux o Windows en hosts compatibles.

  • Menos adecuado para ejecutar múltiples tipos de sistemas operativos: las máquinas virtuales pueden ejecutar diferentes sistemas operativos en el mismo hardware.


Construyendo una imagen de Docker

Crear una imagen de Docker es el primer paso para empaquetar tu aplicación en un contenedor. Una imagen de Docker contiene todo lo necesario para ejecutar la aplicación: código, entorno de ejecución, bibliotecas y variables de entorno.


Pasos para crear una imagen de Docker


  1. Escribir un Dockerfile: Este archivo de texto contiene instrucciones para ensamblar la imagen. Especifica la imagen base, copia archivos, instala dependencias y define el comando de inicio.


Ejemplo de Dockerfile para una aplicación Node.js:

   -->dockerfile
   FROM node:16-alpine
   WORKDIR /app
   COPY package.json .
   RUN npm install
   COPY . .
   CMD ["node", "index.js"]

Construir la imagen: utilice el comando CLI de Docker para construir la imagen desde el Dockerfile.

-->bash
docker build -t my-node-app:latest .

Pruebe la imagen localmente: ejecute el contenedor para verificar que funciona.

-->bash
docker run -p 3000:3000 my-node-app:latest

Enviar la imagen a un registro: cargue la imagen a un registro de contenedor como Docker Hub o un registro privado.

-->bash
docker tag my-node-app:latest myrepo/my-node-app:latest
docker push myrepo/my-node-app:latest

Implementación de imágenes de Docker mediante CI/CD en Kubernetes

Kubernetes es una popular plataforma de orquestación de contenedores que automatiza la implementación, el escalado y la gestión de aplicaciones contenedorizadas. La integración de Docker con Kubernetes y las canalizaciones de CI/CD optimiza la entrega de software.


Descripción general del proceso de implementación


  1. Integración Continua (CI): Los desarrolladores envían los cambios de código a un sistema de control de versiones (p. ej., Git ). Un servidor de CI (como Jenkins, GitLab CI o GitHub Actions ) crea automáticamente la imagen de Docker, ejecuta pruebas y la envía a un registro.


  2. Implementación continua (CD): una vez que la imagen está en el registro, la canalización de CD actualiza el clúster de Kubernetes para usar la nueva versión de la imagen.


Pasos detallados


  • Configurar una canalización de CI:

- Configurar la canalización para que se active en las confirmaciones de código.

- Incluir etapas para construir la imagen de Docker, ejecutar pruebas unitarias y de integración.

- Envíe la imagen probada a un registro de contenedor.


  • Preparar manifiestos de Kubernetes:

- Definir archivos YAML de implementación especificando la imagen del contenedor, las réplicas, los puertos y las variables de entorno.


- Fragmento de ejemplo de implementación:

-->yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-node-app
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: my-node-app
      template:
        metadata:
          labels:
            app: my-node-app
        spec:
          containers:
          - name: node-container
            image: myrepo/my-node-app:latest
            ports:
            - containerPort: 3000

Automatice la implementación con herramientas de CD:

  • Utilice herramientas como Argo CD, Flux o comandos nativos de Kubernetes en la canalización.

- La canalización aplica los manifiestos actualizados al clúster, lo que activa actualizaciones continuas.


Monitorizar y revertir:

  • Supervise el estado de la aplicación mediante sondas y registros de Kubernetes.

- Vuelva a versiones anteriores si surgen problemas.



Vista en ángulo alto del panel del clúster de Kubernetes que muestra los pods y las implementaciones de contenedores


Ejemplo práctico: del código a Kubernetes

Imagine un equipo que desarrolla una aplicación web. Usan GitHub para el control de código fuente y GitHub Actions para CI/CD.


  • Cuando un desarrollador envía código, GitHub Actions crea una imagen de Docker.

  • La tubería ejecuta pruebas dentro del contenedor.

  • Si las pruebas pasan, la imagen se envía a Docker Hub.

  • Luego, la canalización actualiza el manifiesto de implementación de Kubernetes con la nueva etiqueta de imagen.

  • Finalmente, la canalización aplica el manifiesto al clúster de Kubernetes e implementa la nueva versión sin tiempo de inactividad.


Este proceso reduce los pasos manuales, acelera los lanzamientos y garantiza la coherencia en todos los entornos.


Resumen

Los contenedores Docker ofrecen una forma ligera y portátil de empaquetar y ejecutar aplicaciones. En comparación con las máquinas virtuales, los contenedores se inician más rápido y consumen menos recursos, lo que los hace ideales para flujos de trabajo de desarrollo y microservicios modernos. Sin embargo, los contenedores proporcionan menos aislamiento y dependen del kernel del sistema operativo host.


Crear imágenes Docker implica escribir un Dockerfile, compilar y probar la imagen, y enviarla a un registro. Implementar estas imágenes en un clúster de Kubernetes mediante pipelines de CI/CD automatiza la entrega y el escalado, mejorando la confiabilidad y la velocidad.


bottom of page