Compartir a través de


¿Qué es Docker?

Sugerencia

Este contenido es un extracto del libro electrónico, ".NET Microservices Architecture for Containerized .NET Applications" (Arquitectura de microservicios de .NET para aplicaciones de .NET contenedorizadas), disponible en Documentación de .NET o como un PDF descargable y gratuito que se puede leer sin conexión.

Miniatura de la portada del libro electrónico 'Arquitectura de microservicios de .NET para aplicaciones .NET contenedorizadas'.

Docker es un proyecto de código abierto para automatizar la implementación de aplicaciones como contenedores portátiles y autoadministrados que se pueden ejecutar en la nube o en el entorno local. Docker también es una empresa de que promueve y evoluciona esta tecnología, trabajando en colaboración con proveedores en la nube, Linux y Windows, incluido Microsoft.

Diagrama en el que se muestran los lugares en los que se pueden ejecutar los contenedores de Docker.

Figura 2-2. Docker implementa contenedores en todas las capas de la nube híbrida.

Los contenedores de Docker se pueden ejecutar en cualquier lugar, local en el centro de datos del cliente, en un proveedor de servicios externo o en la nube, en Azure. Los contenedores de imágenes de Docker se pueden ejecutar de forma nativa en Linux y Windows. Sin embargo, las imágenes de Windows solo se pueden ejecutar en hosts de Windows, mientras que las imágenes de Linux se pueden ejecutar tanto en hosts de Linux como en hosts de Windows, utilizando una máquina virtual de Linux de Hyper-V hasta ahora. Aquí, "host" se refiere a un servidor o una máquina virtual.

Los desarrolladores pueden usar entornos de desarrollo en Windows, Linux o macOS. En el equipo de desarrollo, el desarrollador ejecuta un host de Docker donde se implementan imágenes de Docker, incluida la aplicación y sus dependencias. Los desarrolladores que trabajan en Linux o en macOS usan un host de Docker basado en Linux y solo pueden crear imágenes para contenedores de Linux. (Los desarrolladores que trabajan en macOS pueden editar código o ejecutar la CLI de Docker desde macOS, pero a partir del momento en que se escribe, los contenedores no se ejecutan directamente en macOS). Los desarrolladores que trabajan en Windows pueden crear imágenes para contenedores de Linux o Windows.

Para hospedar contenedores en entornos de desarrollo y proporcionar herramientas de desarrollo adicionales, Docker incluye Docker Desktop para Windows o para macOS. Estos productos instalan la máquina virtual necesaria (el host de Docker) para hospedar los contenedores.

Para ejecutar contenedores de Windows, hay dos tipos de tiempos de ejecución:

  • Los contenedores de Windows Server proporcionan aislamiento de aplicaciones mediante tecnología de aislamiento de procesos y espacios de nombres. Un contenedor de Windows Server comparte un kernel con el host de contenedor y con todos los contenedores que se ejecutan en el host.

  • Hyper-V Los contenedores amplían el aislamiento proporcionado por los contenedores de Windows Server al ejecutar cada contenedor en una máquina virtual altamente optimizada. En esta configuración, el kernel del host de contenedor no se comparte con los contenedores de Hyper-V, lo que proporciona un mejor aislamiento.

Las imágenes de estos contenedores se crean de la misma manera y funcionan igual. La diferencia está en cómo se crea el contenedor a partir de la imagen; ejecutar un contenedor Hyper-V requiere un parámetro adicional. Para más información, vea Contenedores de Hyper-V.

Comparación de contenedores de Docker con máquinas virtuales

En la figura 2-3 se muestra una comparación entre las máquinas virtuales y los contenedores de Docker.

Máquinas virtuales Contenedores de Docker
Diagrama que muestra la pila de hardware o software de una máquina virtual tradicional. Diagrama que muestra la pila de hardware o software para contenedores de Docker.
Las máquinas virtuales incluyen la aplicación, las bibliotecas o archivos binarios necesarios y un sistema operativo invitado completo. La virtualización completa requiere más recursos que la contenedorización. Los contenedores incluyen la aplicación y todas sus dependencias. Sin embargo, comparten el kernel del sistema operativo con otros contenedores, ejecutándose como procesos aislados en el espacio de usuario en el sistema operativo host. (Excepto en contenedores Hyper-V, donde cada contenedor se ejecuta dentro de una máquina virtual especial para cada contenedor).

Figura 2-3. Comparación de máquinas virtuales tradicionales con contenedores de Docker

En el caso de las máquinas virtuales, hay tres capas base en el servidor host, desde la parte inferior: infraestructura, sistema operativo host y un hipervisor y encima de todo lo que cada máquina virtual tiene su propio sistema operativo y todas las bibliotecas necesarias. Para Docker, el servidor host solo tiene la infraestructura y el sistema operativo y encima de eso, el motor de contenedor, que mantiene el contenedor aislado pero comparte los servicios del sistema operativo base.

Dado que los contenedores requieren mucho menos recursos (por ejemplo, no necesitan un sistema operativo completo), son fáciles de implementar y comienzan rápidamente. Esto le permite tener una mayor densidad, lo que significa que permite ejecutar más servicios en la misma unidad de hardware, lo que reduce los costos.

Como efecto secundario de la ejecución en el mismo kernel, obtendrá menos aislamiento que las máquinas virtuales.

El objetivo principal de una imagen es que el entorno (dependencias) sea el mismo en distintas implementaciones. Esto significa que puede depurarlo en su equipo y, a continuación, implementarlo en otra máquina con el mismo entorno garantizado.

Una imagen de contenedor es una manera de empaquetar una aplicación o servicio e implementarla de forma confiable y reproducible. Podría decir que Docker no es solo una tecnología, sino también una filosofía y un proceso.

Al usar Docker, no escuchará a los desarrolladores decir: "Funciona en mi máquina, ¿por qué no en producción?" Simplemente pueden decir: "Se ejecuta en Docker", ya que la aplicación de Docker empaquetada se puede ejecutar en cualquier entorno de Docker compatible y ejecuta la forma en que estaba pensada para en todos los destinos de implementación (como Dev, QA, staging y production).

Una analogía simple

Quizás una analogía simple puede ayudar a comprender el concepto principal de Docker.

Volvamos en el tiempo a los años 1950 por un momento. No había procesadores de texto, y además, las fotocopiadoras se usaban en todas partes (más o menos).

Imagine que es responsable de emitir rápidamente lotes de cartas según sea necesario, para enviarlos a los clientes, utilizando papel y sobres reales, para que se entreguen físicamente a la dirección de cada cliente (no había ningún correo electrónico entonces).

En algún momento, te das cuenta de que las cartas son simplemente una composición de un gran conjunto de párrafos, que se seleccionan y organizan según el propósito de la carta, por lo que desarrollas un sistema para emitir cartas rápidamente, esperando obtener un buen aumento.

El sistema es sencillo:

  1. Comienza con una baraja de hojas transparentes que contienen un párrafo cada uno.

  2. Para preparar un conjunto de cartas, elige las hojas con los párrafos que necesitas, luego apílalas y alinéalas para que se vean bien y sean legibles.

  3. Por último, coloca el conjunto en la fotocopiadora y presiona el inicio para producir tantas letras como sea necesario.

Por lo tanto, simplificando, esa es la idea principal de Docker.

En Docker, cada capa es el conjunto resultante de cambios que se producen en el sistema de archivos después de ejecutar un comando, como instalar un programa.

Por lo tanto, cuando miras el sistema de archivos después de copiar la capa, verás todos los archivos que están en la capa cuando se instaló el programa.

Puede pensar en una imagen como un disco duro auxiliar de solo lectura listo para instalarse en un "equipo" donde el sistema operativo ya está instalado.

Del mismo modo, puede considerar un contenedor como el "equipo" con el disco duro de imagen instalado. El contenedor, al igual que un equipo, puede encenderse o apagarse.