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

Instalar Docker en Ubuntu Server usando docker.io

Tutorial de Carpetas y Directorios en Ubuntu Linux