¿Qué es Docker? ¿Cómo funciona?

Docker se ha convertido en el estándar de facto cuando se trata de implementaciones basadas en contenedores. Desde implementaciones a pequeña escala hasta aplicaciones empresariales de gran escala, Docker sirve como base para la orquestación basada en contenedores.

Docker ganó tanta popularidad y adopción en la comunidad DevOps en poco tiempo debido a la forma en que se desarrolló para la portabilidad y se diseñó para la arquitectura de microservicios moderna.

En este blog aprenderás,

  • Evolución de los contenedores y el concepto subyacente de contenedores de Linux
  • Qué es realmente un contenedor y qué características de Linux lo hacen funcionar.
  • La diferencia entre un proceso, un contenedor y una VM
  • Obtendrás información sobre Docker y comprobarás por qué Docker es muy útil y diferente de otras tecnologías de contenedores.
  • Arquitectura central de Docker y sus componentes claves.

La idea aquí es entender bien los conceptos básicos para que comprendas qué es realmente Docker y cómo funciona.

Evolución de los contenedores

Si cree que la contenedorización es una tecnología nueva, no lo es. Google ha estado utilizando su propia tecnología de contenedores en su infraestructura durante años.

El concepto de contenedores se remonta a 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 Technology
2000 FreeBSD jails introduced the container concept.
2003 Linux-V server project released with the concept of OS-level virtualization
2005 Solaris Zones– OS-level virtualization project introduced
2007 Google released a paper on Generic Process Containers
2008 The initial release of LXC containers
2011 cloudfoundry announced warden
2013 lcmcty– Open-sourced by Google
2013 Docker project was announced by DotCloud
2014 Rocket. (rkt) announced by CoreOS
2016 Windows container preview as releases as part of Windows server 2016

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

Antes de sumergirse directamente en los conceptos de Docker, primero debe comprender 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 utilizando un hipervisor como Xen, Hyper-V, etc.

Los contenedores, por otro lado, se ejecutan sobre el kernel de los sistemas operativos. Puede llamarse virtualización a nivel de sistema operativo. Antes de entrar en los conceptos de contenedor subyacentes, debe comprender dos conceptos clave de Linux.

  1. Userspace: Todo el código que se requiere 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 Kernel.
  2. Kernel Space: este es el corazón del sistema operativo, donde tiene el código del kernel que interactúa con el hardware del sistema, el almacenamiento, etc.

Un contenedor es un proceso

Cuando inicia una aplicación, por ejemplo, un servidor web Nginx, en realidad está iniciando un proceso. Un proceso en sí mismo es una instrucción autónoma con aislamiento limitado.

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

Un contenedor es básicamente un proceso con suficiente aislamiento de los componentes del espacio de usuario para que dé la sensación de un sistema operativo independiente.

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

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

Image Src: https://www.nginx.com

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

Les 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.

¿Eso significa que un contenedor tiene todo el sistema operativo?

No. A diferencia de una máquina virtual con su propio kernel, un contenedor solo contiene los archivos necesarios relacionados con una distribución específica y usa el kernel de 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 para todas las distribuciones de Linux, solo el espacio de usuario es diferente y el espacio del kernel es el mismo.

 

Concepto subyacente de contenedores de Linux

La siguiente imagen ofrece una representación visual de los contenedores de Linux.

Los contenedores se aíslan en un host mediante 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 tiene visibilidad de otras casas a menos que le permitan entrar.

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

 

Linux Namespaces

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 propio sistema de archivos, dirección IP, puntos de montaje, ID de proceso, etc. Puede lograr esto usando los espacios de nombres de Linux.

Los espacios de nombres son responsables de que los contenedores tengan sus propios puntos de montaje, usuario, dirección IP, gestión de procesos, etc. Esencialmente establece límites para los contenedores.

A continuación se muestran los espacios de nombres clave en Linux

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

Al usar estos espacios de nombres, un contenedor puede tener sus propias interfaces de red, dirección IP, etc. Cada contenedor tendrá su propio 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 el comando lsns.

Linux Control groups

Cuando iniciamos un servicio, no especificamos ningún límite de memoria o CPU. Dejamos que el kernel priorice y asigne recursos para los servicios.

Sin embargo, puede establecer explícitamente límites de memoria y CPU para sus servicios utilizando una función del kernel de Linux llamada CGroups. No es un enfoque sencillo, necesita hacer 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 recursos utilizados por un contenedor son administrados por grupos de control de Linux. Puede restringir la CPU, la memoria, la red y los recursos de E / S de un contenedor de grupos de control de Linux.

Entonces, ¿Qué sucede si no limitó el recurso de CPU y memoria de un contenedor?

Bueno, un solo contenedor podría terminar usando todos los recursos del host, dejando que otros contenedores se bloqueen debido a la falta de disponibilidad de recursos.

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

¿Qué es Docker?

Docker es un popular proyecto de código abierto escrito en go y desarrollado por Dotcloud (una empresa de PaaS).

Básicamente es un motor de contenedores que utiliza las características del Kernel de Linux como espacios de nombres y grupos de control para crear contenedores en la parte superior de un sistema operativo.

Es decir, todos los conceptos y funcionalidades de contenedores que aprendimos en la sección LXC están hechos de manera muy simple por Docker. Con solo ejecutar algunos comandos y parámetros de Docker, tendremos contenedores en funcionamiento.

Podría preguntar en qué se diferencia Docker de un contenedor de Linux (LXC), ya que todos los conceptos y la implementación son similares.

Docker se construyó inicialmente sobre contenedores de Linux (LXC). Más tarde, Docker reemplazó LXC con su propio contenedor libcontainer en tiempo de ejecución (ahora parte de runc)

Bueno, además de ser una tecnología de contenedores, Docker tiene componentes de envoltura bien definidos que facilitan las aplicaciones de empaque. Antes de Docker, no era fácil ejecutar contenedores. Es decir, hace todo el trabajo para desacoplar su aplicación de la infraestructura al empaquetar todos los requisitos del sistema de 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 empaqueta un contenedor con las aplicaciones requeridas usando Docker, puede ejecutarlo en cualquier otro host que tenga Docker instalado.

Diferencias entre Docker & Container

Docker es una tecnología o herramienta desarrollada para gestionar implementaciones de contenedores de manera eficiente.

Entonces, ¿puedo ejecutar un contenedor sin Docker?

¡Sí! por supuesto. puede utilizar la tecnología LXC para ejecutar contenedores en servidores Linux.

Cuestiones a saber sobre Docker:

  1. 1. Docker no es LXC
  2. 2. Docker no es una solución de máquina virtual.
  3. 3. Docker no es un sistema de administración de configuración y no reemplaza a chef, puppet, Ansible, etc.
  4. 4. Docker no es una plataforma como tecnología de servicio.

 

¿Qué hace tan bueno a Docker?

Docker tiene un flujo de trabajo eficiente para mover la aplicación desde la computadora portátil del desarrollador al entorno de prueba a la producción. Comprenderá más al respecto cuando observe un ejemplo práctico de empaquetado de 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 kernel de Linux para Windows. Puede leer sobre 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. Siempre que se realicen cambios en un contenedor, solo los cambios se escribirán en el disco utilizando el modelo de copia en 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 sobre Docker. Puedes ver que es un tema explosivo durante los últimos cinco años.

Aquí hay un resultado de la encuesta de Datadog que muestra el aumento en la adopción de Docker.

source: datadog.com

Arquitectura principal de Docker 

En las siguientes secciones, veremos 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 inicio. Cuando se publicó este artículo por primera vez, Docker se construyó sobre LXC

A continuación, se muestran algunos cambios arquitectónicos notables que se produjeron en Docker.

  1. Docker pasó de LXC a libcontainer en 2014
  2. runc – una CLI para girar contenedores que siguen todas las especificaciones de OCI.
  3. containerd – Docker separó su componente de administración de contenedores para contenerlo en 2016

OCI: Open Container Initiative es un estándar industrial abierto para el tiempo de ejecución y las especificaciones de contenedores.

Cuando se lanzó inicialmente Docker, tenía una arquitectura monolítica. Ahora se divide en los siguientes tres componentes diferentes.

  • Docker Engine (dockerd)
  • docker-containerd (containerd)
  • docker-runc (runc)

Docker y otras grandes organizaciones decidieron contribuir a un tiempo de ejecución y capaz de administración de contenedores comunes. Por lo tanto, containerd y runc ahora son parte de Cloud Native Foundation con colaboradores de todas las organizaciones.

Nota: Al instalar Docker, se instalan todos estos componentes. No es necesario que lo instale por separado. Para ejemplificar, lo estamos mostrando como diferentes componentes.

Ahora echemos un vistazo a cada componente de Docker.

Docker Engine

El motor de Docker está compuesto por el demonio de Docker, una interfaz API y la CLI de Docker. Acoplable daemon (dockerd) funciona continuamente como servicio de dockerd systemd. Es responsable de construir las imágenes de la ventana acoplable.

Para administrar imágenes y ejecutar contenedores, dockerd llama a las API de contenedor de docker.

docker-containerd (containerd)

es otro servicio daemon del sistema que se encarga de descargar las imágenes de la ventana acoplable y ejecutarlas como un contenedor. Expone su API para recibir instrucciones del servicio dockerd

docker-runc

runc es el tiempo de ejecución del contenedor, que es 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.

¿Cómo funciona Docker?

Hemos visto los componentes principales de Docker. Pero para construir, enviar, compartir y ejecutar contenedores Docker, hay otros componentes involucrados.

Veamos los componentes clave de Docker en un ecosistema de Docker.

Componentes de Docker 

Docker está compuesto por los siguientes elementos

  • Docker Daemon (dockerd)
  • Docker Client
  • Docker Images
  • Docker Registries
  • Docker Containers

Aquí está el diagrama oficial de la arquitectura de Docker de alto nivel que muestra el flujo de trabajo común de Docker.

image source: docs.docker.com

Docker Daemon

Docker tiene una arquitectura cliente-servidor. Docker Daemon (dockerd) o servidor es responsable de todas las acciones relacionadas con los contenedores.

El demonio recibe los comandos del cliente Docker a través de CLI o API REST. El cliente de Docker puede estar en el mismo host que un demonio o puede estar presente en cualquier otro host.

De forma predeterminada, el dockerd escucha el socket UNIX docker.sock. Si tiene algún caso de uso para acceder a la API de Docker de forma remota, debe exponerlo a través de un puerto de host. Uno de esos casos de uso es ejecutar a Docker como agente de Jenkins.

Si desea ejecutar la ventana acoplable dentro de la ventana acoplable, puede usar docker.sock desde la máquina host.

Docker Imagen

Las imágenes son los componentes básicos de Docker. Necesita una imagen para ejecutar un contenedor Docker. Las imágenes contienen 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 de Docker con el binario Nginx y todas las bibliotecas del sistema operativo necesarias para ejecutar Nginx.

Docker tiene un concepto de Dockerfile que se utiliza para crear la imagen. Un Dockerfile básicamente es un archivo de texto que contiene un comando (instrucciones) por línea.

Aquí hay un ejemplo de un Dockerfile.

Una imagen de la ventana acoplable se organiza en capas. A cada instrucción en un Dockerfile se le agrega 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 se puede usar una imagen base de Ubuntu y crear otra imagen con la aplicación Nginx en ella. 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 saber más al respecto.

Podría preguntar ¿de dónde proviene esta imagen base (imagen principal)? Hay utilidades de la ventana acoplable para crear la imagen base principal inicial. Básicamente, toma las bibliotecas del sistema operativo necesarias y las convierte en una imagen base. No tiene que hacer esto porque obtendrá las imágenes base oficiales para todas las distribuciones de Linux.

El contenedor en ejecución puede escribir y utilizar la capa superior de una imagen. Otras capas de la imagen son de solo lectura.

Docker regist

Es un repositorio de imágenes de Docker. Con el registro de Docker, puede compartir imágenes. Actúa como un repositorio central para las imágenes de Docker.

Un registro puede ser público o privado. 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.

Si su repositorio es público, otros usuarios de Docker Hub pueden acceder a todas sus imágenes. También puede crear un registro privado en Docker Hub.

El hub de Docker actúa como git, donde puede crear sus imágenes localmente en su computadora portátil, enviarlas y luego enviarlas al hub de Docker.

Sugerencia: cuando utilice la ventana acoplable en proyectos o redes empresariales, configure sus propios registros de ventana acoplable en lugar de utilizar el concentrador de ventana acoplable público. Todos los proveedores de la nube tienen sus propios servicios de registro de contenedores.

Docker Container

Es el entorno de ejecución de Docker. Los contenedores se crean a partir de imágenes. Es una capa de la imagen que se puede escribir.

Si intenta relacionar capas de imagen y un contenedor, así es como busca una imagen basada en ubuntu.source: docs.docker.com

Puede empaquetar sus aplicaciones en un contenedor, confirmarlo y convertirlo en una imagen de oro para construir más contenedores a partir de él.

Los contenedores se pueden iniciar, detener, confirmar y terminar. Si cancela un contenedor sin confirmarlo, se perderán todos los cambios de contenedor.

Idealmente, los contenedores se tratan como objetos inmutables y no se recomienda realizar cambios en un contenedor en ejecución. 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 por niveles. Sin embargo, el alojamiento de aplicaciones altamente escalables con Docker se ha simplificado con la llegada de herramientas de orquestación de contenedores como Kubernetes. 

¿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 recursos

  1. 1. Puede utilizar máquinas virtuales para ejecutar sus aplicaciones de forma independiente, lo que significa un servicio por máquina virtual. Pero aún puede estar 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. 2. Los contenedores, por otro lado, pueden ejecutarse con requisitos mínimos de CPU y memoria. Además, incluso puede ejecutar varios contenedores dentro de una máquina virtual 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 desplegar un contenedor en segundos y revertirlo también en segundos.

Drift Management

  1. Drift management en las máquinas virtuales no es fácil. Debe tener una automatización y un proceso completos para asegurarse de que todos los entornos sean similares. Seguir modelos de implementación inmutables evita la deriva en los entornos de VM.
  2. Cuando se trata de contenedores, una vez que la imagen sea respaldada, será la misma en todos los entornos. Para cualquier cambio, debe comenzar a realizar cambios en dev env y volver a hornear la imagen del contenedor.

FAQs

¿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 Docker y el daemon Docker?

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

Conclusión

La mejor característica de Docker es la colaboración.

Las imágenes de Docker se pueden enviar a un repositorio y se pueden descargar a cualquier otro host para ejecutar contenedores desde esa imagen.

Además, Docker Hub tiene miles de imágenes creadas por los usuarios, y puede transferir esas imágenes a sus hosts en función de los requisitos de su aplicación. Además, se utiliza principalmente en herramientas de orquestación de contenedores como kubernetes.

Si desea ejecutar Docker para cargas de trabajo de producción, asegúrese de seguir las prácticas recomendadas de las imágenes de Docker.

Puede comenzar instalando Docker y ejecutar las operaciones básicas.

 

Tomado de: https://devopscube.com/what-is-docker/

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Top