He estado trabajando en un proyecto con mi equipo que implica la creación de una selección de microservicios. Estos microservicios pueblan un
Couchbase Server bucket con datos en un intervalo de nuestra elección y operar a través de un servidor AWS EC2. El problema es que todo el mundo en
mi equipo tiene un lenguaje de programación preferido. Si instaláramos todos los lenguajes del lado del servidor en este servidor probablemente se convertiría en
caro. En su lugar, decidimos utilizar contenedores Docker para cada microservicio. Como solo los ejecutamos en un intervalo, podemos
eliminar el contenedor después de cada ejecución, manteniendo nuestro servidor central ligero y libre de software.

Vamos a repasar algunas de las cosas que hemos estado haciendo para hacer posible esta solución.

Configuración de Docker en una instancia EC2

Vamos a suponer que nuestro host Amazon EC2 es Ubuntu 14.04 porque a partir de ahora es la versión de soporte a largo plazo de Ubuntu. Inicie sesión en
el host EC2 y ejecute lo siguiente como sudoer:

Lo anterior instalará Docker en el host y no como una máquina virtual como podría experimentar en un entorno Mac o Windows.

En este momento se puede utilizar Docker. Nuestra intención es utilizar un script de compilación, pero también se puede utilizar manualmente. Si usted
Si aún no ha instalado Couchbase en la instancia EC2, también puede hacerlo. Descarga el último archivo de Debian desde la página
Descargas de Couchbase y ejecute lo siguiente:

Alternativamente, puede optar por crear una instancia de Amazon EC2 que ya esté ejecutando Couchbase Server. Más información
tema se puede encontrar aquí.

Diseño de un script de construcción

En Dockerfile es nuestro script de compilación para crear imágenes Docker. En él definimos qué sistema operativo utilizar, qué
paquetes que descargará y qué archivos contendrá.

Yo soy más de Node.js así que mis microservicios en este proyecto son Node.js. Algunos de los otros utilizan Java y Python aunque este artículo
no es específico de ningún lenguaje. El archivo de compilación de uno de mis microservicios tiene el siguiente aspecto:

Para desglosar el expediente anterior, veamos todas las piezas.

Primero determinamos que esta imagen será Ubuntu 14.04 y no interactiva. Esta será una imagen base así que antes de que podamos empezar
Para ejecutar proyectos Node.js necesitamos instalar las dependencias. Actualizamos la lista de repositorios del sistema operativo e instalamos rizo porque
Ubuntu no lo trae por defecto y lo necesitaremos para instalar el repositorio de Node.js. Una vez que rizo está instalado
podemos añadir el repositorio de Node.js 4.x e instalar el software.

Aquí es donde las cosas se vuelven un poco más específicas para mi proyecto. Mi proyecto tiene los siguientes archivos y directorios:

  • modelos/
  • rutas/
  • paquete.json
  • app.js
  • config.json
  • mock_data.xml

En Dockerfile que estamos creando se encuentra dentro de la raíz de esta estructura de proyecto.

Lo que hay que hacer es copiar todo en nuestra imagen. Esto se hace mediante el uso de la COPIA comandos. Una vez que
podemos decirle al gestor de paquetes de Node (NPM) que instale todas las dependencias que se encuentran en el archivo
paquete.json archivo.

En CMD es lo que se ejecutará cuando despleguemos nuestra imagen construida.

Construir y poner en marcha un contenedor

A partir de ahora el Dockerfile debe existir en el mismo directorio que sus archivos de script o aplicación. Aunque
sin importancia, mis archivos de aplicación es un proyecto Node.js que se ejecutará automáticamente.

Antes de ejecutar nuestro contenedor debemos crearlo basándonos en el plano de nuestro Dockerfile. Ejecute lo siguiente
a través de la interfaz de línea de comandos de Docker:

Lo anterior pasará por cada paso del script y etiquetará nuestra imagen con el nombre mi_proyecto. Una vez construido, en cualquier momento
puedes ejecutar lo siguiente desde Docker Command Line Tool para ejecutar nuestra imagen:

Pero espera un momento. ¿Por qué estamos haciendo --add-host="localhost:10.0.2.2"? En este ejemplo concreto, suponemos que
Couchbase se está ejecutando en nuestra máquina local con la información localhost:8091. En la aplicación Node.js, vamos a
supongamos que intentamos establecer una conexión con Couchbase Server a través de http://localhost:8091. Por defecto Docker será
bajo una subred diferente haciendo esto imposible. Localhost no será lo que crees que es. Por eso añadimos un host con
mapeo.

En determinadas circunstancias, también puede encontrarse haciendo --net=host en lugar de --add-host="localhost:10.0.2.2".
Más información en
el documentación oficial de Docker.

Porque copiamos todo nuestro proyecto Node.js y añadimos CMD ["node", "app.js"]cuando se inicie la imagen, se ejecutará el comando.
En app.js en teoría contendrá nuestra lógica para interactuar con Couchbase Server a través del SDK de Couchbase Node.js. El mismo
se puede hacer para cualquier lenguaje de programación y Couchbase SDK. Una vez finalizado el comando, se eliminará el contenedor.

Conclusión

Acabas de ver cómo conseguir que Docker funcione en un servidor Ubuntu y ejecutar un proyecto en un contenedor a través de un script. Aunque este método de
hacer las cosas no será para todo el mundo, se adapta a nuestra necesidad de poder ejecutar un proyecto en cualquier lenguaje de programación y
hacer que almacene datos en Couchbase Server ejecutándose a nivel de host.

Autor

Publicado por Nic Raboy, Defensor del Desarrollador, Couchbase

Nic Raboy es un defensor de las tecnologías modernas de desarrollo web y móvil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y móvil más fácil de entender.

Dejar una respuesta