13 agosto, 2025

Comenzando con Dockers

Por JL Mota

¿Que es Docker?

Docker es una plataforma de virtualización a nivel de sistema operativo que permite crear, distribuir y ejecutar aplicaciones en contenedores. Un contenedor es una unidad estándar de software que empaqueta código y todas sus dependencias para que la aplicación se ejecute de manera rápida y confiable en diferentes entornos computacionales.

¿Por qué usar Docker?

Docker resuelve el problema clásico de “funciona en mi máquina” proporcionando:

  • Consistencia: Tu aplicación funciona igual en desarrollo, testing y producción
  • Portabilidad: Los contenedores corren en cualquier sistema que soporte Docker
  • Eficiencia: Los contenedores comparten el kernel del sistema operativo, usando menos recursos que las máquinas virtuales
  • Escalabilidad: Fácil replicación y distribución de aplicaciones
  • Aislamiento: Cada contenedor funciona de forma independient

Conceptos Fundamentales.

Imagen vs Contenedor

  • Imagen: Es una plantilla de solo lectura que contiene el código de la aplicación, bibliotecas, dependencias y otros archivos necesarios
  • Contenedor: Es una instancia ejecutable de una imagen. Puedes crear múltiples contenedores desde una misma imagen

Dockerfile

Un Dockerfile es un archivo de texto que contiene una serie de instrucciones para construir una imagen de Docker automáticamente.

Docker Hub

Es un registro en la nube donde puedes encontrar y compartir imágenes de Docker. Es como el “GitHub” de las imágenes Docker.

Instalación de Docker

En Windows

  1. Descarga Docker Desktop desde docker.com
  2. Ejecuta el instalador y sigue las instrucciones
  3. Reinicia tu computadora
  4. Ejecuta Docker Desktop

En macOS

  1. Descarga Docker Desktop para Mac
  2. Arrastra Docker.app a tu carpeta Applications
  3. Ejecuta Docker desde Applications

En Linux (Ubuntu/Debian)

# Actualizar paquetes existentes
sudo apt update

# Instalar paquetes necesarios
sudo apt install apt-transport-https ca-certificates curl software-properties-common

# Agregar clave GPG de Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# Agregar repositorio de Docker
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

# Instalar Docker
sudo apt update
sudo apt install docker-ce

# Verificar instalación
sudo systemctl status docker

Verificar la Instalación

docker --version
docker run hello-world

Primeros Pasos con Docker

Comando Básicos

Ver imágenes disponibles localmente

docker images

Descargar una imagen

docker pull ubuntu
docker pull nginx

Ejecutar un contenedor

# Ejecutar contenedor interactivo
docker run -it ubuntu bash

# Ejecutar contenedor en segundo plano
docker run -d nginx

# Ejecutar con puerto expuesto
docker run -d -p 8080:80 nginx

Ver contenedores en ejecución

# Parar contenedor
docker stop <container_id>

# Eliminar contenedor
docker rm <container_id>

# Eliminar imagen
docker rmi <image_name>

Para tener en cuenta

Cuando se ejecuta un contenedor y la imagen no se encuentra descargada o almacenada de manera local, Docker usara Internet para descargarla imagen primero y después crear el contenedor, una vez hecho esto Docker nos permitirá almacenar la imagen en nuestra computadora para futuros contenedores, es decir una vez descargada la imagen ya no será necesario volver a Internet para descargarla, estará disponible en nuestro repositorio local.

Cuando se crea un contenedor y esta detenido, no es necesario dar RUN al Docker ya que esto nos creara otro contenedor a partir de la imagen, es mejor utilizar el comando docker start para inicializar el contenedor.

Les dejo esta guía básica de comandos Docker, ojo, no son todos pero puede ayudarlos en el camino para alguien que apenas se adentra en este mundo.

Guía de Comandos Básicos de Docker

📋 Información del Sistema

Verificar instalación y versión

docker --version                # Versión de Docker
docker version                  # Información detallada
docker info                     # Información del sistema Docker

Estado del sistema

docker system df               # Uso de espacio en disco
docker system prune            # Limpiar recursos no utilizados
docker system prune -a         # Limpiar TODO (imágenes, contenedores, redes, etc.)

🖼️ Gestión de Imágenes

Ver imágenes

docker images                         # Listar todas las imágenes locales
docker images -a                      # Incluir imágenes intermedias
docker images --filter dangling=true  # Solo imágenes huérfanas

Descargar imágenes

docker pull ubuntu             # Descargar imagen (última versión)
docker pull ubuntu:20.04       # Descargar versión específica
docker pull nginx:alpine       # Descargar variante específica

Construir imágenes

docker build .                 # Construir desde Dockerfile en directorio actual
docker build -t mi-app .       # Construir con nombre/tag
docker build -t mi-app:v1.0 .  # Construir con tag específico
docker build -f Dockerfile.prod .  # Usar Dockerfile específico

Eliminar imágenes

docker rmi imagen_id           # Eliminar imagen por ID
docker rmi mi-app:v1.0         # Eliminar imagen por nombre:tag
docker rmi $(docker images -q) # Eliminar todas las imágenes
docker image prune             # Eliminar imágenes no utilizadas
docker image prune -a          # Eliminar TODAS las imágenes sin usar

Inspeccionar imágenes

docker inspect imagen_id       # Ver detalles de una imagen
docker history imagen_id       # Ver historial de capas

📦 Gestión de Contenedores

Crear y ejecutar contenedores

# Ejecutar contenedor básico
docker run ubuntu                        # Ejecutar y salir inmediatamente
docker run -it ubuntu bash               # Ejecutar interactivo con terminal

# Ejecutar en segundo plano
docker run -d nginx                       # Ejecutar en background (detached)
docker run -d --name mi-nginx nginx       # Ejecutar con nombre personalizado

# Mapeo de puertos
docker run -d -p 8080:80 nginx            # Puerto local 8080 -> puerto contenedor 80
docker run -d -p 127.0.0.1:8080:80 nginx  # Bind a IP específica

# Variables de entorno
docker run -e ENV_VAR=valor ubuntu
docker run --env-file .env ubuntu         # Cargar desde archivo

# Volúmenes y montajes
docker run -v /host/path:/container/path ubuntu            # Bind mount
docker run -v mi-volumen:/container/path ubuntu            # Named volume
docker run --mount type=bind,source=/host,target=/container ubuntu

Ver contenedores

docker ps                      # Contenedores en ejecución
docker ps -a                   # Todos los contenedores
docker ps -l                   # Último contenedor creado
docker ps -q                   # Solo IDs de contenedores activos
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"  # Formato personalizado

Controlar contenedores

docker start contenedor_id     # Iniciar contenedor parado
docker stop contenedor_id      # Parar contenedor (SIGTERM)
docker kill contenedor_id      # Matar contenedor (SIGKILL)
docker restart contenedor_id   # Reiniciar contenedor
docker pause contenedor_id     # Pausar contenedor
docker unpause contenedor_id   # Reanudar contenedor pausado

Interactuar con contenedores

docker exec -it contenedor_id bash     # Ejecutar comando en contenedor activo
docker exec contenedor_id ls -la       # Ejecutar comando sin interacción
docker attach contenedor_id            # Conectar a contenedor (Ctrl+P+Q para salir)
docker cp archivo.txt contenedor_id:/path/  # Copiar archivo al contenedor
docker cp contenedor_id:/path/archivo.txt .  # Copiar archivo del contenedor

Logs y monitoreo

docker logs contenedor_id                   # Ver logs del contenedor
docker logs -f contenedor_id                # Seguir logs en tiempo real
docker logs --tail 50 contenedor_id         # Últimas 50 líneas
docker logs --since 2h contenedor_id        # Logs de las últimas 2 horas
docker stats                                # Estadísticas de uso en tiempo real
docker stats contenedor_id                  # Stats de contenedor específico
docker top contenedor_id                    # Procesos ejecutándose en el contenedor

Eliminar contenedores

docker rm contenedor_id        # Eliminar contenedor parado
docker rm -f contenedor_id     # Forzar eliminación (contenedor activo)
docker rm $(docker ps -aq)     # Eliminar todos los contenedores parados
docker container prune         # Eliminar todos los contenedores parados

Inspeccionar contenedores

docker inspect contenedor_id   # Información detallada
docker port contenedor_id      # Ver mapeo de puertos
docker diff contenedor_id      # Ver cambios en el filesystem

🗄️ Gestión de Volúmenes

Crear y listar volúmenes

docker volume create mi-volumen    # Crear volumen
docker volume ls                   # Listar volúmenes
docker volume inspect mi-volumen   # Inspeccionar volumen

Usar volúmenes

docker run -v mi-volumen:/data ubuntu      # Montar volumen nombrado
docker run -v $(pwd):/app ubuntu          # Montar directorio actual
docker run --mount source=mi-volumen,target=/data ubuntu  # Sintaxis mount

Eliminar volúmenes

docker volume rm mi-volumen        # Eliminar volumen específico
docker volume prune                # Eliminar volúmenes no utilizados

🌐 Gestión de Redes

Listar y crear redes

docker network ls                  # Listar redes
docker network create mi-red       # Crear red personalizada
docker network create --driver bridge mi-red-bridge  # Red con driver específico

Conectar contenedores a redes

docker run --network mi-red ubuntu         # Ejecutar en red específica
docker network connect mi-red contenedor_id    # Conectar contenedor a red
docker network disconnect mi-red contenedor_id  # Desconectar de red

Inspeccionar y eliminar redes

docker network inspect mi-red      # Ver detalles de la red
docker network rm mi-red           # Eliminar red
docker network prune               # Eliminar redes no utilizadas

🐙 Docker Hub y Registries

Autenticación

docker login                       # Login en Docker Hub
docker login registry.example.com  # Login en registry privado
docker logout                      # Logout

Push y Pull

docker tag mi-app usuario/mi-app:v1.0     # Etiquetar para push
docker push usuario/mi-app:v1.0           # Subir imagen
docker pull usuario/mi-app:v1.0           # Descargar imagen
docker search nginx                       # Buscar imágenes en Docker Hub

🔧 Docker Compose (Comandos Básicos)

Gestión de servicios

docker-compose up                  # Levantar servicios
docker-compose up -d               # Levantar en background
docker-compose down                # Parar y eliminar servicios
docker-compose start               # Iniciar servicios existentes
docker-compose stop                # Parar servicios
docker-compose restart             # Reiniciar servicios

Información y logs

docker-compose ps                  # Ver estado de servicios
docker-compose logs                # Ver logs de todos los servicios
docker-compose logs servicio       # Logs de servicio específico
docker-compose logs -f             # Seguir logs en tiempo real

Construcción y actualización

docker-compose build              # Construir servicios
docker-compose up --build         # Reconstruir y levantar
docker-compose pull               # Actualizar imágenes

🧹 Comandos de Limpieza

Limpieza general

docker system prune               # Limpiar contenedores parados, redes y imágenes huérfanas
docker system prune -a            # Limpiar TODO (¡CUIDADO!)
docker system prune --volumes     # Incluir volúmenes en la limpieza

Limpieza específica

docker container prune            # Solo contenedores parados
docker image prune                # Solo imágenes huérfanas
docker image prune -a             # Todas las imágenes sin usar
docker volume prune               # Solo volúmenes no utilizados
docker network prune              # Solo redes no utilizadas

💡 Tips y Atajos Útiles

Comandos combinados útiles

# Parar todos los contenedores
docker stop $(docker ps -q)

# Eliminar todos los contenedores
docker rm $(docker ps -aq)

# Eliminar todas las imágenes
docker rmi $(docker images -q)

# Ver solo nombres de contenedores activos
docker ps --format "table {{.Names}}"

# Ejecutar y eliminar contenedor automáticamente
docker run --rm -it ubuntu bash

# Ver IPs de contenedores activos
docker ps -q | xargs docker inspect --format '{{ .Name }} - {{ .NetworkSettings.IPAddress }}'

Variables de entorno útiles

export DOCKER_BUILDKIT=1          # Habilitar BuildKit
export COMPOSE_PROJECT_NAME=mi-proyecto  # Nombre por defecto para compose

🔍 Comandos de Diagnóstico

docker version                     # Verificar cliente y servidor
docker info                       # Información completa del sistema
docker events                     # Ver eventos en tiempo real
docker system df                  # Uso de espacio
docker stats --no-stream          # Estadísticas actuales (sin stream)

Suerte en su camino con Dockers y ojala esto les ayude. Seguiré publicando mas información en un pequeño espacio que tenga. Saludos.