Contenedores 101: fundamentos de Docker

Docker comenzó en 2012 como un proyecto de código abierto, originalmente llamado dotcloud, para construir contenedores Linux de una sola aplicación. Desde entonces, Docker se ha convertido en una herramienta de desarrollo inmensamente popular, que se utiliza cada vez más como entorno de ejecución. Pocas tecnologías, si es que hay alguna, han atraído a los desarrolladores tan rápido como Docker.

Una razón por la que Docker es tan popular es que ofrece la promesa de "desarrollar una vez, ejecutar en cualquier lugar". Docker ofrece una forma sencilla de empaquetar una aplicación y sus dependencias de tiempo de ejecución en un solo contenedor; también proporciona una abstracción en tiempo de ejecución que permite que el contenedor se ejecute en diferentes versiones del kernel de Linux.

Con Docker, un desarrollador puede crear una aplicación en contenedor en su estación de trabajo y luego implementar fácilmente el contenedor en cualquier servidor habilitado para Docker. No es necesario volver a probar o ajustar el contenedor para el entorno del servidor, ya sea en la nube o en las instalaciones.

Además, Docker proporciona un mecanismo de distribución y uso compartido de software que permite a los desarrolladores y equipos de operaciones compartir y reutilizar fácilmente el contenido del contenedor. Este mecanismo de distribución, junto con la portabilidad entre máquinas, ayuda a explicar la popularidad de Docker entre los equipos de operaciones y los desarrolladores.  

Componentes de Docker

Docker es tanto una herramienta de desarrollo como un entorno de ejecución. Para comprender Docker, primero debemos comprender el concepto de una imagen de contenedor de Docker. Un contenedor siempre comienza con una imagen y se considera una instanciación de esa imagen. Una imagen es una especificación estática de lo que debe ser el contenedor en tiempo de ejecución, incluido el código de la aplicación dentro del contenedor y la configuración del tiempo de ejecución. Las imágenes de Docker contienen capas de solo lectura, lo que significa que una vez que se crea una imagen, nunca se modifica.

La figura 1 muestra un ejemplo de una imagen de contenedor. Esta imagen muestra una imagen de Ubuntu con una instalación de Apache. La imagen es una composición de tres capas de Ubuntu base más una capa de actualización, con una capa de Apache y una capa de archivo personalizada en la parte superior.

Un contenedor Docker en ejecución es una instanciación de una imagen. Los contenedores derivados de la misma imagen son idénticos entre sí en términos de su código de aplicación y dependencias de tiempo de ejecución. Pero a diferencia de las imágenes, que son de solo lectura, los contenedores en ejecución incluyen una capa de escritura (la capa de contenedor) encima del contenido de solo lectura. Los cambios en tiempo de ejecución, incluidas las escrituras y actualizaciones de datos y archivos, se guardan en la capa contenedora. Por lo tanto, varios contenedores en ejecución simultáneos que comparten la misma imagen subyacente pueden tener capas de contenedor que difieren sustancialmente.

Cuando se elimina un contenedor en ejecución, la capa de contenedor de escritura también se elimina y no persistirá. La única forma de conservar los cambios es mediante un docker commitcomando explícito antes de eliminar el contenedor. Cuando hace a docker commit, el contenido del contenedor en ejecución, incluida la capa de escritura, se escribe en una nueva imagen de contenedor y se almacena en el disco. Esto se convierte en una nueva imagen distinta de la imagen por la que se creó una instancia del contenedor.

Con este docker commitcomando explícito , se puede crear un conjunto sucesivo y discreto de imágenes de Docker, cada una construida sobre la imagen anterior. Además, Docker utiliza una estrategia de copia en escritura para minimizar la huella de almacenamiento de los contenedores y las imágenes que comparten los mismos componentes básicos. Esto ayuda a optimizar el espacio de almacenamiento y minimizar el tiempo de inicio del contenedor.

La figura 2 muestra la diferencia entre una imagen y un contenedor en ejecución. Tenga en cuenta que cada contenedor en ejecución puede tener una capa de escritura diferente.

Más allá del concepto de imagen, Docker tiene algunos componentes específicos que son diferentes a los de los contenedores tradicionales de Linux.

  • Demonio de Docker. También conocido como Docker Engine, el demonio de Docker es una capa delgada entre los contenedores y el kernel de Linux. El demonio de Docker es el entorno de tiempo de ejecución persistente que administra los contenedores de aplicaciones. Cualquier contenedor de Docker puede ejecutarse en cualquier servidor que tenga Docker-daemon habilitado, independientemente del sistema operativo subyacente.
  • Dockerfile. Los desarrolladores usan Dockerfiles para crear imágenes de contenedores, que luego se convierten en la base de los contenedores en ejecución. Un Dockerfile es un documento de texto que contiene toda la información de configuración y los comandos necesarios para ensamblar una imagen de contenedor. Con un Dockerfile, el demonio de Docker puede crear automáticamente una imagen de contenedor. Este proceso simplifica enormemente los pasos para la creación de contenedores.

Más específicamente, en un Dockerfile, primero especifica una imagen base a partir de la cual comienza el proceso de compilación. Luego especifica una sucesión de comandos, después de lo cual se puede construir una nueva imagen de contenedor.

  • Herramientas de interfaz de línea de comandos de Docker. Docker proporciona un conjunto de comandos CLI para administrar el ciclo de vida de los contenedores basados ​​en imágenes. Los comandos de Docker abarcan funciones de desarrollo como compilación, exportación y etiquetado, así como funciones de tiempo de ejecución como ejecutar, eliminar, iniciar y detener un contenedor, y más.

Puede ejecutar comandos de Docker contra un demonio de Docker en particular o un registro. Por ejemplo, si ejecuta el docker -pscomando, Docker devolverá una lista de contenedores que se ejecutan en el demonio.

Distribución de contenido con Docker

Además del entorno de ejecución y los formatos de contenedor, Docker proporciona un mecanismo de distribución de software, comúnmente conocido como registro, que facilita el descubrimiento y la distribución del contenido del contenedor.

El concepto de registro es fundamental para el éxito de Docker, ya que proporciona un conjunto de utilidades para empaquetar, enviar, almacenar, descubrir y reutilizar el contenido del contenedor. Docker, la compañía, ejecuta un registro público y gratuito llamado Docker Hub.

  • Registro. Un registro de Docker es un lugar donde se publican y almacenan imágenes de contenedores. Un registro puede ser remoto o local. Puede ser público, para que todos puedan usarlo, o privado, restringido a una organización o un conjunto de usuarios. Un registro de Docker viene con un conjunto de API comunes que permiten a los usuarios crear, publicar, buscar, descargar y administrar imágenes de contenedores.
  • Docker Hub. Docker Hub es un registro de contenedores público basado en la nube administrado por Docker. Docker Hub proporciona compatibilidad con el flujo de trabajo de descubrimiento, distribución y colaboración de imágenes. Además, Docker Hub tiene un conjunto de imágenes oficiales que están certificadas por Docker. Estas son imágenes de editores de software conocidos como Canonical, Red Hat y MongoDB. Puede utilizar estas imágenes oficiales como base para crear sus propias imágenes o aplicaciones.

La Figura 3 muestra un flujo de trabajo en el que un usuario construye una imagen y la carga en el registro. Otros usuarios pueden extraer la imagen del registro para crear contenedores de producción e implementarlos en los hosts de Docker, donde sea que estén.

La inmutabilidad de los contenedores Docker

Una de las propiedades más interesantes de los contenedores Docker es su inmutabilidad y la consiguiente apatridia de los contenedores.

Como describimos en la sección anterior, una imagen de Docker, una vez creada, no cambia. Un contenedor en ejecución derivado de la imagen tiene una capa de escritura que puede almacenar temporalmente cambios en tiempo de ejecución. Si el contenedor se confirma antes de la eliminación con docker commit, los cambios en la capa de escritura se guardarán en una nueva imagen que es distinta de la anterior.

¿Por qué es buena la inmutabilidad? Las imágenes y los contenedores inmutables conducen a una infraestructura inmutable, y una infraestructura inmutable tiene muchos beneficios interesantes que no se pueden lograr con los sistemas tradicionales. Estos beneficios incluyen lo siguiente:

  • Control de versiones. Al requerir confirmaciones explícitas que generan nuevas imágenes, Docker te obliga a realizar un control de versiones. Puede realizar un seguimiento de las sucesivas versiones de una imagen; Revertir a una imagen anterior (por lo tanto, a un componente del sistema anterior) es completamente posible, ya que las imágenes anteriores se mantienen y nunca se modifican.
  • Actualizaciones más limpias y cambios de estado más manejables. Con una infraestructura inmutable, ya no tiene que actualizar la infraestructura de su servidor, lo que significa que no es necesario cambiar los archivos de configuración, ni actualizaciones de software, ni actualizaciones del sistema operativo, etc. Cuando se necesitan cambios, simplemente haga nuevos contenedores y sáquelos para reemplazar los viejos. Este es un método mucho más discreto y manejable para el cambio de estado.
  • Deriva minimizada. Para evitar la desviación, puede actualizar periódicamente y de forma proactiva todos los componentes de su sistema para asegurarse de que sean las últimas versiones. Esta práctica es mucho más fácil con contenedores que encapsulan componentes más pequeños del sistema que con el software tradicional y voluminoso.

La diferencia de Docker

El formato de imagen de Docker, las extensas API para la gestión de contenedores y el innovador mecanismo de distribución de software lo han convertido en una plataforma popular para los equipos de desarrollo y operaciones. Docker aporta estos notables beneficios a una organización.

  • Sistemas declarativos mínimos. Los contenedores Docker están en su mejor momento si son aplicaciones pequeñas y de un solo propósito. Esto da lugar a contenedores que son de tamaño mínimo, que a su vez admiten una entrega rápida, una integración continua y una implementación continua.
  • Operaciones predecibles. El mayor dolor de cabeza de las operaciones del sistema siempre ha sido el comportamiento aparentemente aleatorio de la infraestructura o las aplicaciones. Al obligarlo a realizar actualizaciones más pequeñas y manejables y al proporcionar un mecanismo para minimizar la deriva del sistema, Docker lo ayuda a construir sistemas más predecibles. Cuando se eliminan las desviaciones, tiene la seguridad de que el software siempre se comportará de manera idéntica, sin importar cuántas veces lo implemente.
  • Amplia reutilización de software. Los contenedores Docker reutilizan capas de otras imágenes, lo que naturalmente promueve la reutilización del software. El intercambio de imágenes de Docker a través de registros es otro gran ejemplo de reutilización de componentes a gran escala.
  • Verdadera portabilidad multicloud. Docker permite una verdadera independencia de la plataforma, al permitir que los contenedores migren libremente entre diferentes plataformas en la nube, infraestructuras locales y estaciones de trabajo de desarrollo.

Docker ya está cambiando la forma en que las organizaciones crean sistemas y brindan servicios. Está empezando a cambiar la forma en que pensamos sobre el diseño de software y la economía de la entrega de software. Antes de que estos cambios se arraiguen realmente, las organizaciones deben comprender mejor cómo administrar la seguridad y las políticas para el entorno de Docker. Pero ese es un tema para otro artículo.

Chenxi Wang es director de estrategia de la empresa de seguridad de contenedores Twistlock.

New Tech Forum proporciona un lugar para explorar y discutir la tecnología empresarial emergente con una profundidad y amplitud sin precedentes. La selección es subjetiva, basada en nuestra selección de las tecnologías que creemos que son importantes y de mayor interés para los lectores. no acepta material de marketing para su publicación y se reserva el derecho de editar todo el contenido contribuido. Envíe todas sus consultas a [email protected]