Ejemplos de **Dockerfile**, **Comandos CLI** y **Docker Compose** para la vida diaria de un desarrollador.
El *Dockerfile* es la receta para construir la imagen. Este ejemplo crea una imagen simple basada en Node.js.
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.
El punto (`.`) indica que el Dockerfile se encuentra en el directorio actual.
docker build -t mi-app-web:latest .
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
Los comandos más utilizados para el desarrollo diario con Docker.
Muestra solo los contenedores que se están ejecutando.
docker ps
Añade la bandera `-a`.
docker ps -a
Detiene la ejecución del proceso principal.
docker stop [ID o NOMBRE]
Útil para depuración. Abre una terminal interactiva (`-it`).
docker exec -it [ID] /bin/bash
Muestra la salida de la consola del proceso.
docker logs -f [ID o NOMBRE]
Borra la imagen de tu sistema (debe estar sin contenedores que la usen).
docker rmi [ID o NOMBRE]
Docker Compose permite definir y ejecutar aplicaciones multi-contenedor (ej. una API y su base de datos) usando un único archivo YAML.
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.
Ejecuta todos los servicios definidos en el archivo en modo *detached* (`-d`).
docker compose up -d --build
Detiene los contenedores, elimina los contenedores y las redes (pero no los volúmenes por defecto).
docker compose down
Mantener su sistema limpio y liberar espacio es crucial cuando se trabaja con muchos contenedores e imágenes.
Elimina todos los contenedores que están detenidos (`exited`).
docker container prune
Elimina todas las imágenes que no están asociadas a ningún contenedor.
docker image prune -a
Elimina contenedores, redes, imágenes y, opcionalmente, volúmenes no utilizados. **Usar con precaución.**
docker system prune -a