Docker ofrece facilitar la implementación de aplicaciones sin importar su infraestructura. El problema es que no puedes cambiar de una tecnología a otra de la noche a la mañana solo porque te ayudará a resolver ciertos problemas. Pasar a la nueva tecnología es un problema en sí mismo, además, no hay tecnología que no venga con sus propios problemas. Con Machinery queremos ayudarlo a hacer que la transición de máquinas virtuales a contenedores sea lo más fluida posible.

Esta publicación se entregó originalmente como una presentación en LinuxCon Dublin 2015.

Supongamos que tiene un servidor que ejecuta una aplicación web que usa Rails, Apache y MariaDB. Usaremos Machinery para crear una Descripción del sistema desde este servidor que revisaremos manualmente y luego permitiremos que Machinery detecte automáticamente las cargas de trabajo respectivas. Finalmente utilizaremos Machinery para verificar que vean las diferencias entre el sistema original y los contenedores resultantes.

En mi caso, usaré Portus como mi aplicación Rails.

Nuestro flujo de trabajo se verá más o menos así:

Work flow

Crear una descripción del sistema

En primer lugar, deberá asegurarse de poder acceder al servidor sin requerir una contraseña copiando sus claves ssh en el servidor.

ssh-copy-id root@192.168.1.100

Esto es necesario porque la maquinaria abrirá una conexión ssh y ejecutará un conjunto de comandos para evaluar la información dentro del servidor. Luego continúe e inspeccione el servidor para crear una descripción del sistema.

machinery inspect --name portus --extract-files 192.168.1.100

La opción --name es el nombre que queremos dar a nuestra descripción del sistema. La opción --extract-files hará una copia de cada archivo, excepto aquellos que son los predeterminados de un paquete RPM.

Una vez que la maquinaria ha terminado una carpeta con el nombre de wordpress se creará dentro /home/USERNAME/.machinery. Si selecciona esta carpeta, encontrará un archivo llamado manifest.json, que es la representación física de la descripción del sistema y un directorio files que contiene los archivos extraídos.

Puede abrir fácilmente la descripción del sistema con su editor de texto favorito, pero la maquinaria también proporciona un comando show para facilitar el acceso.

machinery show portus --html

La opción --html adicional le indicará a la maquinaria que inicie un servidor web en su máquina local, lo que nos ayudará a tener una visión más interactiva sobre cómo se configuró este servidor. Al omitir esta opción, obtendrá acceso a la misma información que el texto a través de la CLI.

Su navegador predeterminado se abrirá con toda la información sobre la descripción del sistema de WordPress. Desde aquí, puede ver manualmente en detalle cada archivo de configuración, paquete y servicio que se estaba ejecutando para escribir su Dockerfile.

HTML View

Esta característica por sí sola lo ayudará mucho porque puede traducir toda esta información no solo en un Dockerfile sino también en un sistema de administración de configuración.

Contenerización

Para el caso particular de Rails (usando MariaDB y Apache2), hemos implementado una característica realmente agradable en la maquinaria que le permitirá ejecutar solo un comando y obtener los Dockerfiles creados para usted y también los archivos docker-compose para que pueda orquestar su aplicación una vez que ha sido contenedorizado.

Para hacer esto, debe indicarle a la maquinaria que contenga una descripción del sistema cuyos archivos se hayan extraído (en nuestro caso, la descripción del sistema de WordPress)

machinery containerize --output-dir /tmp/containers portus

El --output-dir requerido le dice a la maquinaria dónde desea que se guarde su versión en contenedor del servidor.

Ahora podemos ir a /tmp/container/portus y echar un vistazo. Machinery ha creado un conjunto de archivos para que podamos ejecutar una versión en contenedor de nuestra aplicación. Los detalles sobre cómo configurarlo y ejecutarlo estarán dentro del archivo README.md.

Lo primero que debemos hacer es ejecutar el script de configuración.

./setup.rb

Este script es único dependiendo de la aplicación que fue contenida. En el caso de Portus, configura un contenedor de base de datos para que nuestro contenedor web pueda conectarse a él.

docker-compose up

Docker compose iniciará una instancia de todos los contenedores necesarios. Para Portus, esto significa un contenedor web, uno de base de datos y uno de registro y le permite acceder a ellos desde Machinery localmente a través del puerto 3000.

Voila! Acaba de obtener una versión en contenedor de su aplicación. ¿Cuan genial es eso?

Introspección

Ahora esto suena muy bien, pero una vez que haya hecho todo esto (especialmente si está escribiendo sus propios Dockerfiles o recetas para CMSs, módulos, etc.) es posible que desee verificar qué hay dentro de sus contenedores resultantes.

machinery inspect-container portus_db

En este punto, podría mostrar (show) la descripción del sistema portus_db y echar un vistazo si todo es como esperaba, pero podemos ir un paso más allá y compararlo con la descripción del sistema portus. De esta manera puedo asegurarme de cuáles son las diferencias entre el contenedor y la MV.

machinery compare portus portus_db

Podría haber agregado la opción --html pero no lo haré para que pueda ver la vista cli de la maquinaria. Fue diseñado para jugar bien con sus otros comandos *nix para que pueda hacer fácilmente algo como esto, para determinar si hay una diferencia en el paquete MariaDB.

Si no hubiera diferencias, la maquinaria comprometería esta información. Por esta razón, he creado un contenedor con una versión diferente de MariaDB

machinery compare portus portus_db --no-pager | grep mariadb
* mariadb (version: 10.0.21 <> 10.0.20)
* mariadb-client (version: 10.0.21 <> 10.0.20)
* mariadb-errormessages (version: 10.0.21 <> 10.0.20)

Puedes ver fácilmente las diferencias aquí. Ahora depende de usted cambiar sus archivos Dockerfile o CMS para agregar la versión correcta del paquete que desea instalar.

Resumen

Como puede ver, Machinery puede ser muy útil para comenzar a implementar sus aplicaciones como contenedores acoplables. Inspeccione un sistema existente y comprenda cómo se configuró utilizando los comandos inspect y show respectivamente. Escriba sus Dockerfiles y cree sus imágenes de Docker que luego también puede inspeccionar y comparar con el sistema original utilizando los comandos de inspect-container y compare.

Mientras hace esto, recuerde divertirse mucho y compartir cómo utilizó Machinery en su propio proyecto.