Como crear imágenes propias usando un dockerfile en ubuntu 20.04

Cómo usar un Dockerfile para crear imágenes

La creación de un contenedor siempre comienza con una imagen. Esta incluye todos los recursos de una aplicación (metadatos, instrucciones para su ejecución, archivos y dependencias), aunque no el núcleo de un sistema operativo. A través del Docker Engine, cada contenedor puede acceder a ese recurso del host. En esta guía aprenderás cómo usar un Dockerfile para crear imágenes a fin de incluir una aplicación en una imagen y generar un contenedor a partir de ella.

Antes de comenzar

Para tener en cuenta

Aunque en este ejemplo usarás tres archivos que componen una página web simple (index.html, styles.css y script.js), 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.

Preparar los archivos de la aplicación

Como primer paso, clona el siguiente repositorio:

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

Dentro de la carpeta ejemplo-dockerfile encontrarás los siguientes archivos:

cd ejemplo-dockerfile
ls -l
  • Dockerfile: incluye las directivas para la creación de la imagen (veremos más detalles en la sección siguiente)
  • favicon.ico: ícono de 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

Es importante aclarar que en futuras revisiones de esta guía se modifiquen estos archivos o se agreguen otros nuevos.

Examinar el 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 indica la imagen de base que usarás. En este caso se trata de nginx pero con la etiqueta alpine. La diferencia entre nginx a secas (que significa nginx:latest en realidad) y nginx:alpine es la distribución que utilizan para su propia construcción. Esta última hará que el tamaño de la imagen resultante sea mucho menor.
  2. WORKDIR /usr/share/nginx/html indica el directorio de trabajo (dentro de la imagen) para las instrucciones que sigan. Si en un mismo Dockerfile existen 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.

Es probable que hayas reparado en que este caso incluye solamente 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.

Generar la imagen

La creación de una imagen consta de un solo comando como vemos a continuación. Antes de ejecutarlo, reemplaza gacanepa por tu Docker ID, cursodonweb por el nombre que quieras darle a la imagen, y 1.0 por una etiqueta de tu elección.

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

La opción --tag agrega una etiqueta a la imagen, mientras que con el punto significa que el Dockerfile está en el directorio actual. Si estuviera ubicado en otro o tuviera un nombre distinto, puedes emplear la opción -f (o su equivalente --file) seguida de la ruta correcta.

como usar un dockerfile para crear imagenes 1

A continuación, verifica la existencia de la imagen con este comando:

sudo docker image ls

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

como usar un dockerfile para crear imagenes 2

¡Excelente! Ya estamos en condiciones para levantar un contenedor utilizando esta imagen.

Crear el contenedor

Como último paso, emplea el comando ya conocido para generar el contenedor. Puedes reemplazar donweb por otro nombre de tu elección. También deberás indicar el nombre que corresponda a la imagen que generaste en el apartado anterior.

sudo docker container run --name=donweb --publish 8080:80 --detach gacanepa/cursodonweb:1.0
como usar un dockerfile para crear imagenes 3

A esta altura ya debes tener el hábito de validar 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.

como usar un dockerfile para crear imagenes 4

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

Conclusión

En esta guía aprendiste los conceptos fundamentales sobre un Dockerfile. Los comandos que incluiste te permitieron especificar una imagen de base (incluyendo una etiqueta), indicar un directorio de trabajo, y copiar archivos. Este proceso te condujo a crear tu primera imagen y un contenedor a partir de esta. Nuestro próximo artículo te enseñará cómo enviar esta imagen al Docker Hub para que otros usuarios puedan utilizarla.

Gabriel Cánepa
Gabriel Cánepa

Gabriel trabaja actualmente como desarrollador full-stack en Scalar, una firma que se dedica a hacer valuaciones de empresas. Es Administrador de Sistemas certificado por la Fundación Linux y previamente ha escrito un gran número de artículos y contenidos técnicos sobre el tema para: DigitalOcean, Linode, Carrera Linux Argentina y Tecmint.

Tiene una certificación en programación de la Universidad de Brigham Young-Idaho, y está completando las carreras de programador y analista de sistemas en la Universidad Nacional de Villa Mercedes (UNViMe).

En su tiempo libre, Gabriel disfruta leyendo libros de Stephen R. Covey, tocando piano y guitarra, y enseñando conocimientos de programación a su dos hijas.