Cómo crear imágenes propias usando un Dockerfile en Ubuntu 20.04

Para crear un contenedor siempre se comienza con una imagen existente. Esta contiene todos los recursos de una aplicación (metadatos, instrucciones para su ejecución, archivos y dependencias) pero no el kernel de un sistema operativo. Por medio del Docker Engine, cada contenedor puede acceder a ese recurso del host. En esta guía aprenderás cómo crear imágenes propias usando un Dockerfile en Ubuntu 20.04. Esto te permitirá incluir una aplicación dentro de una imagen y poder levantar un contenedor a partir de ella. Como ejemplo emplearás tres archivos que componen una página web simple (index.html, styles.css y script.js), pero los mismos principios aplican para aplicaciones más robustas.

De acuerdo a la documentación oficial, un Dockerfile es un archivo de texto que contiene todos los comandos necesarios para crear una imagen. La misma fuente indica una serie de buenas prácticas para realizar esta tarea de manera eficiente.

Requisitos previos

Paso 0: Preparación de los archivos de la aplicación

Para comenzar, clona el siguiente repositorio:

git clone https://github.com/gacanepa/ejemplo-dockerfile.git

En el directorio ejemplo-dockerfile encontrarás los siguientes archivos:

cd ejemplo-dockerfile
ls -l
  • Dockerfile: contiene los comandos para la creación de la imagen (los analizaremos en el paso siguiente)
  • favicon.ico: ícono para la página
  • index.html: archivo principal
  • LICENSE: licencia de la aplicación
  • Logo-DonWeb.svg: imagen que se utiliza en index.html
  • README.md: descripción del repositorio
  • script.js: código JavaScript para interactuar con la página
  • styles.css: estilos para la página
  • .dockerignore: listado de archivos o directorios a excluir en la imagen

Nota: es posible que en futuras revisiones de esta guía se modifiquen estos archivos o se agreguen otros nuevos.

Paso 1: Inspección del Dockerfile

Abre el archivo Dockerfile:

cat Dockerfile

donde verás tres líneas:

FROM nginx:alpine
WORKDIR /usr/share/nginx/html
COPY favicon.ico *.html *.js *.css *.svg ./

Cada una de ellas merece un comentario especial:

  1. FROM nginx:alpine especifica la imagen de base que usarás. En este caso se trata de nginx pero con la etiqueta alpine. Como te puedes imaginar, nginx a secas (que significa nginx:latest en realidad) y nginx:alpine difieren en la distribución que utilizan para su propia construcción. Esta última hará que el tamaño de la imagen que generarás sea mucho menor.
  2. WORKDIR /usr/share/nginx/html establece el directorio de trabajo dentro de la imagen para las instrucciones que aparezcan a continuación. En caso de que en un mismo Dockerfile existan dos o más de estas directivas, puedes especificar una ruta relativa al anterior WORKDIR.
  3. COPY copiará los archivos que aparecen en la lista al directorio que aparece al final (./ en este caso representa el WORKDIR). El uso de / en el último argumento es obligatorio cuando necesitamos copiar una lista de archivos para indicar el directorio de destino.

En esta caso estamos hablando de comandos simples para una imagen básica. Sin embargo, los Dockerfiles pueden tornarse complejos y extensos como puedes ver en los links de nginx:latest y nginx:alpine más arriba.

Paso 2: Generación de la imagen

Una vez que tienes los archivos que deseas incluir, el proceso para crear la imagen es muy sencillo. De hecho, consta de un solo comando. Antes de ejecutarlo, reemplaza gacanepa por tu Docker ID, cursodonweb por el nombre que desees asignarle a la imagen, y 1.0 por una etiqueta de tu elección.

sudo docker image build --tag gacanepa/cursodonweb:1.0 .

Con la opción --tag agregamos una etiqueta a la imagen, mientras que con el punto indicamos que el Dockerfile está en el directorio actual. Si tuviera otra ubicación o nombre, puedes emplear la opción -f (o su equivalente --file) seguida de la ruta correcta.

A continuación, verifica la existencia de la imagen:

sudo docker image ls

Como es de esperarse, nginx:alpine también aparece en el listado:

Ahora ya estás en condiciones para levantar un contenedor en base a esta imagen.

Paso 3: Crear el contenedor

Para finalizar, utiliza el comando ya familiar para crear el contenedor. Puedes reemplazar donweb por otro nombre de tu elección:

sudo docker container run --name=donweb --publish 8080:80 --detach gacanepa/cursodonweb:1.0

Como es costumbre, verifica el funcionamiento correcto en el navegador. La aplicación muestra un saludo de acuerdo al día de la semana y la fecha en distintos formatos que puedes elegir desde la lista.

¡Felicitaciones! Finalizaste la creación de tu primera imagen y la empleaste para crear un contenedor.

Conclusión

En esta guía aprendiste los conceptos fundamentales sobre el Dockerfile. Los comandos que incluiste te permitieron especificar una imagen de partida (incluyendo una etiqueta), indicar un directorio de trabajo, y copiar archivos. Como resultado, generaste tu primera imagen y un contenedor que la empleó como base. Nuestro próximo artículo explicará cómo enviar esta imagen al Docker Hub para que otros usuarios puedan utilizarla.

La entrada Cómo crear imágenes propias usando un Dockerfile en Ubuntu 20.04 se publicó primero en Guías Cloud by Donweb.