Dockerfile creation Tutorial - Dockerfile Instructions Explained with example!
¿Cómo crear un Dockerfile correctamente?
Introducción a Dockerfile
- Las imágenes de Docker se construyen leyendo instrucciones de un archivo de texto llamado Dockerfile. Este video enseña cómo crear un Dockerfile con la sintaxis correcta y explica diferentes instrucciones mediante una demostración práctica.
- Para crear una imagen de Docker para una aplicación, es necesario tener un Dockerfile que siga la sintaxis adecuada y contenga las instrucciones requeridas.
Estructura del Dockerfile
- El nombre del archivo debe ser exactamente "Dockerfile" (con D mayúscula), como se menciona en la documentación oficial de Docker.
- En el Dockerfile, la primera línea puede ser un comentario, que se crea usando el símbolo de hash (#), similar a otros lenguajes de programación como Python.
Instrucciones en el Dockerfile
- La estructura del formato del Dockerfile es "instrucción y argumento". Aunque no es sensible a mayúsculas, se recomienda usar letras mayúsculas para las instrucciones para diferenciarlas más fácilmente.
- Existen diversas instrucciones que puedes incluir en tu Dockerfile para definir cómo deseas crear tu imagen. La instrucción "FROM" suele ser la primera utilizada.
Definiendo la Imagen Base
- La instrucción "FROM" define la imagen base sobre la cual quieres construir tu imagen de Docker. Puedes encontrar diferentes imágenes en Docker Hub.
- Por ejemplo, si necesitas Python instalado, puedes usar "FROM python". También puedes especificar versiones particulares añadiendo ":<versión>" al final.
Creando Imágenes con Comandos
- Al buscar imágenes oficiales en Docker Hub, puedes ver las instrucciones necesarias para crear esas imágenes.
- Para este demo, se usará Alpine como imagen base:
FROM alpine:3.18. Esto establece Alpine 3.18 como base para el nuevo proyecto.
Construyendo y Verificando Imágenes
- Para crear una imagen desde el Dockerfile, se utiliza el comando
docker build -t my_image ., lo que genera una nueva imagen basada en las instrucciones proporcionadas.
- Las imágenes de Docker son creadas utilizando capas; actualmente solo hay una instrucción (una capa). Se puede verificar su creación usando
docker images.
Comprobando el Sistema Operativo dentro de la Imagen
- Para comprobar qué sistema operativo está utilizando la imagen creada, ejecuta
cat /etc/os-releasedentro del contenedor.
¿Cómo crear imágenes Docker utilizando un Dockerfile?
Instrucción FROM
- La instrucción
FROMpermite especificar la imagen base que se utilizará para crear una nueva imagen Docker. Se puede usar múltiples veces en un solo Dockerfile para crear varias imágenes o imágenes de múltiples etapas.
- Es posible nombrar cada etapa usando la palabra clave
AS, por ejemplo,FROM python:3.9 AS build1.
Instrucción RUN
- La instrucción
RUNse utiliza para ejecutar comandos durante el proceso de construcción de la imagen. Por ejemplo, se puede instalar software en una imagen Alpine conRUN apk add curl.
- Existen dos formatos para la instrucción
RUN: el formato shell y el formato exec. En el formato shell no es necesario definir qué shell se usará, mientras que en el formato exec sí.
- Para instalar herramientas como curl, se puede usar
RUN apk add curl, lo que crea una nueva capa en la imagen.
- Al ejecutar
docker history my_image, se pueden ver todas las capas creadas durante la construcción de la imagen.
Instrucción WORKDIR
- La instrucción
WORKDIRestablece el directorio de trabajo para cualquier instrucción posterior como ADD, COPY, CMD y ENTRYPOINT.
- Si el directorio especificado no existe,
WORKDIRlo creará automáticamente. Por ejemplo, al establecerlo a/downloads, si no existe, será creado.
- Después de construir la imagen con esta configuración, al ejecutar un comando PWD (print working directory), mostrará que está utilizando el nuevo directorio establecido.
Instrucción USER
- La instrucción
USERpermite establecer un usuario específico (y opcionalmente un grupo) como predeterminado para los siguientes comandos en lugar del usuario root por defecto.
- Al ejecutar el comando
whoamidentro de una imagen sin configurar otro usuario, mostrará "root".
- Si intentamos establecer un usuario que no existe (por ejemplo, "Cloud sham"), obtendremos un error indicando que no hay entradas coincidentes.
Creación y Configuración de Imágenes Docker
Creación de un Usuario en el Contenedor
- Se utiliza el comando
RUNpara crear un usuario dentro del contenedor, específicamente el usuario "cloud champ". Esto se hace al construir la imagen.
- Al establecer el usuario con la instrucción
USER, se asegura que las siguientes instrucciones se ejecuten bajo este nuevo usuario. Se verifica usando el comandowhoami, que debería devolver "cloud champ" en lugar de "root".
Construcción de una Imagen Windows
- Se discute cómo crear una nueva imagen Docker basada en Windows, comenzando por eliminar instrucciones anteriores y agregar nuevas específicas para Windows.
- La instrucción
FROMestablece la imagen base como PowerShell de Microsoft, disponible en Docker Hub.
Ejecución de Comandos en Diferentes Sistemas Operativos
- Se utilizan comandos Linux (
mkdir) y Windows (comando no especificado), lo que plantea la pregunta sobre cómo Docker maneja diferentes sistemas operativos.
- Al intentar construir la imagen, surge un error relacionado con el uso del shell incorrecto (bash en lugar de PowerShell).
Cambio del Shell Utilizado
- Para solucionar errores relacionados con el shell, se introduce la instrucción
SHELLpara definir qué tipo de shell utilizará Docker al ejecutar comandos.
- La documentación sugiere usar PowerShell o CMD como alternativas a
/bin/sh, que es predeterminado para Linux.
Definición de Variables de Entorno
- La instrucción
ENVpermite establecer variables de entorno dentro del archivo Docker. Por ejemplo, se puede definirAPP_HOSTcomo0.0.0.0.
- Es posible agregar múltiples variables utilizando una sola instrucción
ENV, separándolas con una barra invertida (``).
Verificación de Variables Ambientales
- Después de construir la imagen con las variables definidas, se ejecuta un contenedor para verificar si las variables están correctamente configuradas usando el comando
env.
Introducción a las Instrucciones de Docker
Variables de Entorno y Copia de Archivos
- Se pueden establecer variables de entorno dentro de los contenedores utilizando
ENV. Un contenedor Docker consiste en código, dependencias y bibliotecas.
- Para copiar archivos desde la máquina local al contenedor, se utiliza la instrucción
COPY, que permite transferir archivos del origen (máquina local) a un destino específico dentro del contenedor.
- Al crear una imagen Docker, se puede verificar que el archivo
app.pyestá presente en el directorio/c/codedespués de ejecutar el comando correspondiente.
Uso de Instrucciones ADD
- La instrucción
ADDes similar aCOPY, pero también permite copiar archivos desde ubicaciones remotas, como un bucket S3.
- Se puede construir una imagen usando la instrucción
ADDpara incluir archivos remotos. Esto proporciona funcionalidad adicional al proceso de copia.
Exposición de Puertos
- La instrucción
EXPOSEse utiliza para definir puertos en los que el contenedor escuchará tráfico. Por ejemplo, si una aplicación corre en el puerto 5000, se debe usarEXPOSE 5000.
- Al inspeccionar la imagen creada con
docker inspect, se puede confirmar que el puerto 5000 está expuesto correctamente.
Comandos Esenciales: ENTRYPOINT y CMD
- Las instrucciones más importantes para ejecutar procesos dentro del contenedor son
ENTRYPOINTyCMD. Estas definen qué comandos o procesos deben ejecutarse al iniciar el contenedor.
- Se puede tener tanto un
ENTRYPOINTcomo unCMD, donde el primero define el ejecutable y el segundo los parámetros. Si ambos están presentes, los parámetros del CMD pueden ser sobrescritos.
Ejecución y Verificación
- Al construir e iniciar una imagen con las instrucciones adecuadas, se verifica si la aplicación funciona correctamente accediendo al puerto especificado.
Comprendiendo el Comando CMD y Entry Point en Docker
Ejecución de Contenedores y Parámetros
- Al ejecutar un contenedor, se puede especificar un tiempo de espera (sleep) que por defecto es de 5 segundos. Sin embargo, este valor puede ser sobrescrito al ejecutar el comando, permitiendo establecer un nuevo tiempo, como 10 segundos.
Documentación y Recursos Adicionales
- Para una mejor comprensión sobre las diferencias entre CMD y Entry Point, se recomienda consultar la documentación oficial de Docker. También se sugiere revisar respuestas en Stack Overflow o videos en YouTube para aclarar dudas.
Uso de Etiquetas (Labels)
- Las etiquetas son utilizadas para proporcionar información adicional sobre la imagen del contenedor. Esto incluye detalles como la versión de la imagen o el creador/maintainer.
Instrucción Label