GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

¿Qué es Docker? ¿Como funciona?

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,

  1. ¿Qué es Docker?
  2. Obtenga más información sobre Docker y vea por qué Docker es beneficioso y diferente de otras tecnologías de contenedores.
  3. Arquitectura central de Docker y sus componentes clave
  4. Evolución de los contenedores y el concepto subyacente de los contenedores de Linux
  5. ¿Qué es un contenedor y qué características de Linux hacen que funcione?
  6. 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:

  1. Docker no es LXC
  2. Docker no es una solución de máquina virtual.
  3. Docker no es un sistema de administración de configuración y no reemplaza a Chef, Puppet, Ansible, etc.
  4. Docker no es una plataforma como tecnología de servicio.
  5. 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

  1. Docker pasó de LXC a libcontainer en 2014
  2. runc:una CLI para activar contenedores que siguen todas las especificaciones de OCI.
  3. 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.

  1. Motor Docker (dockerd)
  2. docker-containerd (contenedor)
  3. 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

  1. Demonio Docker (dockerd)
  2. Cliente Docker
  3. Imágenes acoplables
  4. Registros de Docker
  5. 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.

¿Qué es un contenedor de Linux (LXC)?

Ahora comprendamos qué es un contenedor de Linux.

En un entorno virtualizado típico, una o más máquinas virtuales se ejecutan sobre un servidor físico mediante un hipervisor como Xen, Hyper-V, etc.

Por otro lado, los contenedores se ejecutan sobre el núcleo del sistema operativo. Puede llamarlo virtualización a nivel de sistema operativo. Antes de adentrarse en los conceptos subyacentes del contenedor, debe comprender dos conceptos clave de Linux.

  1. Espacio de usuario: Todo el código necesario para ejecutar programas de usuario (aplicaciones, procesos) se denomina espacio de usuario. Cuando inicia una acción de programa, por ejemplo, para crear un archivo, el proceso en el espacio de usuario realiza una llamada del sistema al espacio Kernal.
  2. Espacio del núcleo :Este es el corazón del sistema operativo, donde se encuentra el código del núcleo, que interactúa con el hardware del sistema, el almacenamiento, etc.

Un contenedor es un Proceso.

Inicia un proceso cuando inicia una aplicación, por ejemplo, un servidor web Nginx. Un proceso en sí mismo es una instrucción independiente con aislamiento limitado.

¿Qué pasa si podemos aislar el proceso con solo los archivos y la configuración necesarios para ejecutar y operar? Eso es lo que hace un contenedor.

Un contenedor es un proceso con suficiente aislamiento de los componentes del espacio de usuario para dar la sensación de un sistema operativo separado.

El proceso contenedor principal puede tener un proceso secundario. Entonces puedes decir que un contenedor es también un grupo de procesos .

Por ejemplo, cuando inicia un servicio Nginx, inicia un proceso Nginx principal. El proceso principal abarca sus procesos secundarios, como el administrador de caché, el cargador de caché y los trabajadores.

Entonces, cuando inicia un contenedor Nginx, está iniciando un proceso Nginx maestro en su entorno aislado.

Te mostraré esto prácticamente en las siguientes secciones.

Cada contenedor tiene su espacio de usuario aislado y puede ejecutar varios contenedores en un solo host.

¿Significa eso que un contenedor tiene todo el sistema operativo ?

No. A diferencia de una máquina virtual con su kernel, un contenedor contiene los archivos necesarios relacionados con una distribución específica y utiliza el kernel del host compartido.

Más interesante aún, puede ejecutar diferentes contenedores basados ​​en distribuciones de Linux en un solo host que comparte el mismo espacio del kernel.

Por ejemplo, puede ejecutar RHEL, CentOS, un contenedor basado en SUSE en un servidor Ubuntu. Es posible porque solo el espacio de usuario es diferente para todas las distribuciones de Linux y el espacio del kernel es el mismo.

Concepto subyacente de los contenedores de Linux

La siguiente imagen le brinda una representación visual de los continentes de Linux.

Los contenedores se aíslan utilizando las dos funciones del kernel de Linux denominadas espacios de nombres y grupos de control.

Una analogía del mundo real sería un edificio de apartamentos. Aunque es un solo edificio grande, cada condominio/apartamento está aislado para hogares individuales que tienen su propia identidad con agua, gas y electricidad medidos. Utilizamos hormigón, estructuras de acero y otros materiales de construcción para establecer este aislamiento. No tienes visibilidad de otras casas a menos que te permitan entrar.

Del mismo modo, puede relacionar esto con un solo host que contiene varios contenedores. Para aislar contenedores con su CPU, memoria, dirección IP, puntos de montaje, procesos, necesita dos características del kernel de Linux llamados espacios de nombres y grupos de control.

Espacio de nombres de Linux

Un contenedor se trata de tener un entorno bien aislado para ejecutar un servicio (Proceso). Para lograr ese nivel de aislamiento, un contenedor debe tener su sistema de archivos, dirección IP, puntos de montaje, ID de proceso, etc. Puede lograr esto utilizando los espacios de nombres de Linux.

Los espacios de nombres son responsables de los puntos de montaje, el usuario, la dirección IP, la gestión de procesos, etc. de los contenedores. Básicamente, establece límites para los contenedores.

Los siguientes son los espacios de nombres clave en Linux

  1. espacio de nombres pid :Responsable de aislar el proceso (PID:Process ID).
  2. espacio de nombres de red :Gestiona las interfaces de red (NET:Networking).
  3. espacio de nombres ipc :Gestiona el acceso a los recursos de IPC (IPC:InterProcess Communication).
  4. espacio de nombres mnt :Responsable de administrar los puntos de montaje del sistema de archivos (MNT:Mount).
  5. espacio de nombres uts :Aísla los identificadores de kernel y versión. (UTS:Sistema de tiempo compartido Unix).
  6. espacio de nombres usr: Aísla los ID de usuario. En palabras simples, aísla las identificaciones de usuario entre el host y el contenedor.
  7. espacio de nombres Cgroup: Aísla la información del grupo de control del proceso contenedor

Usando los espacios de nombres anteriores, un contenedor puede tener sus interfaces de red, dirección IP, etc. Cada contenedor tendrá su espacio de nombres y los procesos que se ejecutan dentro de ese espacio de nombres no tendrán ningún privilegio fuera de su espacio de nombres.

Curiosamente, puede enumerar los espacios de nombres en una máquina Linux usando lsns comando.

Grupos de control de Linux

No especificamos ningún límite de memoria o CPU al iniciar un servicio. En su lugar, dejamos que el kernel priorice y asigne recursos para los servicios.

Sin embargo, puede establecer explícitamente límites de memoria de CPU para sus servicios utilizando una característica del kernel de Linux llamada CGroups . No es un enfoque directo; necesita realizar algunas configuraciones y ajustes adicionales para que funcione.

Dado que puede ejecutar varios contenedores dentro de un host, debe haber un mecanismo para limitar el uso de recursos, el acceso a dispositivos, etc. Aquí es donde los grupos de control entran en escena.

Los grupos de control de Linux administran los recursos utilizados por un contenedor. Puede restringir los recursos de CPU, memoria, red y E/S de un grupo de control contenedor de Linux.

Entonces, ¿qué sucede si no limito el recurso de CPU y memoria de un contenedor?

Un solo contenedor puede usar todos los recursos del host, lo que hace que otros contenedores se bloqueen debido a la falta de disponibilidad de los recursos.

Herramientas como Docker abstraen todas las configuraciones complejas de back-end y le permiten especificar estos límites de recursos con parámetros simples.

¿Por qué los contenedores son mejores que las máquinas virtuales?

Los contenedores tienen algunas ventajas clave sobre las máquinas virtuales. Echemos un vistazo a esos.

Utilización y costo de los recursos

  1. Puede usar máquinas virtuales para ejecutar sus aplicaciones de forma independiente, lo que significa un servicio por máquina virtual. Pero todavía puede ser infrautilizado. Y cambiar el tamaño de una máquina virtual no es una tarea fácil para una aplicación de producción.
  2. Por otro lado, los contenedores pueden ejecutarse con requisitos mínimos de CPU y memoria. Además, incluso puede ejecutar varios contenedores dentro de una VM para la segregación de aplicaciones. Además, cambiar el tamaño de un contenedor lleva unos segundos.

Aprovisionamiento e implementación

  1. El aprovisionamiento de una máquina virtual y la implementación de aplicaciones en ella puede llevar de minutos a horas, según el flujo de trabajo involucrado. Incluso la reversión lleva tiempo.
  2. Pero puede implementar un contenedor en segundos y revertirlo también en segundos.

Gestión de deriva

  1. La gestión de derivas en máquinas virtuales no es fácil. Debe tener una automatización y procesos completos para garantizar que todos los entornos sean similares. Seguir modelos de implementación inmutables evita la desviación en los entornos de VM.
  2. Una vez que se respalda la imagen, será la misma en todos los entornos para contenedores. Entonces, para cualquier cambio, debe comenzar a realizar cambios en dev env y volver a hornear la imagen del contenedor.

Preguntas frecuentes sobre Docker

¿Cuál es la diferencia entre containerd y runc?

containerd es responsable de administrar el contenedor y runc es responsable de ejecutar los contenedores (crear espacios de nombres, cgroups y ejecutar comandos dentro del contenedor) con las entradas de containerd

¿Cuál es la diferencia entre el motor de Docker y el demonio de Docker?

El motor de Docker está compuesto por el demonio de Docker, la interfaz de descanso y la CLI de Docker. El demonio de Docker es el servicio de systemd dockerd responsable de crear las imágenes de docker y enviar las instrucciones de docker al tiempo de ejecución de containerd.


Docker
  1. ¿Qué es un Makefile y cómo funciona?

  2. ¿Qué es NGINX? ¿Como funciona?

  3. ¿Qué es un servidor web y cómo funciona un servidor web?

  4. ¿Qué es containerd y cómo se relaciona con Docker y Kubernetes?

  5. Cómo usar SSH en un contenedor Docker

¿Qué es VDI y cómo funciona?

Aprendizaje de Docker:Cómo crear un contenedor Docker

Cómo ejecutar PHPMyAdmin en un contenedor Docker

Cómo ejecutar Grafana en un contenedor Docker

Cómo configurar un contenedor Apache Docker

¿Cómo funciona un balanceador de carga? ¿Qué es el equilibrio de carga?

    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