Docker y Contenedores: Comandos Esenciales 🐳

Ejemplos de **Dockerfile**, **Comandos CLI** y **Docker Compose** para la vida diaria de un desarrollador.

📄 Ejemplo 1: Creación de un Dockerfile Básico

El *Dockerfile* es la receta para construir la imagen. Este ejemplo crea una imagen simple basada en Node.js.

Archivo: Dockerfile


# 1. Imagen base: usa una versión oficial ligera de Node
FROM node:18-alpine

# 2. Configurar el directorio de trabajo dentro del contenedor
WORKDIR /app

# 3. Copiar archivos de dependencia e instalar dependencias
COPY package*.json ./
RUN npm install

# 4. Copiar el resto del código de la aplicación
COPY . .

# 5. Exponer el puerto que usará la aplicación
EXPOSE 3000

# 6. Comando para iniciar la aplicación cuando se ejecute el contenedor
CMD [ "npm", "start" ]
            

Explicación: Cada instrucción (`FROM`, `RUN`, `CMD`) crea una **capa** en la imagen. `WORKDIR` define la carpeta activa. `EXPOSE` es solo documentación, no publica el puerto.

Comando para Construir la Imagen

El punto (`.`) indica que el Dockerfile se encuentra en el directorio actual.

docker build -t mi-app-web:latest .

Comando para Ejecutar la Imagen

Mapea el puerto 80 del host al puerto 3000 del contenedor y lo ejecuta en segundo plano (`-d`).

docker run -d -p 80:3000 mi-app-web:latest

🖥️ Ejemplo 2: Comandos de la Línea de Comandos (CLI)

Los comandos más utilizados para el desarrollo diario con Docker.

Ver Contenedores Activos

Muestra solo los contenedores que se están ejecutando.

docker ps

Ver TODOS los Contenedores (Activos e Inactivos)

Añade la bandera `-a`.

docker ps -a

Detener un Contenedor por ID/Nombre

Detiene la ejecución del proceso principal.

docker stop [ID o NOMBRE]

Ejecutar un Comando dentro del Contenedor

Útil para depuración. Abre una terminal interactiva (`-it`).

docker exec -it [ID] /bin/bash

Ver los Logs (Salida) del Contenedor

Muestra la salida de la consola del proceso.

docker logs -f [ID o NOMBRE]

Eliminar una Imagen

Borra la imagen de tu sistema (debe estar sin contenedores que la usen).

docker rmi [ID o NOMBRE]

🔗 Ejemplo 3: Orquestación con Docker Compose

Docker Compose permite definir y ejecutar aplicaciones multi-contenedor (ej. una API y su base de datos) usando un único archivo YAML.

Archivo: docker-compose.yml


version: '3.8' # Versión de la especificación Compose

services:
  # 1. Servicio de la API (Backend)
  api-web:
    build: . # Construir a partir del Dockerfile en el directorio actual
    ports:
      - "8080:80" # Host:Contenedor
    depends_on:
      - base-datos # Asegura que la DB inicie primero
    environment:
      # Pasar la cadena de conexión a la API
      - CONNECTION_STRING=Host=base-datos;Database=mi_db;User=postgres;Password=mypass

  # 2. Servicio de la Base de Datos (PostgreSQL)
  base-datos:
    image: postgres:14-alpine # Imagen oficial de Docker Hub
    environment:
      - POSTGRES_DB=mi_db
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=mypass
    volumes:
      # Persistencia de datos: guarda los datos en el host
      - db-data:/var/lib/postgresql/data 

# 3. Definición de volúmenes (para la persistencia)
volumes:
  db-data:
            

Explicación: Los servicios en Compose usan su nombre como **hostname** dentro de la red (ej. la API se conecta a `base-datos`). Los **`volumes`** aseguran que la información de la base de datos se mantenga incluso si el contenedor se destruye.

Comando para Levantar el Ambiente (Build y Run)

Ejecuta todos los servicios definidos en el archivo en modo *detached* (`-d`).

docker compose up -d --build

Comando para Detener y Eliminar el Ambiente

Detiene los contenedores, elimina los contenedores y las redes (pero no los volúmenes por defecto).

docker compose down

🧹 Ejemplo 4: Comandos de Limpieza y Mantenimiento

Mantener su sistema limpio y liberar espacio es crucial cuando se trabaja con muchos contenedores e imágenes.

Eliminar Contenedores Inactivos

Elimina todos los contenedores que están detenidos (`exited`).

docker container prune

Eliminar Imágenes No Utilizadas

Elimina todas las imágenes que no están asociadas a ningún contenedor.

docker image prune -a

Limpieza Total (Sistema)

Elimina contenedores, redes, imágenes y, opcionalmente, volúmenes no utilizados. **Usar con precaución.**

docker system prune -a