Docker: Comandos Básicos y Gestión de Contenedores - Guía Completa
Dominar los comandos de Docker es esencial para la gestión efectiva de contenedores en flujos de trabajo DevOps modernos. Esta guía completa cubre comandos esenciales de Docker, gestión del ciclo de vida de contenedores, ejemplos prácticos y mejores prácticas para gestionar aplicaciones contenedorizadas en entornos de producción.
Tabla de Contenidos
- Introducción
- Requisitos Previos
- Resumen de la Arquitectura de Docker
- Comandos Esenciales de Docker
- Gestión del Ciclo de Vida de Contenedores
- Trabajar con Imágenes Docker
- Inspección y Depuración de Contenedores
- Gestión de Recursos
- Conceptos Básicos de Redes
- Conceptos Básicos de Gestión de Volúmenes
- Mejores Prácticas de Producción
- Solución de Problemas
- Conclusión
Introducción
Los contenedores Docker proporcionan entornos ligeros y portátiles para ejecutar aplicaciones. Comprender la interfaz de línea de comandos (CLI) de Docker es fundamental para desarrolladores y administradores de sistemas que trabajan con aplicaciones contenedorizadas. Esta guía proporciona una referencia completa de comandos Docker, desde operaciones básicas hasta técnicas avanzadas de gestión de contenedores.
Lo Que Aprenderás
- Comandos esenciales de la CLI de Docker y su sintaxis
- Gestión del ciclo de vida de contenedores (crear, iniciar, detener, eliminar)
- Gestión de imágenes y operaciones con registros
- Técnicas de inspección y depuración de contenedores
- Limitación y monitoreo de recursos
- Mejores prácticas para entornos de producción
Requisitos Previos
Antes de proceder, asegúrate de tener:
- Docker Engine instalado (consulta la guía de Instalación de Docker)
- Conocimiento básico de línea de comandos de Linux
- Cuenta de usuario con permisos de Docker (miembro del grupo docker)
- Acceso a terminal en tu sistema Linux
Verifica la instalación de Docker:
docker --version
docker info
Resumen de la Arquitectura de Docker
Comprender la arquitectura de Docker te ayuda a usar los comandos de manera efectiva:
Componentes Clave
- Docker Daemon: Servicio en segundo plano que gestiona contenedores
- Docker Client: Herramienta CLI para enviar comandos al daemon
- Docker Images: Plantillas de solo lectura para crear contenedores
- Docker Containers: Instancias en ejecución de imágenes
- Docker Registry: Repositorio para almacenar y distribuir imágenes
Flujo de Trabajo Básico
Image (pulled from registry) → Container (running instance) → Modified Container → New Image (committed)
Comandos Esenciales de Docker
Obtener Ayuda
# Display Docker version
docker --version
# Show detailed version information
docker version
# Display system-wide information
docker info
# Get help for Docker commands
docker --help
# Get help for specific command
docker run --help
docker ps --help
Trabajar con Contenedores
Ejecutar Contenedores
# Run container from image
docker run nginx
# Run container in detached mode (background)
docker run -d nginx
# Run container with custom name
docker run --name my-nginx nginx
# Run interactive container with terminal
docker run -it ubuntu bash
# Run container with port mapping
docker run -d -p 8080:80 nginx
# Run container with multiple ports
docker run -d -p 8080:80 -p 8443:443 nginx
# Run container with environment variables
docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql
# Run container with volume mount
docker run -d -v /host/path:/container/path nginx
# Run container and remove after exit
docker run --rm ubuntu echo "Hello Docker"
Listar Contenedores
# List running containers
docker ps
# List all containers (including stopped)
docker ps -a
# List container IDs only
docker ps -q
# List containers with custom format
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
# List containers with size
docker ps -s
# Filter containers
docker ps --filter "status=running"
docker ps --filter "name=nginx"
Gestionar el Estado del Contenedor
# Start stopped container
docker start container_name
# Stop running container (sends SIGTERM)
docker stop container_name
# Stop container with timeout
docker stop -t 30 container_name
# Force stop container (sends SIGKILL)
docker kill container_name
# Restart container
docker restart container_name
# Pause container processes
docker pause container_name
# Unpause container
docker unpause container_name
Eliminar Contenedores
# Remove stopped container
docker rm container_name
# Force remove running container
docker rm -f container_name
# Remove multiple containers
docker rm container1 container2 container3
# Remove all stopped containers
docker container prune
# Remove all stopped containers (older syntax)
docker rm $(docker ps -aq -f status=exited)
Gestión del Ciclo de Vida de Contenedores
Ejemplo de Ciclo de Vida Completo
# 1. Pull image
docker pull nginx:latest
# 2. Create container without starting
docker create --name web-server -p 8080:80 nginx
# 3. Start the container
docker start web-server
# 4. View running containers
docker ps
# 5. Stop the container
docker stop web-server
# 6. Start it again
docker start web-server
# 7. Restart the container
docker restart web-server
# 8. Stop and remove
docker stop web-server
docker rm web-server
Crear Contenedores con Opciones Avanzadas
# Create container with resource limits
docker create \
--name app-server \
--memory="512m" \
--cpus="1.5" \
-p 3000:3000 \
-e NODE_ENV=production \
-v app-data:/app/data \
--restart unless-stopped \
node:16-alpine \
node server.js
# Start the created container
docker start app-server
Políticas de Reinicio de Contenedores
# No automatic restart (default)
docker run --restart no nginx
# Always restart
docker run --restart always nginx
# Restart on failure
docker run --restart on-failure nginx
# Restart on failure with max attempts
docker run --restart on-failure:5 nginx
# Restart unless stopped manually
docker run --restart unless-stopped nginx
Actualizar política de reinicio en contenedor existente:
docker update --restart unless-stopped container_name
Trabajar con Imágenes Docker
Listar Imágenes
# List all images
docker images
# List image IDs only
docker images -q
# Show image digests
docker images --digests
# Filter images
docker images --filter "dangling=true"
docker images --filter "reference=nginx:*"
Descargar Imágenes
# Pull latest version
docker pull ubuntu
# Pull specific version
docker pull ubuntu:20.04
# Pull from specific registry
docker pull ghcr.io/username/image:tag
# Pull all tags of an image
docker pull --all-tags ubuntu
Eliminar Imágenes
# Remove image
docker rmi nginx
# Remove image by ID
docker rmi abc123def456
# Force remove image
docker rmi -f nginx
# Remove all unused images
docker image prune
# Remove all images
docker rmi $(docker images -q)
# Remove dangling images
docker image prune -a
Etiquetar Imágenes
# Tag image with new name
docker tag nginx:latest my-nginx:v1.0
# Tag for registry
docker tag my-app:latest registry.example.com/my-app:latest
Buscar Imágenes
# Search Docker Hub
docker search nginx
# Limit search results
docker search --limit 5 nginx
# Filter by stars
docker search --filter stars=100 nginx
Inspección y Depuración de Contenedores
Ver Logs de Contenedores
# View container logs
docker logs container_name
# Follow logs in real-time
docker logs -f container_name
# Show last N lines
docker logs --tail 100 container_name
# Show logs with timestamps
docker logs -t container_name
# Show logs since specific time
docker logs --since 2024-01-01T00:00:00 container_name
docker logs --since 1h container_name
Inspeccionar Contenedores
# Show container details
docker inspect container_name
# Format output with Go template
docker inspect --format '{{.State.Status}}' container_name
# Get container IP address
docker inspect --format '{{.NetworkSettings.IPAddress}}' container_name
# Get container ports
docker inspect --format '{{.NetworkSettings.Ports}}' container_name
# Show multiple containers
docker inspect container1 container2
Ejecutar Comandos en Contenedores
# Execute command in running container
docker exec container_name ls -la
# Interactive shell access
docker exec -it container_name bash
docker exec -it container_name sh
# Execute as specific user
docker exec -u root container_name whoami
# Set working directory
docker exec -w /app container_name pwd
Acceder al Shell del Contenedor
# Start bash in running container
docker exec -it my-container bash
# Start sh if bash not available
docker exec -it my-container sh
# Attach to container's main process
docker attach container_name
Copiar Archivos
# Copy from container to host
docker cp container_name:/path/to/file.txt /host/path/
# Copy from host to container
docker cp /host/path/file.txt container_name:/path/to/
# Copy directory
docker cp container_name:/app/logs/ ./logs/
Monitorear Contenedores
# Display container resource usage
docker stats
# Stats for specific container
docker stats container_name
# Stats without streaming (one-time)
docker stats --no-stream
# Show all containers including stopped
docker stats --all
Ver Procesos del Contenedor
# Show running processes in container
docker top container_name
# Show processes with custom format
docker top container_name aux
Información de Mapeo de Puertos
# Show port mappings
docker port container_name
# Show specific port mapping
docker port container_name 80
Gestión de Recursos
Límites de CPU
# Limit to 1 CPU
docker run -d --cpus="1.0" nginx
# Limit to 1.5 CPUs
docker run -d --cpus="1.5" nginx
# CPU shares (relative weight)
docker run -d --cpu-shares=512 nginx
# Pin to specific CPUs
docker run -d --cpuset-cpus="0,1" nginx
Límites de Memoria
# Set memory limit
docker run -d --memory="512m" nginx
# Set memory with swap limit
docker run -d --memory="512m" --memory-swap="1g" nginx
# Disable swap
docker run -d --memory="512m" --memory-swap="512m" nginx
# Set memory reservation
docker run -d --memory-reservation="256m" nginx
Límites de Almacenamiento
# Set storage limit
docker run -d --storage-opt size=10G nginx
Actualizar Recursos del Contenedor
# Update running container memory
docker update --memory="1g" container_name
# Update CPU limits
docker update --cpus="2" container_name
# Update multiple containers
docker update --memory="512m" container1 container2
Conceptos Básicos de Redes
Listar Redes
# List all networks
docker network ls
# Inspect network
docker network inspect bridge
Crear Redes
# Create bridge network
docker network create my-network
# Create network with subnet
docker network create --subnet=172.18.0.0/16 my-network
Conectar Contenedores a Redes
# Run container on specific network
docker run -d --network my-network --name web nginx
# Connect running container to network
docker network connect my-network container_name
# Disconnect from network
docker network disconnect my-network container_name
DNS de Contenedores
# Containers on same network can communicate by name
docker network create app-net
docker run -d --network app-net --name db mysql
docker run -d --network app-net --name web nginx
# From web container:
docker exec web ping db
Conceptos Básicos de Gestión de Volúmenes
Crear Volúmenes
# Create named volume
docker volume create my-data
# List volumes
docker volume ls
# Inspect volume
docker volume inspect my-data
Usar Volúmenes con Contenedores
# Mount named volume
docker run -d -v my-data:/app/data nginx
# Mount host directory (bind mount)
docker run -d -v /host/path:/container/path nginx
# Read-only volume
docker run -d -v my-data:/app/data:ro nginx
# Mount with volume driver options
docker run -d -v my-data:/app/data:nocopy nginx
Eliminar Volúmenes
# Remove specific volume
docker volume rm my-data
# Remove unused volumes
docker volume prune
Mejores Prácticas de Producción
Convención de Nomenclatura de Contenedores
# Use meaningful names
docker run -d --name prod-web-01 nginx
docker run -d --name prod-db-primary mysql
# Include environment and function
docker run -d --name staging-api-gateway nginx
Verificaciones de Salud
# Run with health check
docker run -d \
--name web \
--health-cmd="curl -f http://localhost/ || exit 1" \
--health-interval=30s \
--health-timeout=3s \
--health-retries=3 \
nginx
# Check health status
docker inspect --format='{{.State.Health.Status}}' web
Mejores Prácticas de Logging
# Use json-file with limits
docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
# Use syslog
docker run -d \
--log-driver syslog \
--log-opt syslog-address=tcp://192.168.1.100:514 \
nginx
Prácticas de Seguridad
# Run as non-root user
docker run -d --user 1000:1000 nginx
# Read-only root filesystem
docker run -d --read-only --tmpfs /tmp nginx
# Drop capabilities
docker run -d --cap-drop ALL --cap-add NET_BIND_SERVICE nginx
# Set security options
docker run -d --security-opt="no-new-privileges:true" nginx
Límites de Recursos en Producción
# Production container with limits
docker run -d \
--name prod-app \
--memory="2g" \
--memory-reservation="1g" \
--cpus="2" \
--restart unless-stopped \
--log-opt max-size=10m \
--log-opt max-file=5 \
-p 80:8080 \
my-app:latest
Limpieza de Contenedores
# Remove stopped containers
docker container prune
# Remove unused images
docker image prune -a
# Remove unused volumes
docker volume prune
# Remove unused networks
docker network prune
# Remove everything unused
docker system prune -a --volumes
Etiquetar Contenedores para Organización
# Run with labels
docker run -d \
--label environment=production \
--label team=backend \
--label version=1.0 \
nginx
# Filter by label
docker ps --filter "label=environment=production"
Solución de Problemas
El Contenedor No Inicia
# Check logs for errors
docker logs container_name
# Inspect container configuration
docker inspect container_name
# Check if port is already in use
sudo netstat -tulpn | grep :8080
sudo lsof -i :8080
# Try running in foreground to see errors
docker run nginx
El Contenedor Sale Inmediatamente
# Check exit code
docker inspect --format='{{.State.ExitCode}}' container_name
# View logs
docker logs container_name
# Common exit codes:
# 0 - Successful exit
# 1 - Application error
# 137 - Container received SIGKILL (OOM or forced kill)
# 139 - Segmentation fault
# 143 - Container received SIGTERM
Alto Uso de Recursos
# Monitor resources
docker stats
# Check container processes
docker top container_name
# Inspect resource limits
docker inspect --format='{{.HostConfig.Memory}}' container_name
Problemas de Conectividad de Red
# Check container network
docker inspect --format='{{.NetworkSettings.Networks}}' container_name
# Get container IP
docker inspect --format='{{.NetworkSettings.IPAddress}}' container_name
# Test from another container
docker run --rm busybox ping container_name
# Check port mappings
docker port container_name
Problemas de Permisos
# Check container user
docker exec container_name whoami
# Check file permissions in container
docker exec container_name ls -la /path
# Run command as root
docker exec -u root container_name chown -R appuser:appuser /app
Depurar Contenedor Detenido
# Create container without starting
docker create --name debug nginx
# Start in debug mode
docker start -ai debug
# Or commit and inspect
docker commit container_name debug-image
docker run -it debug-image bash
Conclusión
Dominar los comandos de Docker es esencial para una gestión eficiente de contenedores. Esta guía cubrió operaciones fundamentales desde la gestión básica del ciclo de vida de contenedores hasta prácticas avanzadas de producción.
Conclusiones Clave
- Ciclo de Vida del Contenedor: Comprender operaciones de crear, iniciar, detener, reiniciar y eliminar
- Gestión de Imágenes: Descargar, listar, etiquetar y eliminar imágenes de manera eficiente
- Habilidades de Depuración: Usar logs, exec, inspect y stats para solución de problemas
- Control de Recursos: Establecer límites de CPU, memoria y almacenamiento para estabilidad
- Mejores Prácticas: Implementar convenciones de seguridad, logging y nomenclatura
- Listo para Producción: Usar verificaciones de salud, políticas de reinicio y limpieza adecuada
Tarjeta de Referencia Rápida
# Essential Commands
docker run -d --name app nginx # Run container
docker ps -a # List all containers
docker logs -f app # Follow logs
docker exec -it app bash # Access shell
docker stop app # Stop container
docker rm app # Remove container
docker images # List images
docker rmi image_name # Remove image
docker system prune -a # Clean up everything
# Container Management
docker start/stop/restart container # State management
docker pause/unpause container # Pause processes
docker update --memory 1g container # Update resources
docker inspect container # Detailed info
# Debugging
docker logs --tail 100 -f container # Recent logs
docker stats container # Resource usage
docker top container # Running processes
docker exec -it container sh # Interactive shell
Próximos Pasos
- Aprende Dockerfiles: Crea imágenes de contenedores personalizadas
- Explora Docker Compose: Gestiona aplicaciones multi-contenedor
- Estudia Redes: Profundiza en los modos de red de Docker
- Domina Volúmenes: Implementa estrategias de datos persistentes
- Endurecimiento de Seguridad: Aplica prácticas de seguridad avanzadas
- Orquestación: Avanza a Kubernetes para orquestación en producción
- Integración CI/CD: Automatiza construcción y despliegue de contenedores
Recursos Adicionales
- Referencia CLI de Docker: https://docs.docker.com/engine/reference/commandline/cli/
- Referencia de docker run: https://docs.docker.com/engine/reference/run/
- Mejores prácticas de Docker: https://docs.docker.com/develop/dev-best-practices/
Con estos comandos de Docker y mejores prácticas, estás bien equipado para gestionar contenedores de manera efectiva en entornos de desarrollo y producción. Practica estos comandos regularmente para desarrollar memoria muscular y confianza en las operaciones de contenedores.


