Un Dockerfile es un archivo de texto plano que contiene una lista de instrucciones que Docker utiliza para la construcción de una imagen personalizada.
Hasta este punto del curso, “hemos actuado como usuarios de Docker”. Hemos descargado imágenes que otros han creado (Nginx, Python, Ubuntu) y las hemos ejecutado.
Pero, ¿qué pasa cuando queremos usarlo para crear nuestra propia aplicación? Aquí es donde empieza la parte interesante y más útil de Docker.
Imaginemos que has hecho una web en Node.js o una API en Python. Antes tendrías que pasarle el código fuente a tu compañero y decirle: “Instala Python, luego las librerías con pip, luego configura esta variable de entorno…”.
Eso es precisamente lo que buscamos evitar. En Docker, lo que hacemos es crear nuestra propia imagen personalizada. Una imagen que ya trae tu código y tus dependencias instaladas.
Para crear esa imagen, necesitamos escribir una “receta de cocina”. Esa receta es el Dockerfile👇.
¿Qué es un Dockerfile?
Un Dockerfile es un archivo de texto plano, sin extensión (simplemente se llama Dockerfile) que contiene una serie de instrucciones secuenciales.
Docker lee este archivo y ejecuta las instrucciones una a una para construir tu imagen.
Tu primer Dockerfile: Una web personalizada
Vamos a crear nuestra primera imagen que, al ejecutarse, muestre una web con tu nombre, sin tener que usar volúmenes ni copiar archivos a mano.
Crea una carpeta vacía en tu ordenador y dentro crea un archivo index.html con esto:
<h1>Esta web vive dentro de mi propia imagen Docker</h1>
En la misma carpeta, crea un archivo llamado Dockerfile (ojo con la mayúscula inicial y sin extensión .txt).
Ábrelo y escribe:
# 1. Usamos una imagen base
FROM nginx:alpine
# 2. Copiamos nuestros html dentro de la imagen
COPY index.html /usr/share/nginx/html/index.html
Solo dos líneas.
FROM: Le dice a Docker “No empieces desde cero. Empieza con un Nginx que ya funciona”.COPY: Le dice “Coge el archivo index.html de mi PC y mételo en la carpeta del servidor web dentro de la imagen”.
Ahora vamos a decirle a Docker que coja nuestro proyecto y cree la imagen. Abre la terminal en esa carpeta y ejecuta:
docker build -t mi-web-personalizada .
Ese . al final del comando le dice a Docker: Busca el Dockerfile y los archivos en el directorio actual”. Sin el punto, el comando fallará.
Verás una salida parecida a esta:
s ✓ Building 2.3s (7/7) FINISHED o [internal] load build definition from Dockerfile o [internal] load .dockerignore o [internal] load metadata for docker.io/library/nginx
¡Felicidades! Acabas de compilar tu primera imagen.
Probando el resultado
Ahora tu imagen existe en tu ordenador, igual que si la hubieras bajado de Docker Hub. Compruébalo:
docker images
Verás mi-web-personalizada en la lista.
Ahora, lánzala (crea un contenedor):
docker run -d -p 8080:80 mi-web-personalizada
Si vas a localhost:8080, verás tu mensaje.
Lo mejor de esto es que esa imagen es autónoma. Ya no depende del archivo index.html de tu escritorio. Puedes borrar el archivo original, enviar la imagen a un servidor en Japón, y funcionará igual. El código está “fundido” dentro de la imagen.
Infraestructura como código
Lo que acabamos de hacer es la base de la filosofía Infrastructure as Code. Ya no escribimos documentos de Word explicando cómo instalar nuestro servidor. El Dockerfile ES la documentación ejecutable.
- ¿Qué versión de Linux usa? Mira el
FROM. - ¿Dónde están los archivos? Mira el
COPY. - ¿Qué puertos abre? Mira el
EXPOSE.
