Entendiendo Docker

He estado usando Docker durante varios meses para estructurar el proceso de desarrollo/entrega de proyectos web. Ofrezco a los lectores de Habrakhabr una traducción del artículo introductorio sobre Docker: "Entendiendo la ventana acoplable".

¿Qué es la ventana acoplable?

Docker es una plataforma abierta para desarrollar, entregar y operar aplicaciones. Docker está diseñado para entregar sus aplicaciones más rápido. Con Docker, puede desacoplar su aplicación de su infraestructura y tratar la infraestructura como una aplicación administrada. Docker lo ayuda a enviar su código más rápido, realizar pruebas más rápido, enviar aplicaciones más rápido y reducir el tiempo entre la escritura del código y su ejecución. Docker hace esto a través de una plataforma liviana de virtualización de contenedores, utilizando procesos y utilidades que lo ayudan a administrar y alojar sus aplicaciones.

En esencia, Docker le permite ejecutar casi cualquier aplicación, aislada de forma segura en un contenedor. El aislamiento seguro le permite ejecutar muchos contenedores en el mismo host al mismo tiempo. La naturaleza liviana del contenedor, que se ejecuta sin la carga adicional de un hipervisor, le permite aprovechar al máximo su hardware.

La plataforma y las herramientas de virtualización de contenedores pueden resultar útiles en los siguientes casos:

  • empaquetar su aplicación (y los componentes que utiliza) en contenedores acoplables;
  • distribución y entrega de estos contenedores a sus equipos para su desarrollo y prueba;
  • Disponiendo estos contenedores en sus sitios de producción, tanto en centros de datos como en las nubes.

¿Para qué puedo usar Docker?

Publica rápidamente tus aplicaciones

Docker es excelente para organizar el ciclo de desarrollo. Docker permite a los desarrolladores ejecutar contenedores locales con aplicaciones y servicios. Lo que posteriormente le permite integrarse con el proceso de flujo de trabajo de integración e implementación continua.

Por ejemplo, sus desarrolladores escriben código localmente y comparten su pila de desarrollo (un conjunto de imágenes de Docker) con colegas. Cuando están listos, envían el código y los contenedores al sitio de prueba y ejecutan las pruebas necesarias. Desde el sitio de prueba, pueden enviar código e imágenes a producción.

Disposición y despliegue más fáciles

La plataforma acoplable basada en contenedores facilita la portabilidad de su carga útil. Los contenedores Docker pueden ejecutarse en su máquina local, ya sea real o en una máquina virtual en un centro de datos, o en la nube.

La portabilidad y la naturaleza liviana de Docker facilitan la administración dinámica de su carga de trabajo. Puede utilizar Docker para implementar o cerrar su aplicación o servicios. La velocidad de Docker permite que esto se haga casi en tiempo real.

Cargas más altas y más cargas útiles

Docker es ligero y rápido. Proporciona una alternativa resistente y rentable a las máquinas virtuales basadas en hipervisor. Es especialmente útil en entornos de alta carga, por ejemplo, al crear su propia nube o plataforma como servicio. Pero también es útil para aplicaciones pequeñas y medianas cuando quieres sacar más provecho de los recursos que tienes.

Componentes principales de Docker

Docker consta de dos componentes principales:

  • Docker: una plataforma de virtualización de código abierto;
  • Docker Hub: nuestra plataforma como servicio para distribuir y gestionar contenedores Docker.

¡Nota! Docker se distribuye bajo la licencia Apache 2.0.

Arquitectura acoplable

Docker utiliza una arquitectura cliente-servidor. El cliente Docker se comunica con el demonio Docker, que asume la carga de crear, ejecutar y distribuir sus contenedores. Tanto el cliente como el servidor pueden ejecutarse en el mismo sistema, puede conectar el cliente a un demonio acoplable remoto. El cliente y el servidor se comunican a través de un socket o una API RESTful.

Entendiendo Docker

demonio acoplable

Como se muestra en el diagrama, el demonio se ejecuta en la máquina host. El usuario no interactúa directamente con el servidor, sino que utiliza para ello el cliente.

cliente acoplable

El cliente Docker, el programa Docker, es la interfaz principal de Docker. Recibe comandos del usuario e interactúa con el demonio acoplable.

Ventana acoplable interior

Para comprender en qué consiste Docker, necesita conocer tres componentes:

  • imágenes
  • registro
  • contenedores

Imágenes

La imagen de Docker es una plantilla de solo lectura. Por ejemplo, la imagen puede contener el sistema operativo Ubuntu con Apache y una aplicación. Las imágenes se utilizan para crear contenedores. Docker facilita la creación de nuevas imágenes, la actualización de las existentes o la descarga de imágenes creadas por otras personas. Las imágenes son componentes de una compilación de Docker.

Registro

El registro de Docker almacena imágenes. Existen registros públicos y privados desde los cuales se pueden descargar o cargar imágenes. Un registro público de Docker es Centro acoplable. Hay una enorme colección de imágenes almacenadas allí. Como sabes, las imágenes las puedes crear tú mismo o puedes utilizar imágenes creadas por otros. Los registros son un componente de distribución.

contenedores

Los contenedores son similares a los directorios. Los contenedores contienen todo lo que la aplicación necesita para ejecutarse. Cada contenedor se crea a partir de una imagen. Los contenedores se pueden crear, iniciar, detener, migrar o eliminar. Cada contenedor está aislado y proporciona una plataforma segura para la aplicación. Los contenedores son componentes de la obra.

Entonces, ¿cómo funciona Docker?

Hasta ahora sabemos que:

  • podemos crear imágenes en las que se ubican nuestras aplicaciones;
  • podemos crear contenedores a partir de imágenes para ejecutar aplicaciones;
  • Podemos distribuir imágenes a través de Docker Hub u otro registro de imágenes.

Veamos cómo encajan estos componentes.

¿Cómo funciona la imagen?

Ya sabemos que una imagen es una plantilla de solo lectura a partir de la cual se crea un contenedor. Cada imagen consta de un conjunto de niveles. Usos de Docker sistema de archivos de unión para combinar estos niveles en una sola imagen. El sistema de archivos Union permite que archivos y directorios de diferentes sistemas de archivos (diferentes ramas) se superpongan de forma transparente, creando un sistema de archivos coherente.

Una de las razones por las que Docker es liviano es porque usa capas como esta. Cuando cambia la imagen, como al actualizar una aplicación, se crea una nueva capa. Entonces, sin reemplazar toda la imagen ni reconstruirla, como podría tener que hacer con una máquina virtual, solo se agrega o actualiza la capa. Y no es necesario distribuir toda la nueva imagen, solo se distribuye la actualización, lo que hace que la distribución de imágenes sea más fácil y rápida.

En el corazón de cada imagen hay una imagen básica. Por ejemplo, ubuntu, la imagen base de Ubuntu, o fedora, la imagen base de la distribución Fedora. También puede utilizar imágenes como base para crear nuevas imágenes. Por ejemplo, si tiene una imagen de Apache, puede usarla como imagen base para sus aplicaciones web.

¡Nota! Docker normalmente extrae imágenes del registro de Docker Hub.

Las imágenes de Docker se pueden crear a partir de estas imágenes base; llamamos instrucciones a los pasos para crear estas imágenes. Cada instrucción crea una nueva imagen o nivel. Las instrucciones serán las siguientes:

  • ejecutar comando
  • agregar un archivo o directorio
  • creando una variable de entorno
  • instrucciones sobre qué ejecutar cuando se inicia el contenedor de esta imagen

Estas instrucciones se almacenan en un archivo. Dockerfile. Docker lee esto Dockerfile, cuando construyes la imagen, ejecuta estas instrucciones y devuelve la imagen final.

¿Cómo funciona el registro de Docker?

El registro es un depósito de imágenes de Docker. Una vez creada la imagen, puede publicarla en el registro público de Docker Hub o en su registro personal.

Con el cliente Docker, puede buscar imágenes ya publicadas y descargarlas en su máquina Docker para crear contenedores.

Docker Hub proporciona repositorios de imágenes públicos y privados. La búsqueda y descarga de imágenes de repositorios públicos está disponible para todos. Los contenidos de los almacenamientos privados no se incluyen en los resultados de la búsqueda. Y sólo usted y sus usuarios pueden recibir estas imágenes y crear contenedores a partir de ellas.

¿Cómo funciona un contenedor?

Un contenedor consta de un sistema operativo, archivos de usuario y metadatos. Como sabemos, cada contenedor se crea a partir de una imagen. Esta imagen le dice a Docker qué hay en el contenedor, qué proceso iniciar, cuándo se inicia el contenedor y otros datos de configuración. La imagen de Docker es de solo lectura. Cuando Docker inicia un contenedor, crea una capa de lectura/escritura encima de la imagen (usando el sistema de archivos de unión como se indicó anteriormente) en la que se puede ejecutar la aplicación.

¿Qué sucede cuando comienza el contenedor?

O usando el programa docker, o utilizando la API RESTful, el cliente de Docker le dice al demonio de Docker que inicie el contenedor.

$ sudo docker run -i -t ubuntu /bin/bash

Echemos un vistazo a este comando. El cliente se inicia usando el comando docker, con opción run, que dice que se lanzará un nuevo contenedor. Los requisitos mínimos para ejecutar un contenedor son los siguientes atributos:

  • qué imagen usar para crear el contenedor. En nuestro caso ubuntu
  • el comando que desea ejecutar cuando se inicia el contenedor. En nuestro caso /bin/bash

¿Qué sucede bajo el capó cuando ejecutamos este comando?

Docker, en orden, hace lo siguiente:

  • descarga la imagen de ubuntu: Docker comprueba la disponibilidad de la imagen. ubuntu en la máquina local y, si no está allí, descárguelo desde Centro acoplable. Si hay una imagen, la usa para crear un contenedor;
  • crea un contenedor: cuando se recibe la imagen, Docker la usa para crear un contenedor;
  • inicializa el sistema de archivos y monta el nivel de solo lectura: el contenedor se crea en el sistema de archivos y la imagen se agrega al nivel de solo lectura;
  • inicializa la red/puente: crea una interfaz de red que permite que Docker se comunique con la máquina host;
  • Configuración de la dirección IP: busca y establece la dirección;
  • Inicia el proceso especificado: lanza su aplicación;
  • Procesa y produce resultados de su aplicación: conecta y registra la entrada, salida y flujo de errores estándar de su aplicación para que pueda realizar un seguimiento del rendimiento de su aplicación.

Ahora tienes un contenedor funcional. Puede administrar su contenedor, interactuar con su aplicación. Cuando decida detener la aplicación, elimine el contenedor.

Tecnologías utilizadas

Docker está escrito en Go y utiliza algunas características del kernel de Linux para implementar la funcionalidad anterior.

Espacios de nombres

Docker usa tecnología namespaces para organizar espacios de trabajo aislados, que llamamos contenedores. Cuando iniciamos un contenedor, Docker crea un conjunto de espacios de nombres para ese contenedor.

Esto crea una capa aislada, en la que cada aspecto del contenedor se ejecuta en su propio espacio de nombres y no tiene acceso al sistema externo.

Lista de algunos espacios de nombres que utiliza Docker:

  • pid: aislar el proceso;
  • red: para gestionar interfaces de red;
  • ipc: para gestionar los recursos del IPC. (ICP: Comunicación InterProcesos);
  • monte: gestionar puntos de montaje;
  • UTC: para aislar el kernel y controlar la generación de versiones (UTC: sistema de tiempo compartido Unix).

Grupos de control

Docker también usa tecnología cgroups o grupos de control. La clave para ejecutar una aplicación de forma aislada es proporcionarle solo los recursos que desea proporcionar. Esto asegura que los contenedores serán buenos vecinos. Los grupos de control le permiten compartir recursos de hardware disponibles y, si es necesario, establecer límites y restricciones. Por ejemplo, limite la posible cantidad de memoria para el contenedor.

Sistema de archivos de la unión

Union File Sysem o UnionFS es un sistema de archivos que funciona creando capas, lo que lo hace muy ligero y rápido. Docker usa UnionFS para crear los bloques a partir de los cuales se construye el contenedor. Docker puede utilizar varias variantes de UnionFS, incluidas: AUFS, btrfs, vfs y DeviceMapper.

Formatos de contenedor

Docker combina estos componentes en un contenedor que llamamos formato contenedor. El formato predeterminado se llama libcontainer. Docker también admite el formato de contenedor tradicional en Linux usando LXC. En el futuro, Docker puede admitir otros formatos de contenedores. Por ejemplo, integrarse con BSD Jails o Solaris Zones.

Fuente: habr.com

Añadir un comentario