Docker Logo

Creando una distribución de Linux desde cero como imagen base de Docker

A principios del pasado mes de diciembre tuve una sesión en Tajamar hablando sobre contenedores, Docker y la plataforma de Microsoft. Tuvimos una muy buena conversación sobre el tema y una de las preguntas que hizo @alber86 me dio que pensar. Su duda iba enfocada a cómo un contenedor de Docker puede ejecutar un “sistema operativo” en él, cómo se construye y cuáles son las diferencias respecto a la ejecución del mismo dentro de una máquina virtual.

A partir de ahí el reto estaba claro, entender cómo se puede generar una distribución de Linux desde cero y una vez construida, comprender cómo ejecutar mis propios contenedores de Docker basados en esa distribución como imagen base. El artículo es un breve resumen del proceso por si estás interesado en replicarlo.

Tu primera distro de Linux

Cualquier distribución de Linux, como sistema operativo completo, tiene su cierta complejidad debido al gran número de diferentes piezas que interactúan entre sí para dar vida a nuestro equipo. Aún más cuando únicamente tienes la base teórica propia de una asignatura de la carrera y no sabes por dónde se debe de empezar. Si tu situación es similar, la guía de Linux from scratch es básica para comprender las diferentes partes que forman uns distribución de Linux y cómo crearla de forma ordenada desde cero.

Cuando digo desde cero es literalmente de la nada. Desde una distribución de Linux que ya tengas disponible se inicia el proceso de compilar y construir todas las utilidades que necesitemos para nuestra distribución. Esto va desde el kernel y el gestor de arranque hasta el propio compilador y el resto de programas necesarios para configurar e instalar el software. Es un proceso que lleva su tiempo; por ejemplo, compilar gcc y pasar los test dependiendo del equipo se puede extender más allá de la hora.

Una de las cosa que más me ha sorprendido es el proceso de doble pasada necesario para construir nuestro toolchain de compilación, configuración e instalación. Lo lógico es que fuera suficiente emplear el propio compilador que viene en nuestra distribución de Linux base; sin embargo, no es así. Para prevenir posibles fallos e interacciones entre nuestra distribución y la nueva que estamos construyendo, se realiza un proceso previo de crear un sistema temporal para construir una versión de nuestro “toolchain” que sea agnóstica de la distribución sobre la que estamos trabajando. Una vez que las tengamos, serán esas herramientas dentro de un entorno aislado a través de chroot las que empleemos para compilar el resto del software.

En mi caso, partí de una Ubuntu Server virtualizada para finalizar como mi propia distribución que la he llamado TouLix. A dicha máquina virtual le añadí un disco extra donde instalar todo para así poder utilizarlo luego de base para nuevas máquinas virtuales. Algunas cosas que me he encontrado que os pueden ayudar a evitar problemas:

  • Si añadís un disco nuevo a la VM, al formatear y crear las particiones usad el formato antiguo basado en el MBR. Os ahorrará llegar al último paso, ir a instalar GRUB y comprobar que no se lleva bien directamente con las particiones GPT. Se podría instalar sobre GPT también pero no está contemplado en la guía
  • Si vuestra imagen base es Ubuntu, recordad cambiar el link de /bin/sh a /bin/bash para evitar problemas de compilación. Yo los tuve con el paquete de Perl.
  • Al utilizar el esquema de múltiples particiones en lugar de solo la de /boot y / os permitirá reutilizar el sistema para crear nuevos sin tener que empezar desde cero cada vez y perder el tiempo recompilando todo

Una vez acabado todo el proceso, si desmontáis el disco y lo utilizáis como base para crear una nueva VM tendréis vuestra distribución lista para trabajar.

Primera ejecución Linux From Scratch
Primera ejecución Linux From Scratch

Y si os resulta útil, recordad hacer una donación por el trabajo desinteresado que han hecho para que pueda seguir siendo útil para nueva gente.

Donación Linux from Scratch
Donación Linux from Scratch

Creando la imagen base de Docker y nuestro primer contenedor

Dado que ya tenemos nuestra distribución ejecutándose de forma correcta en la máquina virtual, el siguiente paso es ver cómo convertirla en una imagen base de Docker. La propia documentación de la plataforma no es muy específica respecto a cómo crear tu propia imagen de forma detallada. Buscando por StackOverflow apuntaban al repositorio de Docker y a la sección dedicada a creación de imágenes en la carpeta contrib.

Por lo tanto, cogiendo los ficheros de mi distribución propia, comprimiéndolos en .tar y luego importándolos con Docker import podemos ejecutar contenedores con nuestra propia versión de Linux.

Toulix ejecutándose en Docker
Toulix ejecutándose en Docker

El tamaño es excesivo debido al contenido extra que lleva la distro creada con Linux from Scratch; sin embargo, eliminando algunas cosas como el código fuente de los paquetes, la parte de la documentación y las herramientas de compilación, podemos dejarla cerca del medio giga. Si queremos, podemos incluso bajar más el tamaño desinstalando utilidades que no vayamos a utilizar en nuestra distribución.

Si tenéis un rato para probarlo, os recomiendo que lo hagáis. Resulta interesante comprender mejor cómo funcionan las cosas.

Leave a Reply

Your email address will not be published. Required fields are marked *