Tutorial Completo de Dockerfile

 

Tutorial Completo de Dockerfile: De Cero a Experto

📚 Introducción a Dockerfile

Un Dockerfile es un script de texto que contiene todas las instrucciones necesarias para construir una imagen de Docker. Es como una receta que le dice a Docker exactamente cómo crear tu aplicación y su entorno.


🎯 Las Instrucciones Más Comunes

1. FROM - Imagen Base

dockerfile
# Sintaxis
FROM <imagen>:<tag>

# Ejemplos
FROM ubuntu:20.04
FROM python:3.9-slim
FROM node:16-alpine
FROM nginx:alpine

¿Para qué sirve?

  • Define la imagen base sobre la que construirás

  • Siempre debe ser la primera instrucción en un Dockerfile

  • Usa imágenes oficiales cuando sea posible


2. RUN - Ejecutar Comandos

dockerfile
# Sintaxis
RUN <comando>

# Ejemplos
RUN apt-get update && apt-get install -y python3
RUN pip install -r requirements.txt
RUN mkdir /app && chmod 755 /app

¿Para qué sirve?

  • Ejecuta comandos durante la construcción de la imagen

  • Cada RUN crea una nueva capa en la imagen

  • Combina comandos relacionados con && para reducir capas

💡 Mejor Práctica:

dockerfile
# MAL - Múltiples capas
RUN apt-get update
RUN apt-get install -y python3
RUN pip install flask

# BIEN - Una sola capa
RUN apt-get update && \
    apt-get install -y python3 && \
    pip install flask

3. COPY - Copiar Archivos

dockerfile
# Sintaxis
COPY <origen> <destino>

# Ejemplos
COPY . /app
COPY requirements.txt /tmp/
COPY script.sh /usr/local/bin/

¿Para qué sirve?

  • Copia archivos y directorios desde tu máquina local a la imagen

  • Los paths son relativos al contexto de construcción


4. WORKDIR - Directorio de Trabajo

dockerfile
# Sintaxis
WORKDIR <ruta>

# Ejemplos
WORKDIR /app
WORKDIR /usr/src/app

¿Para qué sirve?

  • Establece el directorio de trabajo para las instrucciones siguientes

  • Equivale a cd <directorio> en Linux

  • Si el directorio no existe, lo crea automáticamente


5. CMD - Comando por Defecto

dockerfile
# Sintaxis (3 formas)
CMD ["executable","param1","param2"]  # Forma exec (recomendada)
CMD command param1 param2              # Forma shell
CMD ["param1","param2"]                # Como parámetros para ENTRYPOINT

# Ejemplos
CMD ["nginx", "-g", "daemon off;"]
CMD ["python", "app.py"]
CMD npm start

¿Para qué sirve?

  • Define el comando que se ejecutará al iniciar el contenedor

  • Puede ser sobrescrito al ejecutar docker run

  • Solo puede haber un CMD por Dockerfile


6. ENTRYPOINT - Punto de Entrada

dockerfile
# Sintaxis
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

# Ejemplos
ENTRYPOINT ["/docker-entrypoint.sh"]
ENTRYPOINT ["python"]

¿Para qué sirve?

  • Define el comando principal del contenedor

  • No puede ser sobrescrito fácilmente (solo con --entrypoint)

  • Se combina con CMD para pasar parámetros


🚀 Tutorial Práctico: Crear un Servidor Web con Nginx

Paso 1: Crear la Estructura de Archivos

bash
# Crear directorio del proyecto
mkdir mi-contenedor-web
cd mi-contenedor-web

# Crear Dockerfile
touch Dockerfile

# Crear archivo HTML de ejemplo
echo "<html><body><h1>¡Hola Docker!</h1></body></html>" > index.html

Paso 2: Crear el Dockerfile

dockerfile
# Usar la imagen oficial de Nginx como base
FROM nginx:alpine

# Copiar el archivo HTML al directorio de Nginx
COPY index.html /usr/share/nginx/html/index.html

# Exponer el puerto 80
EXPOSE 80

# Comando para iniciar Nginx
CMD ["nginx", "-g", "daemon off;"]

Paso 3: Construir la Imagen

bash
# Construir la imagen
docker build -t mi-contenedor-web .

# Ver imágenes disponibles
docker images

📝 Explicación del comando build:

  • -t mi-contenedor-web: Le da un nombre (tag) a la imagen

  • .: Indica que el contexto de construcción es el directorio actual

Paso 4: Ejecutar el Contenedor

bash
# Ejecutar el contenedor
docker run -d -p 8080:80 --name mi-servidor-web mi-contenedor-web

📝 Explicación del comando run:

  • -d: Ejecuta en segundo plano (detached mode)

  • -p 8080:80: Mapea puerto 8080 del host al puerto 80 del contenedor

  • --name mi-servidor-web: Asigna un nombre al contenedor

Paso 5: Verificar que Funciona

Abre tu navegador y visita: http://localhost:8080


🛠️ Comandos Esenciales de Docker

1. Gestionar Contenedores

bash
# Ver contenedores en ejecución
docker ps

# Ver todos los contenedores (incluyendo detenidos)
docker ps -a

# Detener un contenedor
docker stop mi-servidor-web

# Iniciar un contenedor detenido
docker start mi-servidor-web

# Eliminar un contenedor
docker rm mi-servidor-web

# Ver logs de un contenedor
docker logs mi-servidor-web

2. Gestionar Imágenes

bash
# Listar imágenes
docker images

# Eliminar una imagen
docker rmi mi-contenedor-web

# Limpiar recursos no utilizados
docker system prune

3. Acceder a un Contenedor en Ejecución

bash
# Acceder con bash
docker exec -it mi-servidor-web bash

# Si no tiene bash, usar sh
docker exec -it mi-servidor-web sh

# Ejecutar un comando específico
docker exec mi-servidor-web ls -la /usr/share/nginx/html

¿Por qué acceder a un contenedor?

  • 🔍 Depurar problemas: Ver logs, configuraciones o estados

  • 🛠️ Tareas administrativas: Instalar paquetes, modificar archivos

  • 📊 Inspeccionar el entorno: Ver cómo está configurado

  • 🐛 Solucionar errores: Diagnosticar por qué no funciona algo


🎯 Ejemplo Avanzado: Dockerfile para Desarrollo vs Producción

Dockerfile para Desarrollo (Dockerfile.dev)

dockerfile
FROM node:16

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

# Instalar herramientas de desarrollo
RUN npm install -g nodemon

EXPOSE 3000

CMD ["nodemon", "app.js"]

Dockerfile para Producción (Dockerfile.prod)

dockerfile
FROM node:16-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install --only=production

COPY . .

EXPOSE 3000

CMD ["node", "app.js"]

Construir con Dockerfiles Específicos

bash
# Para desarrollo
docker build -t mi-app:dev -f Dockerfile.dev .

# Para producción
docker build -t mi-app:prod -f Dockerfile.prod .

📋 Resumen de Buenas Prácticas

  1. Usa imágenes base oficiales y específicas

    dockerfile
    # BIEN
    FROM python:3.9-slim
    
    # MAL
    FROM python:latest
  2. Minimiza el número de capas

    dockerfile
    # BIEN
    RUN apt-get update && \
        apt-get install -y python3 && \
        pip install flask
    
    # MAL
    RUN apt-get update
    RUN apt-get install -y python3
    RUN pip install flask
  3. Usa .dockerignore

    bash
    # Crear archivo .dockerignore
    echo "node_modules\n.git\n.env\n*.log" > .dockerignore
  4. Ordena las instrucciones inteligentemente

    • Coloca las instrucciones que cambian menos frecuentemente al inicio

    • Coloca las que cambian más al final


🎉 ¡Felicidades!

Ahora sabes:

  • ✅ Qué es un Dockerfile y cómo funciona

  • ✅ Las instrucciones principales (FROM, RUN, COPY, WORKDIR, CMD, ENTRYPOINT)

  • ✅ Cómo construir y ejecutar contenedores

  • ✅ Cómo gestionar contenedores e imágenes

  • ✅ Cómo acceder y depurar contenedores

  • ✅ Buenas prácticas para Dockerfiles

Comentarios

Entradas más populares de este blog

ejercicios-Crear Carpeta y Archivo de Texto en Ubuntu

Tutorial de Carpetas y Directorios en Ubuntu Linux

Claves SSH en Ubuntu Server - Guía Completa