Volver

Comprender y sacar partido a Docker

Imagen del slider

15 de junio de 2017

Por T. Asnar – Experto en infraestructura virtual en SQUAD

Lavirtualización de las infraestructurasestá muy extendida. A medida que evolucionan las necesidades y los métodos de trabajo, loscontenedoreshan ido cobrando cada vez más importancia. Especialmente popular entre los desarrolladores y su métodoAGILE,Dockerpermitecompartirfácilmentelas aplicacionesentre equipos, probarlas de forma sencilla en cualquier entorno y publicarlas por versiones en lanube(control, agilidad y portabilidad).

Por ejemplo,¡Google ejecuta unos 3300 contenedores por segundo! Todo en Google, desde la búsqueda hasta Gmail, se empaqueta y se ejecuta en un contenedor Linux. Cada semana lanzamos más de 2000 millones de instancias de contenedores.

Tras una breve introducción, les mostraré un ejemplo de uso con Docker Compose.

Introducción a Docker

Dockerofrece varios productos paracrear, implementar y ejecutar contenedores. En la mayoría de los casos, el término«contenedor»se asocia a unaaplicacióno aun entorno de trabajoque incluye todas las bibliotecas, dependencias y herramientas necesarias.

Hay que tener en cuenta que el concepto de contenedor no es nada nuevo (véanse, por ejemplo, las zonas de Solaris o los espacios de nombres y los cgroups de Linux para la aislamiento). Sin embargo, en mi opinión, el gran punto fuerte de Docker es sufacilidad de uso y una documentación en línearealmente rica en ejemplos y explicaciones.

La forma más fácil de entenderlo es comprender ladiferenciaentre unamáquina virtualy uncontenedor.

Diferencias entre las máquinas virtuales y los contenedores

MÁQUINAS VIRTUALES

¿Qué es Docker? (diagrama)

Contenedores

¿Qué es un diagrama VM?

Lasmáquinas virtualestienen supropio sistema operativo y recursos asignados (CPU, memoria, almacenamiento, etc.). Esto supone una ventaja, ya que se obtiene lo que se paga (recursos reservados). Sin embargo, también supone un inconveniente: por un lado,el límite de recursos asignables se alcanza rápidamentey,por otro, las máquinas virtuales en ejecución suelen estar infrautilizadas (desperdicio).

Por su parte, loscontenedores Docker se basan en elsistema operativo del host(núcleo Linux > 3.10). Se pueden ejecutarmiles de aplicaciones heterogéneas(servidor web, servidor de aplicaciones, big data, etc.) en la misma máquina; y todo ello sin la complejidad ni la pesada carga de un hipervisor (como, por ejemplo, un gran vCenter para VMware).

Otra ventaja de los contenedores: garantizan que el código que se ha escrito y probado directamente en el equipo de desarrollo se ejecutará de la misma manera una vez implementado en otro lugar. Ya sea en la nube, en máquinas virtuales o en una infraestructura completamente diferente, la aplicación ya dispone en su contenedor de las bibliotecas que necesita.

Otradiferenciaimportante (por así decirlo):el tamaño del contenedor. A diferencia de las máquinas virtuales, que incluyen el sistema operativo y ocupan varias decenas de gigabytes, los contenedores son muyligerosy su tamaño depende de las bibliotecas que ejecutan la aplicación (por lo general, unos pocos cientos de megabytes).

Los PCA y PRA (Plan de Continuidad de la Actividad o Plan de Recuperación de la Actividad) se convertirían en algo casi infantil (replicación y despliegue simplificados)

Ejemplo para recuperar una imagen del servidor web Nginx: juzguen ustedes mismos lo sencillos que son los comandos

12345678910111213# Descargar la imagen desde Docker Hub$ docker pull nginxUsando la etiqueta predeterminada: latestlatest: Descargando desde library/nginx...Digest: sha256:46a1b05e9ded54272e11b06e13727371a65e2ef8a87f9fb447c64e0607b90340Estado: Se ha descargado una imagen más reciente para nginx:latest # lista de imágenes locales$ docker imagesREPOSITORIO ETIQUETA ID DE LA IMAGEN FECHA DE CREACIÓN TAMAÑOnginx latest 3edcc5de5a79 hace 3 días 182,8 MB 

Productos Docker

Docker Enginees el motor que se ejecuta en Linux y permite gestionar y ejecutar contenedores.

Docker Machinepermite configurar y ejecutar Docker Engine en una máquina virtual Linux muy ligera. Imprescindible en Windows.

Docker Composepermite definir la configuración de uno o varios contenedores en un solo archivo y, a continuación, ejecutarlos con un solo comando.

Docker Hubte permite publicar en la nube (privada o pública) tus contenedores versionados.

Existen otros productos, pero su uso es más avanzado (véase #para-ir-más-allá)

Principio de funcionamiento

Las imágenes

Están construidas como una sucesión de capas, con una distribución de Linux (como Debian o Fedora, por ejemplo) como base.

Todas las capas (ejecución, adición de archivos, variables de entorno) pueden describirse como instrucciones en un archivo Dockerfile que podemos utilizar como plantilla para crear nuestra imagen.

Otra forma de crear tu imagen: ejecuta una imagen de distribución básica (es decir, un contenedor), instala tus bibliotecas y tu aplicación y, a continuación, guarda tu contenedor como una imagenconfirmada

Ventajas de esta estructura por capas: si tienes dos imágenes basadas en dos versiones de Ubuntu, por ejemplo, la capa «Ubuntu» solo ocupará espacio en el disco una vez.

El contenedor

Esta es la imagen realizada con docker run. Para que el contenedor pueda «funcionar» y dado que la imagen es de solo lectura, se asignan capas de sistema adicionales, como UnionFS con permisos de escritura para el sistema de archivos o una interfaz de red, por ejemplo.

Nota: dado que el contenedor se basa en la imagen, todos los cambios que se realicen en el contenedor se «perderán» en la siguiente ejecución (a menos quese guardeel contenedor como imagen).

Los volúmenes

Algo imprescindible para la persistencia de los datos: se pueden montar volúmenes accesibles en los contenedores.

Más detalles sobre los datos

Ejemplo de uso con Docker Compose

Primeros pasos

¿Y si instalamos WordPress? Nada más sencillo:

Creemos un archivo wordpress-compose.yml

123456789101112wordpress: imagen: wordpress enlaces: - base de datos: mysql puertos: - 8080:80 base de datos: imagen: mariadb entorno: MYSQL_ROOT_PASSWORD: ejemplo 

Ahora vamos a poner en marcha estos dos contenedores. Ya verás, ¡es muy, muy difícil! O quizá no; en realidad, Docker Compose se encarga de todo.

O bien las imágenes definidas ya están almacenadas localmente, o bien las descargará de Docker Hub. También se puede definir un comando de compilación con un Dockerfile propio para crear la imagen si aún no existe. Por ejemplo, la imagen WordPress lo anterior procede de El siguiente Dockerfile

Crea las dependencias, las aperturas de puertos, las variables de entorno, etc.

Un pequeño extra: cuando Docker Compose reinicia los servicios, si encuentra contenedores ya existentes y no hay ninguna actualización que realizar, vuelve a utilizar los antiguos.

12345678910111213141516$ docker-compose -f wordpress-compose.yml upDescargando la base de datos (mariadb:latest)...latest: Descargando desde library/mariadbResumen: sha256:648500ff8eb35b9967a5e77735d0f66fefb8a48377a65312a375a944cdcfda0aEstado: Se ha descargado una imagen más reciente para mariadb:latest. Creando compose_db_1. Descargando wordpress (wordpress:latest)...latest: Descargando desde library/wordpressResumen: sha256:282b474f38ef7c79b50ac45d7430a7c1851db54ccdd134472ad200fab405587eEstado: Se ha descargado una imagen más reciente para wordpress:latest. Creando compose_wordpress_1. Adjuntando a compose_db_1, compose_wordpress_1db_1 | Inicializando la base de datos...  

Aparte: Copia de seguridad, implementación

1234567891011$ docker save -o miImagenNginx.tar nginx$ ls -lh-rw-r--r-- 1 thoma 197609 182M 7 de mayo 22:12 miImagenNginx.tar # la compresión funciona muy bien en los contenedores$ zip miImagenNginx.tar.zip miImagenNginx.tar añadiendo: monImageNginx.tar (172 bytes de seguridad) (comprimido al 63 %)$ ls -lh-rw-r--r-- 1 thoma 197609 69M 7 de mayo a las 22:14 monImageNginx.tar.zip  

Ahora solo tienes que transferir la copia de seguridad y volver a cargarla en cualquier plataforma:

12$ docker load -i miImagenNginx.tar 

También se puedesubirla imagen a la nube (Docker Hub) iniciando sesión con tuscredenciales

Para saber más

Documentación oficial: cómo instalarlo, cómo utilizar los comandos en detalle, etc.

Docker Swarm: Docker en modo clúster

Kubernetes: Automatización de las operaciones de gestión de contenedores en la nube y en clústeres de máquinas

y otros, como Docker Cloud, Datacenter, Kinematic, etc. Vertodos los productos

OpenShiftde Red Hat. Plataforma de alojamiento basada en Docker y Kubernetes que ofrece diferentes planes (incluido uno gratuito) para desarrollar y ejecutar tus aplicaciones en la nube.

Me encantan los tutoriales de Grafikart y están en francés:

Presentación a cargo de Grafikart

Ejemplo de entorno de desarrollo