¿Qué es Docker?

Un contenedor Docker es un formato que empaqueta todo el código y las dependencias de una aplicación en un formato estándar que permite su ejecución rápida y fiable en entornos informáticos. Un contenedor de Docker es un conocido contenedor ejecutable, independiente, ligero que integra todo lo necesario para ejecutar una aplicación, incluidas bibliotecas, herramientas del sistema, código y tiempo de ejecución. Docker es también una plataforma de software que permite a los desarrolladores crear, probar e implementar aplicaciones en contenedores de forma rápida.

Los servicios de contenedores o Containers as a Service (CaaS) son servicios gestionados en la nube que administran el ciclo de vida de los contenedores. Los servicios de contenedores ayudan a orquestar (iniciar, detener, ampliar) el tiempo de ejecución de los contenedores. Con los servicios de contenedor, puede simplificar, automatizar y acelerar el desarrollo de sus aplicaciones y el ciclo de vida de su implementación.

Los Docker y servicios de contenedores se han adoptado rápidamente y han tenido un gran éxito en los últimos años. Docker ha evolucionado de una tecnología inicial de código abierto casi desconocida y bastante técnica en 2013 a un entorno de ejecución estandarizado que ahora es oficialmente compatible con multitud de productos de Oracle Enterprise.

Definir la terminología de Docker

Docker:

Plataforma de contenedor de software diseñada para desarrollar, enviar y ejecutar aplicaciones aprovechando la tecnología de los contenedores. Docker se presenta en dos versiones: edición empresarial y edición de comunidad

Contenedor:

A diferencia de una máquina virtual que proporciona virtualización de hardware, un contenedor proporciona virtualización ligera a nivel de sistema operativo mediante la abstracción del "espacio del usuario". Los contenedores comparten el núcleo del sistema host con otros contenedores. Un contenedor, que se ejecuta en el sistema operativo host, es una unidad de software estándar que empaqueta código y todas sus dependencias, para que las aplicaciones se puedan ejecutar de forma rápida y fiable de un entorno a otro. Los contenedores no son persistentes y se activan desde imágenes.

Motor de Docker:

El software de host de código abierto que crea y ejecuta los contenedores. Los motores de Docker funcionan como la aplicación del servidor del cliente que que admite contenedores en varios servidores Windows y sistemas operativos Linux, como Oracle Linux, CentOS, Debian, Fedora, RHEL, SUSE y Ubuntu.

Imágenes de Docker:

Colección de software que se ejecutará como un contenedor que incluye un conjunto de instrucciones para crear un contenedor que se pueda ejecutar en la plataforma Docker. Las imágenes no son modificables, de modo que para realizar cambios en una imagen es preciso crear otra nueva.

Docker Registry:

Lugar para almacenar y descargar imágenes. Registry es una aplicación de servidor escalable y sin estado que almacena y distribuye imágenes de Docker.

¿Quién usa Docker?

Docker es un marco abierto de desarrollo de aplicaciones que se ha diseñado para ayudar a DevOps y a los desarrolladores. Con Docker, los desarrolladores pueden crear, empaquetar, enviar y ejecutar aplicaciones fácilmente en forma de contenedores ligeros, portátiles y autosuficientes que pueden utilizarse en prácticamente cualquier lugar. Los contenedores permiten a los desarrolladores empaquetar una aplicación con todas sus dependencias y desplegarla como una sola unidad. Al proporcionarles contenedores de aplicaciones precompilados y autosuficientes, los desarrolladores pueden centrarse en el código de la aplicación y utilizarlo sin preocuparse por el sistema operativo subyacente ni por el sistema de implementación.

Además, los desarrolladores pueden aprovechar miles de aplicaciones de contenedor de código abierto ya diseñadas, que se pueden ejecutar dentro de un contenedor Docker. Para los equipos de DevOps, Docker permite una integración continua y el desarrollo de cadenas de herramientas, al tiempo que reduce las limitaciones y la complejidad necesarias dentro de la arquitectura de su sistema para implementar y administrar las aplicaciones. Con la introducción de los servicios en la nube de orquestación de contenedores, cualquier desarrollador puede desarrollar localmente aplicaciones en contenedores en su entorno de desarrollo y mover y ejecutar posteriormente dichas aplicaciones de contenedores en servicios de nube, como los servicios Kubernetes administrados.

Docker y desarrolladores

Los contenedores pueden ser empaquetados por cualquier tipo de desarrollador. En el sector del software, a menudo los desarrolladores se dividen por especialización, esto es, frontend, el backend, o cualquier punto entre ambos extremos. Aunque en la mayoría de los casos te encontrarás con que son los desarrolladores de backend quienes se encargan de empaquetar los contenedores, cualquiera que esté familiarizado con los conceptos básicos de CaaS puede tener éxito en esta área concreta del ciclo de vida de desarrollo de software. Antes de que empaquetes las dependencias de tu aplicación, visita developer.oracle.com y familiarízate con las herramientas que puedes utilizar para crear tu aplicación o programa.

Comparación entre Docker y Kubernetes

Los contenedores Linux existen desde 2008, pero no se conocían bien hasta que en 2013 surgieron los contenedores Docker. Con la aparición de los contenedores Docker, aumentó vertiginosamente el interés por desarrollar e implementar aplicaciones en contenedores. A medida que crecía la cantidad de aplicaciones en contenedores hasta abarcar cientos de contenedores implementados en múltiples servidores, aumentaba la complejidad de su gestión. ¿Cómo se coordinan, amplían, gestionan y programan cientos de contenedores? Aquí es donde Kubernetes le puede ayudar. Kubernetes es un sistema de orquestación de código abierto que le permite ejecutar sus cargas de trabajo y contenedores Docker. Le ayuda a gestionar las complejidades operativas que surgen cuando se decide ampliar varios contenedores desplegados en varios servidores. El motor Kubernetes organiza automáticamente el ciclo de vida del contenedor y distribuye los contenedores de aplicaciones en la infraestructura de alojamiento. Kubernetes puede ampliar o reducir rápidamente los recursos, en función de la demanda. Suministra, programa, elimina y supervisa constantemente el estado de los contenedores.

Conceptos básicos de Docker

Los conceptos centrales de Docker son las imágenes y los contenedores. Una imagen de Docker contiene todo lo que necesitas para ejecutar tu software: el código, un tiempo de ejecución (por ejemplo, Java Virtual Machine (JVM), controladores, herramientas, scripts, bibliotecas, implementaciones, etc.

Un contenedor de Docker es una instancia en ejecución de una imagen de Docker. Sin embargo, a diferencia de la virtualización tradicional con un hipervisor de tipo 1 o tipo 2, un contenedor de Docker se ejecuta en el núcleo del sistema operativo host. Dentro de una imagen de Docker no existe un sistema operativo independiente, como se ilustra en la Figura 1.

imagen básica de docker
Figura 1

Comparación entre aislamiento y virtualización

Cada contenedor de Docker tiene su propio sistema de archivos, su propia pila de red (y, por lo tanto, su propia dirección IP), su espacio de proceso propio y limitaciones de recursos definidas para la CPU y la memoria. El contenedor de Docker se inicia de forma instantánea, sin tener que arrancar un sistema operativo. Docker se basa en el aislamiento —es decir, en separar los recursos de un sistema operativo host—, mientras que la virtualización suministra un sistema operativo invitado sobre el sistema operativo host.

Sistema de archivos incrementales

imagen de sistema de archivos incrementales
Figura 2

El sistema de archivos de una imagen de Docker tiene varias capas, con semántica de copia en escritura. Esto permite heredar y reutilizar, ahorra recursos en el disco y permite la descarga incremental de imágenes.

Como se ilustra en la Figura 2, una imagen de Docker con una implementación Weblogic podría basarse en una imagen con un dominio Oracle WebLogic Server, que podría basarse en una imagen Weblogic, que, a su vez, se basa en una imagen Java Development Kit (JDK) y que, por su parte, está basada en una imagen básica de Oracle Linux.

Docker Registry

Si bien las imágenes de Docker son fáciles de crear y los desarrolladores adoran su simplicidad y portabilidad, se percataron con rapidez de que administrar miles de imágenes Docker resulta todo un desafío. Docker Registry se enfrenta a este reto. Docker Registry es una forma habitual de almacenar y distribuir imágenes de Docker. Se trata de un repositorio basado en código abierto con la cesión de licencia de Apache.

Docker Registry también ayuda a mejorar el control de acceso y la seguridad de las imágenes de Docker almacenadas en su repositorio. Gestiona la distribución de imágenes y también se puede integrar con los flujos de trabajo de desarrollo de aplicaciones. Los desarrolladores pueden configurar su propio Docker Registry o utilizar un servicio de Docker Registry alojado como Docker Hub, Oracle Container Registry, Azure Container Registry, etc.

Docker Hub es un Docker Registry alojado y administrado por Docker. Docker Hub tiene más de 100 000 imágenes de contenedores de proveedores de software, proyectos de código abierto y de la comunidad. Docker Hub contiene software y aplicaciones de repositorios oficiales como NGINX, Logstash, Apache HTTP, Grafana, MySQL, Ubuntu y Oracle Linux.

Al iniciar un contenedor, Docker extraerá automáticamente de forma predeterminada la imagen correspondiente del Docker Hub público, si no está disponible localmente. Además, también puede crear sus propias imágenes y enviarlas a un repositorio público o privado de Docker Hub.

Figura 3: captura de pantalla de Docker Registry
Figura 3

Docker como tiempo de ejecución de microservicios

En la actualidad, la idea de cortar aplicaciones monolíticas en fragmentos más pequeños de microservicios despierta mucho interés entre los desarrolladores de software.

Los microservicios se implementan como un proceso independiente, utilizan protocolos ligeros para comunicarse entre sí y cada servicio es propietario de sus datos. Dado que los microservicios siguen una estrategia de gobernanza descentralizada, requieren una cantidad bastante alta de automatización de la infraestructura, pruebas automatizadas, canalizaciones de CD totalmente automatizadas y equipos de DevOps ágiles y capacitados.

Todavía se debate bastante sobre este estilo arquitectónico; sin embargo, sería ingenuo suponer que una aplicación descompuesta en microservicios se puede operar como un simple conjunto de procesos. Por nombrar solo algunos requisitos, un microservicio debe ser independiente del host y estar aislado a nivel de sistema operativo. Debe ejecutarse dentro de sus límites de recursos, debe ampliarse y reducirse, reiniciarse si falla y detectarse y conectarse a otros microservicios a través de una capa de red definida por software.

Por lo tanto, ejecutar un microservicio en un contenedor de Docker es un excelente punto de partida para lograr la mayoría de estos objetivos.

Docker: dos dimensiones clave

Docker cambia la forma en que creamos, enviamos y ejecutamos software en dos dimensiones diferentes:

  • Mejora el proceso para obtener aplicaciones de manera fiable desde el desarrollo hasta la producción.
  • Proporciona un formato de imagen estándar para pasar del entorno local a la nube.

Ambas dimensiones se explican con más detalle en los siguientes párrafos.

Imagen de Docker Image: del desarrollo a la producción

Crear una imagen de Docker con todas sus dependencias resuelve el argumento de "pero es que funcionó en mi máquina de desarrollo". La idea clave es que una imagen de Docker se crea automáticamente mediante una canalización de compilación a partir de un repositorio de código fuente como Git, y se prueba en un primer momento en un entorno de desarrollo. Esta imagen inmutable se almacenará en un Docker Registry

Como se muestra en la Figura 4, la misma imagen se utilizará para más pruebas de carga, pruebas de integración, pruebas de aceptación, etc. En todos los entornos se utilizará la misma imagen. Las diferencias, pequeñas pero necesarias, específicas de cada entorno, como una URL JDBC para una base de datos de producción, se pueden introducir en el contenedor a modo de variables de entorno o archivos.

captura de pantalla de imagen de docker
Figura 4

Las estadísticas demuestran que el 65 % de los casos de uso actuales de Docker está en desarrollo y que el 48 % utiliza Docker para la integración continua.

Docker Cloud

Docker ha cambiado la adopción de nubes públicas. Por un lado, en el caso de la imagen de Docker, por primera vez en la historia, existe un formato de paquete común que se puede ejecutar tanto en entornos locales como en todos los principales proveedores de nube. Los contenedores Docker se ejecutan en los portátiles de la misma forma que en Oracle Cloud.

Por otra parte, dado que los contenedores Docker se ejecutan en todas las principales nubes públicas, contribuyen de manera significativa a superar el prejuicio forjado durante años en contra de las nubes públicas: la dependencia del proveedor. Todos los principales proveedores de la nube ofrecen ahora Docker como PaaS.

Versiones de Docker: la madurez de la tecnología subyacente

El ritmo de los lanzamientos de versiones de Docker es mucho más rápido que el ciclo de lanzamiento del software empresarial tradicional. En ocasiones, el alto ritmo de los lanzamientos de versiones de Docker, junto con la novedad del proyecto Docker, genera inquietudes acerca de la seguridad y estabilidad de Docker.

Mientras que Docker y su línea de comandos, el Docker Deamon, su API y las herramientas como Docker Swarm, Docker Machine y Docker Compose solo llevan evolucionando los últimos tres años, las características de núcleo subyacentes llevan estando casi una década disponibles en todos los núcleos Linux.

Un ejemplo destacado de uno de los primeros en adoptar la tecnología de contenedores es Google. Google utilizaba contenedores de Linux incluso antes de que existiera Docker. Además, Google ejecuta todo en un contenedor. Se estima que Google lanza varios miles de millones de contenedores cada semana.

Historial de Cgroups y espacios de nombres

Las características subyacentes del núcleo Linux que usa Docker son los Cgroups y los espacios de nombres. En 2008, los cgroups se introdujeron en el núcleo Linux a raíz del trabajo realizado previamente por los desarrolladores de Google1. Los Cgroups limitan y contabilizan el uso de recursos de un conjunto de procesos del sistema operativo.

El núcleo Linux utiliza el espacio de nombres para aislar entre sí los recursos del sistema en los procesos. El primer espacio de nombres, es decir, el espacio de nombres Mount, se introdujo ya en 2002.2

Container Cloud Service

La primera parte de este artículo explica algunos conceptos importantes de Docker. Sin embargo, en un entorno de producción no basta con ejecutar una aplicación en un contenedor Docker.

A la hora de configurar y operar un entorno de producción se requiere hardware para ejecutar los contenedores. Es necesario instalar, actualizar y parchear software como Docker, junto con los repositorios y administradores de clústeres. En caso de que varios contenedores Docker se comuniquen entre hosts, se debe crear una red. Los contenedores agrupados deben reiniciarse si fallan. Además, implantar un conjunto de contenedores vinculados entre sí debería resultar tan sencillo como hacerlo con una única instancia de aplicación lógica. Un ejemplo podría ser un equilibrador de carga, algunos servidores web, algunas instancias de Oracle WebLogic Server con un servidor de administración, un servidor administrado y una base de datos. Para administrar aplicaciones en contenedores a escala se requiere un sistema de orquestación de contenedores como Kubernetes o Docker Swarm. Implementar, administrar y operar sistemas de orquestación como Kubernetes puede resultar lento y todo un desafío.

Para que los desarrolladores puedan crear aplicaciones en contenedores de forma más sencilla y eficiente, los proveedores de nube ofrecen Container Cloud Services o Containers as a Service (CaaS). Container Cloud Services ayuda a los desarrolladores y equipos de operaciones a optimizar y administrar el ciclo de vida de los contenedores de forma automatizada. Estos servicios de orquestación, generalmente creados con Kubernetes, permiten que los equipos de DevOps administren y operen aplicaciones en contenedores a escala de manera más sencilla. Oracle Container Engine for Kubernetes y Azure Kubernetes Service son dos ejemplos de los servicios gestionados de orquestación de contenedores en la nube más conocidos.

Oracle Container Engine for Kubernetes es un servicio totalmente administrado, escalable y de alta disponibilidad que puede utilizar para implementar en la nube sus aplicaciones en contenedores. Utilice Container Engine for Kubernetes (en ocasiones abreviado como OKE) si su equipo de desarrollo desea crear, implementar y administrar con confianza aplicaciones nativas de nube.

Imágenes de Docker de Oracle

Los contenedores pueden ser empaquetados por cualquier tipo de desarrollador. En el sector del software, a menudo los desarrolladores se dividen por especialización, esto es, frontend, el backend, o cualquier punto entre ambos extremos. Aunque en la mayoría de los casos te encontrarás con que son los desarrolladores de backend quienes se encargan de empaquetar los contenedores, cualquiera que esté familiarizado con los conceptos básicos de CaaS puede tener éxito en esta área concreta del ciclo de vida de desarrollo de software. Antes de que empaquetes las dependencias de tu aplicación, visita developer.oracle.com y familiarízate con las herramientas que puedes utilizar para crear tu aplicación o programa.

A continuación se muestran algunas fuentes para obtener o crear imágenes de Docker para productos de Oracle. El repositorio Oracle GitHub para imágenes de Docker contiene archivos de Docker y ejemplos para crear imágenes de Docker para productos comerciales de Oracle y proyectos de código abierto patrocinados por Oracle.

Laboratorio práctico de Docker: desarrollo containerizado con Docker

Referencias

  1. Cgroups (Wikipedia)
  2. Espacios de nombres de Linux (Wikipedia)