Construir tus propias imágenes de Docker es el paso fundamental para dejar de depender exclusivamente de imágenes públicas y empezar a personalizar tus entornos. Todo el proceso gira alrededor de un archivo llamado Dockerfile, el comando docker build y un sistema de capas inmutables que hace que Docker sea extraordinariamente eficiente en el uso de disco y transferencia de datos.
¿Qué es un Dockerfile y cómo inicia el proceso de build?
Un Dockerfile es un archivo de texto que describe paso a paso lo que debe ocurrir cuando se construye una imagen [01:00]. A partir de este archivo, se ejecuta el comando docker build, cuyo resultado es una imagen lista para generar contenedores. La relación es lineal: Dockerfile → build → imagen → run → contenedor.
Todos los Dockerfiles comienzan con la instrucción FROM, que indica la imagen base sobre la cual se construirá la nueva imagen [02:24]. Es obligatorio partir de algo existente: si vas a trabajar con Node, usarás una imagen de Node; si necesitas Ubuntu, partirás de Ubuntu.
dockerfile
FROM ubuntu:latest
RUN touch /usr/src/hola-platzi.txt
En este ejemplo, la imagen base es ubuntu:latest y el comando RUN crea un archivo dentro del sistema de archivos de la imagen. Es fundamental entender que todo lo que se define en el Dockerfile se ejecuta en tiempo de build, no cuando se inicia el contenedor [03:22]. El archivo ya existe dentro de la imagen antes de que cualquier contenedor arranque.
¿Cómo se ejecuta docker build correctamente?
Para construir la imagen se utiliza el siguiente comando [04:02]:
bash
docker build -t ubuntu:platzi .
- La opción
-t asigna un tag o nombre a la imagen resultante.
- El punto (
.) indica el contexto de build, que es la porción del disco a la que el proceso de construcción tiene acceso.
Al ejecutar el build, Docker procesa cada instrucción del Dockerfile y genera un ID por cada paso. Cada uno de esos IDs representa una capa o layer de la imagen resultante [05:05].
¿Qué son las capas y por qué importan?
Una imagen no es un bloque monolítico: es un conjunto de capas apiladas [06:00]. Cada instrucción del Dockerfile agrega una capa nueva que solo contiene la diferencia respecto a la capa anterior. Este diseño se asemeja al esquema de árbol de Git, donde cada commit almacena únicamente los cambios incrementales.
Cuando creamos ubuntu:platzi, la capa nueva apunta a las capas de ubuntu:latest que ya existían en disco. No se duplica información, se reutiliza.
¿Cómo publicar una imagen en Docker Hub?
Antes de publicar, es necesario ajustar el nombre de la imagen para que apunte a tu repositorio personal. La nomenclatura estándar de Docker sigue el formato usuario/software:versión [09:07].
bash
docker tag ubuntu:platzi tunombredeusuario/ubuntu:platzi
Esta operación de retag no copia archivos ni ocupa espacio adicional en disco. Simplemente crea un nuevo nombre que apunta a las mismas capas existentes [09:30].
Una vez renombrada la imagen, se necesita autenticarse y luego publicarla:
bash
docker login
docker push tunombredeusuario/ubuntu:platzi
Durante el push, Docker analiza cada capa y solo transmite las que no existen en el repositorio de destino [11:00]. En el ejemplo, las capas de Ubuntu oficial ya están disponibles en Docker Hub, así que únicamente se transfieren los pocos KB del cambio propio. Las capas restantes se montan desde library/ubuntu directamente.
¿Qué precauciones tomar al publicar imágenes?
Las imágenes publicadas de la forma descrita son públicas y cualquier persona puede descargarlas [12:10]. Algunos puntos importantes:
- No publicar contenido sensible o secreto sin usar repositorios privados.
- Los repositorios privados en Docker Hub tienen un costo asociado.
- A partir de noviembre de 2020, las imágenes públicas sin actividad durante seis meses pueden ser eliminadas automáticamente [12:35].
La eficiencia del sistema de capas inmutables se manifiesta tanto en el almacenamiento local como en la transferencia de red: Docker solo mueve lo estrictamente necesario, haciendo que tus imágenes personalizadas sean ligeras y rápidas de distribuir. Si ya experimentaste con tu primer Dockerfile, comparte qué imagen base elegiste y qué cambios aplicaste.