En esta guía completa, he explicado qué es Docker, su evolución, los conceptos básicos subyacentes de Linux y cómo funciona.
Docker se ha convertido en el estándar de facto cuando se trata de implementaciones basadas en contenedores. Docker es la base para la orquestación basada en contenedores, desde implementaciones a pequeña escala hasta aplicaciones empresariales a gran escala.
Docker ganó tanta popularidad y adopción en la comunidad DevOps rápidamente porque está desarrollado para la portabilidad y diseñado para la arquitectura moderna de microservicios.
En este blog, aprenderás,
- ¿Qué es Docker?
- Obtenga más información sobre Docker y vea por qué Docker es beneficioso y diferente de otras tecnologías de contenedores.
- Arquitectura central de Docker y sus componentes clave
- Evolución de los contenedores y el concepto subyacente de los contenedores de Linux
- ¿Qué es un contenedor y qué características de Linux hacen que funcione?
- La diferencia entre un proceso, un contenedor y una máquina virtual
Aquí, la idea es tener los conceptos básicos correctos para comprender qué es realmente Docker y cómo funciona.
¿Qué es Docker?
Docker es un popular proyecto de código abierto escrito en go y desarrollado por Dotcloud (una empresa de PaaS).
Es un motor contenedor que utiliza las características del Kernel de Linux como espacios de nombres y grupos de control para crear contenedores sobre un sistema operativo. Entonces puede llamarlo virtualización a nivel de sistema operativo.
Docker se construyó inicialmente sobre contenedores de Linux (LXC) . Más tarde, Docker reemplazó LXC con su contenedor de tiempo de ejecución libcontainer (ahora parte de runc). He explicado los conceptos básicos de LXC y contenedores hacia el final del artículo.
Podría preguntarse en qué se diferencia Docker de un contenedor de Linux (LXC), ya que todos los conceptos y la implementación son similares.
Además de ser solo una tecnología de contenedores, Docker tiene componentes envolventes bien definidos que facilitan las aplicaciones de empaquetado. . Antes de Docker, no era fácil ejecutar contenedores. Lo que significa que hace todo el trabajo para desacoplar su aplicación de la infraestructura empaquetando todos los requisitos del sistema de la aplicación en un contenedor.
Por ejemplo, si tiene un archivo jar de Java, puede ejecutarlo en cualquier servidor que tenga Java instalado. De la misma manera, una vez que empaquete un contenedor con las aplicaciones requeridas usando Docker, puede ejecutarlo en cualquier otro host que tenga Docker instalado.
Tendremos contenedores en funcionamiento ejecutando algunos comandos y parámetros de Docker.
Diferencia entre Docker y Contenedor
Docker es una tecnología o una herramienta desarrollada para administrar contenedores de manera eficiente.
Entonces, ¿puedo ejecutar un contenedor sin Docker?
¡Sí! por supuesto. Puede usar la tecnología LXC para ejecutar contenedores en servidores Linux. Además, las últimas herramientas como Podman ofrecen flujos de trabajo similares a los de Docker.
Cosas que debe saber sobre Docker:
- Docker no es LXC
- Docker no es una solución de máquina virtual.
- Docker no es un sistema de administración de configuración y no reemplaza a Chef, Puppet, Ansible, etc.
- Docker no es una plataforma como tecnología de servicio.
- Docker no es un contenedor.
¿Qué hace que Docker sea tan bueno?
Docker tiene un flujo de trabajo eficiente para mover la aplicación de la computadora portátil del desarrollador al entorno de prueba y producción. Comprenderá más al respecto cuando observe un ejemplo práctico de cómo empaquetar una aplicación en una imagen de Docker.
¿Sabes que iniciar un contenedor docker toma menos de un segundo? ?
Es increíblemente rápido y puede ejecutarse en cualquier host con kernel de Linux compatible. (También es compatible con Windows)
Nota: no puede ejecutar un contenedor de Windows en un host de Linux porque no hay soporte de Linux Kernel para Windows. Puede leer acerca de los contenedores de Windows desde aquí
Docker utiliza un sistema de archivos de unión de copia en escritura para su almacenamiento de imágenes. Por lo tanto, cuando se realizan cambios en un contenedor, solo los cambios se escribirán en el disco mediante la copia en el modelo de escritura.
Con Copiar al escribir, tendrá capas de almacenamiento compartido optimizadas para todos sus contenedores.
Estadísticas de adopción de Docker
Aquí están los datos de tendencias de Google en Docker. Puede ver que ha sido un tema explosivo durante los últimos cinco años.
Este es el resultado de una encuesta de Datadog, que muestra el aumento en la adopción de Docker.
Arquitectura central de Docker
Las siguientes secciones analizarán la arquitectura de Docker y sus componentes asociados. También veremos cómo funciona cada componente en conjunto para que Docker funcione.
La arquitectura de Docker ha cambiado varias veces desde su creación. Cuando publiqué la primera versión de este artículo, Docker se creó sobre LXC
Estos son algunos cambios arquitectónicos notables que ocurrieron en Docker
- Docker pasó de LXC a libcontainer en 2014
- runc:una CLI para activar contenedores que siguen todas las especificaciones de OCI.
- containerd:Docker separó su componente de administración de contenedores a containerd en 2016
OCI:Open Container Initiative es un estándar abierto de la industria para el tiempo de ejecución y las especificaciones de los contenedores.
Cuando se lanzó inicialmente Docker, tenía una arquitectura monolítica. Ahora está separado en los siguientes tres componentes diferentes.
- Motor Docker (dockerd)
- docker-containerd (contenedor)
- docker-runc (runc)
Docker y otras grandes organizaciones contribuyeron a un tiempo de ejecución de contenedor estándar y capas de administración. Por lo tanto containerd
y runc
ahora son parte de Cloud Native Foundation con colaboradores de todas las organizaciones.
Nota: Al instalar Docker, todos estos componentes se instalan. No tienes que instalarlo por separado. Para explicarlo, lo mostramos como componentes diferentes.
Ahora echemos un vistazo a cada componente de Docker.
Motor acoplable
El motor de Docker comprende el demonio de Docker, una interfaz API y la CLI de Docker. El demonio Docker (dockerd) se ejecuta continuamente como dockerd
servicio del sistema. Es responsable de construir las imágenes de la ventana acoplable.
Para administrar imágenes y ejecutar contenedores, dockerd
llama al docker-containerd
API.
docker-containerd (containerd)
containerd
es otro servicio de daemon del sistema que es responsable de descargar las imágenes de la ventana acoplable y ejecutarlas como un contenedor. Expone su API para recibir instrucciones del dockerd
servicio
docker-runc
runc
es el tiempo de ejecución del contenedor responsable de crear los espacios de nombres y cgroups necesarios para un contenedor. Luego ejecuta los comandos del contenedor dentro de esos espacios de nombres. runc runtime se implementa según la especificación OCI.
Lea esta excelente serie de publicaciones de blog de 3 partes para obtener más información sobre los tiempos de ejecución de contenedores.
¿Cómo funciona Docker?
Hemos visto los componentes básicos de Docker.
Ahora comprendamos el flujo de trabajo de Docker usando los componentes de Docker.
Componentes de Docker
La siguiente arquitectura acoplable de alto nivel oficial El diagrama muestra el flujo de trabajo común de Docker.
El ecosistema de Docker está compuesto por los siguientes cuatro componentes
- Demonio Docker (dockerd)
- Cliente Docker
- Imágenes acoplables
- Registros de Docker
- Contenedores Docker
¿Qué es un demonio Docker?
Docker tiene una arquitectura cliente-servidor. Daemon Docker (dockerd
) o el servidor es responsable de todas las acciones relacionadas con los contenedores.
El daemon recibe los comandos del cliente Docker a través de la CLI o la API REST. El cliente de Docker puede estar en el mismo host que un demonio o estar presente en cualquier otro host.
De forma predeterminada, el demonio docker escucha el docker.sock
Zócalo UNIX. Si tiene algún caso de uso para acceder a la API de la ventana acoplable de forma remota, debe exponerlo a través de un puerto de host. Uno de esos casos de uso es ejecutar Docker como agentes de Jenkins.
Si desea ejecutar Docker dentro de Docker, puede usar docker.sock
desde la máquina host.
¿Qué es una imagen de Docker?
Las imágenes son los componentes básicos de Docker. Contiene las bibliotecas del sistema operativo, las dependencias y las herramientas para ejecutar una aplicación.
Las imágenes se pueden compilar previamente con dependencias de aplicaciones para crear contenedores. Por ejemplo, si desea ejecutar un servidor web Nginx como un contenedor de Ubuntu, debe crear una imagen Docker con el binario Nginx y todas las bibliotecas del sistema operativo necesarias para ejecutar Nginx.
¿Qué es un Dockerfile?
Docker tiene un concepto de Dockerfile
que se utiliza para construir la imagen. Un Dockerfile, un archivo de texto que contiene un comando (instrucciones) por línea.
Este es un ejemplo de un Dockerfile.
Una imagen acoplable se organiza en capas. Cada instrucción en un Dockerfile
se añade una capa en una imagen. La capa de escritura superior de la imagen es un contenedor.
Cada imagen se crea a partir de una imagen base.
Por ejemplo, si puede usar una imagen base de Ubuntu y crear otra imagen con la aplicación Nginx. Una imagen base puede ser una imagen principal o una imagen creada a partir de una imagen principal. Consulte su artículo de Docker para obtener más información al respecto.
¿Podría preguntar de dónde proviene esta imagen base (imagen principal)? Hay utilidades acoplables para crear la imagen base principal inicial. Toma las bibliotecas del sistema operativo requeridas y las convierte en una imagen base. No tiene que hacer esto porque obtendrá las imágenes base oficiales para las distribuciones de Linux.
La capa superior de una imagen es escribible y utilizada por el contenedor en ejecución. Las demás capas de la imagen son de solo lectura.
¿Qué es un registro de Docker?
Es un repositorio (almacenamiento) de imágenes de Docker.
Un registro puede ser público o privado. Por ejemplo, Docker Inc proporciona un servicio de registro alojado llamado Docker Hub. Le permite cargar y descargar imágenes desde una ubicación central.
Nota: De forma predeterminada, cuando instala Docker, busca imágenes del concentrador público de Docker, a menos que especifique un registro personalizado en la configuración de Docker.
Otros usuarios de Docker hub pueden acceder a todas sus imágenes si su repositorio es público. También puede crear un registro privado en Docker Hub.
El concentrador de Docker actúa como git, donde puede crear sus imágenes localmente en su computadora portátil, enviarlas y luego enviarlas al concentrador de Docker.
Consejo: Cuando utilice la ventana acoplable en proyectos/redes empresariales, configure sus propios registros de la ventana acoplable en lugar de utilizar el concentrador de la ventana acoplable pública. Todos los proveedores de la nube tienen sus propios servicios de registro de contenedores.
¿Qué es un Contenedor Docker?
Los contenedores Docker se crean a partir de imágenes existentes. Es una capa de escritura de la imagen.
Si intenta relacionar capas de imágenes y un contenedor, así es como se ve una imagen basada en ubuntu.
Puede empaquetar sus aplicaciones en un contenedor, confirmarlo y convertirlo en una imagen dorada para crear más contenedores a partir de él.
Los contenedores se pueden iniciar, detener, confirmar y terminar. Si finaliza un contenedor sin confirmarlo, se perderán todos los cambios del contenedor.
Idealmente, los contenedores se tratan como objetos inmutables y no se recomienda realizar cambios en un contenedor en ejecución. En su lugar, realice cambios en un contenedor en ejecución solo con fines de prueba.
Se pueden vincular dos o más contenedores para formar una arquitectura de aplicación en niveles. Sin embargo, alojar aplicaciones altamente escalables con Docker se ha simplificado con la llegada de herramientas de orquestación de contenedores como kubernetes.
Evolución de los Contenedores
Si cree que la contenedorización es una nueva tecnología, no lo es. Google ha estado usando su tecnología de contenedores en su infraestructura durante años.
El concepto de contenedores comenzó en la década de 2000. De hecho, las raíces se remontan a 1979 cuando teníamos chroot, un concepto de cambiar el directorio raíz de un proceso.
Aquí hay una lista de proyectos basados en contenedores que comenzaron en 2000.
Año | Tecnología |
2000 | Las cárceles de FreeBSD introdujeron el concepto de contenedor. |
2003 | Proyecto de servidor Linux-V lanzado con el concepto de virtualización a nivel de sistema operativo |
2005 | Solaris Zones:se presenta el proyecto de virtualización a nivel de sistema operativo |
2007 | Google publicó un documento sobre contenedores de procesos genéricos |
2008 | Lanzamiento inicial de contenedores LXC |
2011 | cloudfoundry anunció alcaide |
2013 | lcmcty:código abierto de Google |
2013 | El proyecto Docker fue anunciado por DotCloud |
2014 | Cohete. (rkt) anunciado por CoreOS |
2016 | Vista previa del contenedor de Windows como parte del servidor de Windows 2016 |