Descripción general de Docker
Docker fue inicialmente un proyecto interno iniciado por Solomon Hykes, fundador de dotCloud, una empresa con sede en Francia. Fue una innovación construida sobre años de tecnología de servicio en la nube de dotCloud y se abrió al código abierto en marzo de 2013 bajo la licencia Apache 2.0. El código principal del proyecto se mantiene en GitHub y el proyecto ha sido renombrado a Moby. El proyecto Docker más tarde se unió a la Linux Foundation y estableció la Open Container Initiative (OCI).
Después de abrirse al código abierto, Docker ganó mucha atención y discusión, con su proyecto en GitHub acumulando más de 67,000 estrellas y más de 18,000 bifurcaciones hasta la fecha. Debido a la popularidad del proyecto Docker, dotCloud decidió cambiar su nombre a Docker a finales de 2013. Docker fue inicialmente desarrollado e implementado en Ubuntu 12.04, mientras que Red Hat comenzó a apoyar a Docker desde RHEL 6.5 y Google utilizó extensamente Docker en sus productos PaaS.
Docker está desarrollado usando Go, un lenguaje de programación introducido por Google, aprovechando tecnologías del kernel de Linux como cgroups, namespaces y Union FS tipo OverlayFS. Encapsula e aísla procesos a nivel del sistema operativo, una forma de virtualización a nivel del sistema operativo. Dado que los procesos aislados son independientes del host y de otros procesos aislados, se les denomina contenedores. La implementación inicial se basó en LXC, pero a partir de la versión 0.7, LXC fue eliminado y Docker comenzó a usar su libcontainer desarrollado internamente. A partir de la versión 1.11, evolucionó aún más para usar runC y containerd.
Qué es Docker
Docker es una plataforma abierta para desarrollar, enviar y ejecutar aplicaciones. Docker te permite separar tus aplicaciones de tu infraestructura para que puedas entregar software rápidamente. Con Docker, puedes gestionar tu infraestructura de la misma manera que gestionas tus aplicaciones. Al aprovechar las metodologías de Docker para el envío, prueba e implementación de código, puedes reducir significativamente el retraso entre escribir código y ejecutarlo en producción.
Por qué usar Docker
Como método de virtualización emergente, Docker ofrece numerosas ventajas en comparación con los enfoques de virtualización tradicionales.
Utilización de recursos más eficiente Dado que los contenedores no requieren virtualización de hardware ni ejecutar un sistema operativo completo, Docker utiliza los recursos del sistema más eficientemente. Ya sea la velocidad de ejecución de aplicaciones, el consumo de memoria o la velocidad de almacenamiento de archivos, Docker supera a las tecnologías de virtualización tradicionales. En consecuencia, en comparación con la tecnología de máquinas virtuales, un host con la misma configuración a menudo puede ejecutar más aplicaciones.
Tiempo de inicio más rápido La tecnología tradicional de máquinas virtuales a menudo tarda minutos en iniciar un servicio de aplicación, mientras que los contenedores de Docker pueden lograr tiempos de inicio casi instantáneos, a menudo en segundos o incluso milisegundos, ya que se ejecutan directamente en el kernel del host sin necesidad de un arranque completo del sistema operativo. Esto reduce significativamente el tiempo de desarrollo, prueba e implementación.
Entorno de ejecución consistente Un problema común durante el proceso de desarrollo es la inconsistencia del entorno. Debido a las diferencias entre los entornos de desarrollo, prueba y producción, algunos errores pueden pasar desapercibidos durante el desarrollo. Las imágenes de Docker proporcionan un entorno de ejecución completo, excepto el kernel, asegurando la consistencia del entorno de ejecución de la aplicación y previniendo el problema de "pero funciona en mi máquina".
Entrega continua y despliegue Para los desarrolladores y el personal de operaciones (DevOps), el escenario ideal es crear o configurar una vez y que funcione correctamente en cualquier lugar.
Docker habilita la integración continua, la entrega continua y el despliegue personalizando imágenes de aplicaciones. Los desarrolladores pueden construir imágenes utilizando Dockerfiles e integrarlas con sistemas de integración continua para pruebas. Los equipos de operaciones pueden luego implementar rápidamente estas imágenes en entornos de producción, incluso integrándose con sistemas de entrega/despliegue continuo para despliegues automatizados.
El uso de Dockerfiles hace que la construcción de imágenes sea transparente, permitiendo que tanto los equipos de desarrollo como de operaciones comprendan el entorno de ejecución de la aplicación y los requisitos de despliegue, facilitando una mejor implementación de imágenes en producción.
Migración más fácil Dado que Docker asegura la consistencia del entorno de ejecución, la migración de aplicaciones se vuelve más sencilla. Docker puede ejecutarse en diversas plataformas, incluyendo máquinas físicas, máquinas virtuales, nubes públicas, nubes privadas y hasta portátiles, con resultados consistentes. Los usuarios pueden migrar fácilmente aplicaciones que se ejecutan en una plataforma a otra sin preocuparse de que los cambios en el entorno de ejecución impidan que la aplicación funcione correctamente.
Mantenimiento y extensibilidad más fáciles La tecnología de almacenamiento en capas e imágenes de Docker facilita la reutilización de componentes de aplicación duplicados, simplificando el mantenimiento y actualización de aplicaciones. Extender imágenes basadas en imágenes base también se vuelve muy simple. Además, el equipo de Docker, junto con varios equipos de proyectos de código abierto, mantiene una gran colección de imágenes oficiales de alta calidad que pueden ser utilizadas directamente en entornos de producción o como base para una mayor personalización, reduciendo significativamente el costo de crear imágenes de servicios de aplicación.
Arquitectura de Docker
Docker utiliza una arquitectura cliente-servidor. El cliente de Docker se comunica con el demonio de Docker, que es responsable de construir, ejecutar y distribuir tus contenedores de Docker. El cliente y el demonio de Docker pueden ejecutarse en el mismo sistema, o puedes conectar un cliente de Docker a un demonio de Docker remoto. El cliente y el demonio de Docker se comunican utilizando una API REST, a través de sockets UNIX o una interfaz de red. Otro cliente de Docker es Docker Compose, que te permite trabajar con aplicaciones que consisten en un conjunto de contenedores.
El demonio de Docker
El demonio de Docker (dockerd
) escucha las solicitudes de la API de Docker y gestiona los objetos de Docker, como imágenes, contenedores, redes y volúmenes. Un demonio también puede comunicarse con otros demonios para gestionar servicios de Docker.
El cliente de Docker
El cliente de Docker (docker
) es la forma principal en que muchos usuarios de Docker interactúan con Docker. Cuando usas comandos como docker run
, el cliente envía estos comandos a dockerd
, que los lleva a cabo. El comando docker
utiliza la API de Docker. El cliente de Docker puede comunicarse con más de un demonio.
Docker Desktop
Docker Desktop es una aplicación fácil de instalar para tu entorno Mac, Windows o Linux que te permite construir y compartir aplicaciones y microservicios contenerizados. Docker Desktop incluye el demonio de Docker (dockerd
), el cliente de Docker (docker
), Docker Compose, Docker Content Trust, Kubernetes y Credential Helper. Para obtener más información, consulta Docker Desktop.
Registros de Docker
Un registro de Docker almacena imágenes de Docker. Docker Hub es un registro público que cualquiera puede utilizar, y Docker busca imágenes en Docker Hub por defecto. Incluso puedes ejecutar tu propio registro privado.
Cuando usas los comandos docker pull
o docker run
, Docker extrae las imágenes requeridas de tu registro configurado. Cuando usas el comando docker push
, Docker empuja tu imagen a tu registro configurado.
Objetos de Docker
Cuando usas Docker, estás creando y usando imágenes, contenedores, redes, volúmenes, plugins y otros objetos. Esta sección es una breve descripción general de algunos de esos objetos.
Imágenes
Una imagen es una plantilla de solo lectura con instrucciones para crear un contenedor de Docker. A menudo, una imagen se basa en otra imagen, con alguna personalización adicional. Por ejemplo, puedes construir una imagen que se base en la imagen de ubuntu
, pero que instale el servidor web Apache y tu aplicación, así como los detalles de configuración necesarios para que tu aplicación funcione.
Puedes crear tus propias imágenes o quizás solo utilizar las creadas por otros y publicadas en un registro. Para construir tu propia imagen, creas un Dockerfile con una sintaxis simple para definir los pasos necesarios para crear la imagen y ejecutarla. Cada instrucción en un Dockerfile crea una capa en la imagen. Cuando cambias el Dockerfile y reconstruyes la imagen, solo las capas que han cambiado se reconstruyen. Esto es parte de lo que hace que las imágenes sean tan ligeras, pequeñas y rápidas, en comparación con otras tecnologías de virtualización.
Contenedores
Un contenedor es una instancia ejecutable de una imagen. Puedes crear, iniciar, detener, mover o eliminar un contenedor usando la API o CLI de Docker. Puedes conectar un contenedor a una o más redes, adjuntarle almacenamiento o incluso crear una nueva imagen basada en su estado actual.
Por defecto, un contenedor está relativamente bien aislado de otros contenedores y de su máquina anfitriona. Puedes controlar qué tan aislados están los sistemas de red, almacenamiento u otros subsistemas subyacentes de un contenedor de otros contenedores o de la máquina anfitriona.
Un contenedor está definido por su imagen, así como por cualquier opción de configuración que proporciones al crearlo o iniciar. Cuando se elimina un contenedor, todos los cambios en su estado que no estén almacenados en almacenamiento persistente desaparecen.