Cómo crear imágenes de Docker con Dockerfile en Linux

27 feb 2021 5 min di lettura
Cómo crear imágenes de Docker con Dockerfile en Linux
Indice dei contenuti

Introducción

Una imagen de Docker es el proyecto de contenedor de Docker que contiene la aplicación y todo lo necesario para ejecutar la aplicación. Un contenedor es una instancia en tiempo de ejecución de una imagen.

En este tutorial, explicaremos qué es Dockerfile, cómo crear uno y cómo construir /crear una imagen de Docker con Dockerfile.

¿Qué es Dockerfile?

Un archivo Docker es un archivo de texto que contiene todos los comandos que un usuario podría ejecutar en la línea de comandos para crear una imagen. Incluye todas las instrucciones que Docker necesita para crear la imagen.

Las imágenes de Docker consisten en una serie de capas del sistema de archivos que representan instrucciones en el archivo de imagen de Docker que conforma una aplicación de software ejecutable.

El archivo Docker tiene la siguiente forma:

# Comment
 INSTRUCTION arguments

INSTRUCTION no distingue entre mayúsculas y minúsculas, pero la convención es usar MAYÚSCULAS para sus nombres.

A continuación se muestra una lista con una breve descripción de algunas de las declaraciones de Dockerfile más utilizadas:

  • ARG: esta declaración le permite definir variables que se pueden pasar en tiempo de compilación. También puede establecer un valor predeterminado.
  • FROM: la imagen base para crear una nueva imagen. Esta declaración debe ser la primera declaración no comentada en el archivo Docker. La única excepción a esta regla es cuando desea utilizar una FROM en el argumento. En este caso, FROM puede ir precedido de una o más instrucciones ARG
  • ETIQUETA: se utiliza para agregar metadatos a una imagen, como descripción, versión, autor, etc. Puede especificar más de una LABEL y cada LABEL es un par clave-valor.
  • RUN: los comandos especificados en esta declaración se ejecutarán durante el proceso de compilación. Cada RUN crea una nueva capa sobre la imagen actual.
  • AÑADIR: se utiliza para copiar archivos y directorios desde la fuente especificada al destino especificado en la imagen de Docker. La fuente puede ser archivos o directorios locales o una URL. Si la fuente es un archivo tar local, se descomprime automáticamente en la imagen de Docker.
  • COPIA: similar a ADD pero la fuente solo puede ser un archivo o directorio local.
  • ENV: esta declaración le permite definir una variable de entorno.
  • CMD: se utiliza para especificar un comando que se ejecutará al ejecutar un contenedor. CMD se puede usar una instrucción CMD en el Dockerfile.
  • ENTRYPOINT: similar a CMD, esta declaración define qué comando se ejecutará al ejecutar un contenedor.
  • WORKDIR: esta directiva establece el directorio de trabajo actual para las ENTRYPOINT RUN, CMD, ENTRYPOINT, COPY y ADD.
  • USUARIO: establezca el nombre de usuario o UID que se utilizará al ejecutar cualquiera de las siguientes instrucciones: RUN, CMD, ENTRYPOINT, COPY y ADD.
  • VOLUMEN: Le permite montar un directorio de computadora host en el contenedor.
  • EXPOSICIÓN: se utiliza para especificar el puerto en el que el contenedor está escuchando en tiempo de ejecución.

Para excluir archivos y directorios de agregarlos a la imagen, cree un .dockerignore en el directorio de contexto. La sintaxis de .dockerignore es similar a la del archivo .gitignore

Para obtener una referencia completa y una explicación detallada de las instrucciones de Dockerfile, consulte la página de referencia oficial de Dockerfile.

Crea un archivo Docker

El escenario más común al crear imágenes de Docker es extraer una imagen existente de un registro (generalmente Docker Hub) y especificar los cambios que desea realizar en la imagen base. La imagen base más utilizada al crear imágenes de Docker es Alpine porque es pequeña y está optimizada para ejecutarse en RAM.

Docker Hub es un servicio de registro basado en la nube que, entre otras características, se utiliza para almacenar imágenes de Docker en un repositorio público o privado.

En este ejemplo, crearemos una imagen de Docker para el servidor Redis. Usaremos la última versión de Ubuntu 18.04 como imagen base.

Primero, cree un directorio que contendrá el archivo Docker y todos los archivos necesarios:

mkdir ~/redis_docker

Cambie de directorio y cree el siguiente Dockerfile:

cd ~/redis_docker
nano Dockerfile
FROM ubuntu:18.04

 RUN apt-get update && \
 apt-get install -y redis-server && \
 apt-get clean

 EXPOSE 6379

 CMD ["redis-server", "--protected-mode no"]

Explicamos el significado de cada una de las líneas del Dockerfile:

  • En la línea 1 estamos definiendo la imagen base.
  • Las RUN comienzan en la línea 3 y actualizarán el índice de apt, instalarán el paquete "redis-server" y borrarán la caché de apt. Los comandos utilizados en las instrucciones son los mismos que los que utilizaría para instalar redis en el servidor Ubuntu.
  • La EXPOSE define el puerto en el que escucha el servidor redis.
  • En la última línea, estamos usando las CMD para establecer el comando predeterminado que se ejecutará cuando se ejecute el contenedor.

Guarde y cierre el archivo presionando CTRL + X, seguido de Y para guardar los cambios y luego ENTER si está usando nano.

Construye la imagen

El siguiente paso es construir la imagen. Para hacer esto, ejecute el siguiente comando desde el directorio donde se encuentra Dockerfile:

docker build -t noviello/redis.

La -t especifica el nombre de la imagen y, opcionalmente, un nombre de usuario y una etiqueta con el formato "nombre de usuario /nombre de la imagen: etiqueta".

La salida del proceso de compilación se verá así:

Sending build context to Docker daemon 3.584kB
 Step 1/4: FROM ubuntu:18.04
 ---> 7698f282e524
 Step 2/4: RUN apt-get update && apt-get install -y gosu redis-server && apt-get clean
 ---> Running in e80d4dd69263...
 Removing intermediate container e80d4dd69263
 ---> e19fb7653fca
 Step 3/4: EXPOSE 6379
 ---> Running in 8b2a45f457cc
 Removing intermediate container 8b2a45f457cc
 ---> 13b92565c201
 Step 4/4: CMD ["redis-server", "--protected-mode no"]
 ---> Running in a67ec50c7048
 Removing intermediate container a67ec50c7048
 ---> d8acc14d9b6b
 Successfully built d8acc14d9b6b
 Successfully tagged noviello/redis:latest

Una vez que se completa el proceso de compilación, la nueva imagen se incluirá en la lista de imágenes:

docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
 noviello/redis latest d8acc14d9b6b 4 minutes ago 100MB
 ubuntu 18.04 7698f282e524 5 days ago 69.9MB

Si desea enviar la imagen a Docker Hub, consulte Inserción de una imagen de contenedor de Docker en Docker Hub.

Ejecutar un contenedor

Ahora que se ha creado la imagen, ejecute un contenedor ejecutando:

docker run -d -p 6379:6379 --name redis noviello/redis

La -d le dice a Docker que ejecute el contenedor en modo separado, la -p 6379:6379 publicará la imagen en el puerto 6379 de la computadora host y la --name redis especifica el nombre del contenedor. El último argumento noviello/redis es el nombre de la imagen que se usa para ejecutar el contenedor.

Cuando se inicia el contenedor, use el siguiente comando para enumerar todos los contenedores en ejecución:

docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
 6b7d424cd915 noviello/redis:v0.0.1 "redis-server '--pro…" 5 minutes ago Up 5 minutes 0.0.0.0:6379->6379/tcp redis

Para verificar que todo está funcionando como debería usar redis-cli para conectarse al contenedor de la ventana acoplable:

redis-cli ping

El servidor de redis debería responder con PONG.

Conclusión

Este tutorial ha cubierto solo los conceptos básicos del uso de Dockerfiles para crear imágenes. Para obtener más información sobre cómo escribir Dockerfile y las mejores prácticas recomendadas, consulte Mejores prácticas para escribir Dockerfile.

Support us with a

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.