28 marzo, 2019

Cómo crear un pequeño contenedor (Menor a 50Mb)

Sharing is caring!

Al comenzar a aprender a usar contenedores, es fácil para cualquier desarrollador montar su aplicación en el interior, construirla y ejecutarla. A veces no necesita más de 10 líneas para crear un contenedor.

Por ejemplo, si tengo un programa de Python, puedo crear un archivo Docker como este:

Guarde el archivo, luego abra su bash / terminal, genere y ejecute el contenedor y listo. Ahora tienes un contenedor con tu aplicación de python viviendo dentro de él.

Eso fue fácil, ¿verdad? Sí, pero hay un detalle aquí.

Cuando se usan algunas imágenes como python:3.7.0 u otras imágenes base, el contenedor puede volverse realmente grande. ¿Cuan grande? Bueno, tal vez su aplicación pesa 5Mb, pero al crear el contenedor, la imagen aumenta a 700Mb o similar.

Si no hay un problema en tener tan grandes contenedores en un clúster, puede continuar trabajando con él. Pero, ¿qué sucede si necesito implementar contenedores súper eficientes que solo usen el mínimo espacio posible?

1. Primer paso: compruebe si la aplicación tiene alguna dependencia instalada que no se está utilizando

Al crear una aplicación, es fácil comenzar a crearla y no limpiar los archivos y las dependencias que no funcionaron o que ya no se utilizarán. Un ejemplo de esto son los paquetes, imágenes grandes y videos que pueden comenzar a comer mucho espacio y se dejan dentro de la aplicación si algún día se vuelven necesarios. Esos recursos no se utilizan, pero pueden costar una cantidad significativa de dinero si tiene muchos contenedores en el clúster.

Al utilizar una herramienta de control de versiones como Git, puede confirmar el estado de la aplicación actual, eliminar dichos archivos y volver a confirmar. La aplicación tendrá menos basura y si alguna vez necesita este tipo de archivos, siempre puede regresar y recuperarlos. Asegúrate de empujar tu nuevo repositorio a la nube.

2. Segundo paso: cambia tu base de contenedores

Al utilizar otra imagen de base de contenedor, puede reducir el tamaño del contenedor. Algunas imágenes tienen menos dependencias. Usar una imagen base alpina escribiendo: FROM python:3.0.7-alpine3.8 podría reducirse en gran proporción porque Linux Alpine es realmente pequeño. Linux Alpine no viene con muchos paquetes integrados como algunas otras distribuciones de Linux. Esto ayuda a reducir su tamaño a lo necesario. Si la aplicación necesita una dependencia, deberá agregarla manualmente al Dockerfile.

3. Tercer paso: cambia tu lenguaje de programación

El uso de su lenguaje de programación favorito puede ayudar a construir una nueva aplicación rápidamente. Pero si todavía tienes un contenedor grande, podrías necesitar otra solución. Elegir un lenguaje de programación compilado puede reducir dramáticamente el tamaño del contenedor. Pero como saben, usar C / C ++ podría tomar tiempo para aprender y crear cosas. Java y C # y excelentes opciones, pero si estás enamorado de la sintaxis utilizada por lenguajes interpretados como Python, Ruby, Javascript, etc. La mejor opción es Golang.

4. Cuarto paso: contenedor docker multietapa

Al crear un contenedor utilizando FROM <lenguaje de programación>, también tenemos dicho lenguaje de programación en el propio contenedor (Esto agrega una gran cantidad de código que no se usa en absoluto). Al usar un lenguaje de programación que puede compilar el código fuente a un binario, podemos tomar el binario y simplemente ejecutarlo. En este ejemplo, vamos a crear un dockerfile de múltiples etapas para golang.

Construye el contenedor y comprueba el tamaño. Con este enfoque, puede reducir el almacenamiento necesario de su aplicación en la nube.

5. Quinto paso: ¿Qué pasa si no puedo cambiar el lenguaje de programación?

Ya ha creado algo que ya funciona y re-escribirlo puede llevar meses o años, bueno, en ese caso, puede usar el almacenamiento en caché de la capa docker si su proveedor de servicios en la nube lo permite. Por ejemplo, Python ya está contenido dentro de Google Cloud Platform, ¿no sería genial simplemente usarlo y no tenerlo dentro de su contenedor? Es posible declarando RUN export CACHE_IMAGE=gcr.io/sdk/python en su Dockerfile.

Referencias

Avilés, A. (2018). “Going from a Big Golang Docker Container to a Tiny One”.  Retrieved from https://github.com/arturoaviles/tiny-go-container
Google Cloud. “Dockerfile” Retrieved from https://github.com/GoogleCloudPlatform/cloud-sdk-docker/blob/5fe5c2b14245af65439ade203a7f941f5e37f755/Dockerfile

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *